外网访问本地服务器的本地服务流量路径
本文所有ip地址和域名均为举例。
设备和端口总结 (按流量顺序):
用户电脑/手机浏览器 (源): 发起 HTTP 请求 (源端口随机,目标端口 80)
互联网 (传输媒介): HTTP 请求传输
云服务器公网 IP (187.34.46.62:80) (入口): 接收 HTTP 请求 TCP 连接,直接转发 TCP 数据流
互联网 (FRP 连接通道,端口 7000): HTTP 请求 TCP 数据流通过 FRP 隧道传输
Frpc 客户端 (本地服务器,端口 7000): 接收 FRP 转发的 80 端口数据流,重新建立 TCP 连接转发
本地服务器 OpenResty (端口 80): 接收 HTTP 请求,返回 HTTP 重定向响应 (301/302) (源端口 80,目标端口 Frpc 客户端)
互联网 (传输媒介): HTTP 重定向响应传输
用户电脑/手机浏览器 (接收重定向): 接收 HTTP 重定向响应,自动发起 HTTPS 请求 (源端口随机,目标端口 443)
互联网 (传输媒介): HTTPS 请求传输
云服务器公网 IP (187.34.46.62:443) (入口): 接收 HTTPS 请求 TCP 连接,直接转发 TCP 数据流
互联网 (FRP 连接通道,端口 7000): HTTPS 请求 TCP 数据流通过 FRP 隧道传输
Frpc 客户端 (本地服务器,端口 7000): 接收 FRP 转发的 443 端口数据流,重新建立 TCP 连接转发
本地服务器 OpenResty (端口 443): 接收 HTTPS 请求,SSL 终止,反向代理到 127.0.0.1:10086
本地服务 (127.0.0.1:10086): 接收反向代理的 HTTP 请求,处理并返回 HTTP 响应 (源端口 10086,目标端口 OpenResty)
本地服务器 OpenResty (端口 443): 接收 HTTP 响应,封装为 HTTPS 响应
HTTPS 响应原路返回: Frpc 客户端 → Frps 服务端 → 用户浏览器 (端口 7000 隧道,端口 443 返回)
关键理解:
云服务器 Frps 更多是作为 TCP 端口转发的角色: 在这种配置下,云服务器的 Frps 服务端更多扮演的是一个 纯粹的 TCP 端口转发 角色,将 80 和 443 端口接收到的 TCP 连接数据,通过 FRP 隧道转发给 Frpc 客户端,自身不进行 HTTP/HTTPS 协议解析或处理。
vhost_http_port
和vhost_https_port
配置可能主要影响 frps 服务自身的功能,而不是直接参与到这个流量路径中。本地 OpenResty 完成 HTTP->HTTPS 跳转和 SSL 终止: HTTP 到 HTTPS 的跳转 和 SSL 证书的处理,以及反向代理,全部都在本地服务器的 OpenResty 上完成。 这是与之前分析的最大区别。
Frpc 客户端作为本地端口映射: Frpc 客户端接收到来自 Frps 服务端的数据流后,根据配置,将数据流转发到本地 OpenResty 监听的 80 和 443 端口。
总结:
流量路径是一个 两段式的 TCP 端口转发 + 本地 HTTPS 处理 架构:
第一段 TCP 端口转发 (云服务器 Frps): 云服务器 Frps 将公网 80 和 443 端口的 TCP 连接,通过 FRP 隧道转发到内网 Frpc 客户端。
第二段 HTTPS 处理 (本地 OpenResty): 本地 Frpc 客户端将接收到的 TCP 数据转发给本地 OpenResty,由 OpenResty 负责 HTTP->HTTPS 跳转、SSL 终止、反向代理到本地服务 10086,以及返回 HTTPS 响应。
用户端: 你的电脑或手机浏览器
DNS 解析:
abc.com
指向你的云服务器的公网 IP (例如:187.34.46.62)云服务器 (frps 服务端): 公网 IP 187.34.46.62,运行 frps 服务,
frps.ini
中vhost_http_port = 8090
,vhost_https_port = 443
(这些配置现在更多是为 frps 服务自身定义的,而不是直接处理 80/443 端口的 HTTP/HTTPS 请求)本地服务器 (frpc 客户端): 内网环境,运行 frpc 服务,
frpc.toml
中配置 web-https(自定义的代理名称)代理 (type=https, localPort=443, customDomains=abc.com
) 和 web (自定义的代理名称)代理 (type=http, localPort=80, customDomains=abc.com
)。 本地服务器上运行 1Panel + OpenResty,OpenResty 监听 80 和 443 端口,配置了 HTTP 强制 HTTPS 跳转,SSL 证书,以及反向代理到本地服务(例如 127.0.0.1:10086)。 本地服务实际监听 127.0.0.1:10086。
——————————————————————————————————————————————————————————————
流量步骤分解:
用户浏览器发起 HTTP 请求 (端口 80):
当你输入
abc.com
,浏览器 DNS 解析到云服务器公网 IP (187.34.46.62)。浏览器向 187.34.46.62 的 80 端口 发送 HTTP 请求。
流量路径: 你的电脑/手机浏览器 → 互联网 → 云服务器公网 IP (187.34.46.62:80)
云服务器 (Frps 服务端) 接收 HTTP 请求 (端口 80):
云服务器 (187.34.46.62) 的 80 端口 接收到 HTTP 请求。
关键点: 在这种配置下,云服务器的 frps 服务本身 并没有直接监听 80 端口来处理 HTTP 虚拟主机。 它只是简单地 将 80 端口接收到的 TCP 连接数据,通过 FRP 连接通道转发出去,而 不进行任何 HTTP 协议解析或处理。
vhost_http_port = 8090
在这里 不直接参与 80 端口 HTTP 请求的处理。更准确的理解: 云服务器的 80 端口接收到 TCP 连接请求后,直接将这个 TCP 连接的数据流 (原始 HTTP 请求数据) 通过 FRP 连接通道转发给 Frpc 客户端。
Frps 服务端通过 FRP 连接将 HTTP 请求数据转发给 Frpc 客户端 (端口 7000 隧道,但传输的是 80 端口的数据):
frps 服务端通过 FRP 连接 (端口 7000) 将 80 端口接收到的原始 TCP 数据流 (HTTP 请求数据) 转发给 Frpc 客户端。
流量路径 (通过 FRP 隧道,但携带 80 端口数据): Frps 服务端 (云服务器) → 互联网 (FRP 连接通道) → Frpc 客户端 (本地服务器,端口仍然是 FRP 连接端口 7000,但隧道内传输的是 80 端口的请求数据)
Frpc 客户端接收到 80 端口的 HTTP 请求数据,转发给本地 OpenResty (端口 80):
Frpc 客户端接收到来自 frps 服务端转发的 80 端口的原始 TCP 数据流 (HTTP 请求数据)。
根据
frpc.toml
中 web 代理的配置 (type = "http"
,localPort = 80
,customDomains = "abc.com"
), Frpc 客户端将 接收到的 80 端口数据流,重新建立 TCP 连接,转发给本地服务器的 127.0.0.1 的 80 端口。流量路径 (本地网络): Frpc 客户端 (本地服务器) → 本地服务器内部 OpenResty (监听 80 端口)
本地 OpenResty (端口 80) 接收 HTTP 请求,进行 HTTP 强制 HTTPS 跳转:
本地服务器的 OpenResty (监听 80 端口) 接收到来自 Frpc 客户端转发的 HTTP 请求。
OpenResty 根据配置,检测到是 HTTP 请求,并且配置了 HTTP 强制跳转 HTTPS 的规则。
OpenResty 返回一个 HTTP 状态码 301 或 302 (重定向) 的响应,指示浏览器 "请使用 HTTPS 访问
https://abc.com
"。流量路径 (此时仍然是 HTTP): 本地服务器 OpenResty (80 端口) → 返回 HTTP 重定向响应 (301/302) 给 Frpc 客户端 → Frpc 客户端 → Frps 服务端 → 互联网 → 你的电脑/手机浏览器
用户浏览器接收到 HTTP 重定向响应,自动发起 HTTPS 请求 (端口 443):
浏览器接收到 HTTP 重定向响应,自动发起新的请求,这次是
https://abc.com
。浏览器向 187.34.46.62 的 443 端口 发送 HTTPS 请求。
流量路径 (变为 HTTPS): 你的电脑/手机浏览器 → 互联网 → 云服务器公网 IP (187.34.46.62:443)
云服务器 (Frps 服务端) 接收 HTTPS 请求 (端口 443):
云服务器 (187.34.46.62) 的 443 端口 接收到 HTTPS 请求。
同样,云服务器的 frps 服务可能只是 将 443 端口接收到的 TCP 连接数据,通过 FRP 连接通道转发出去,不进行 HTTPS 协议解析。
vhost_https_port = 443
更多是定义 frps 服务端 如何处理 frps 自身 需要处理的 HTTPS 虚拟主机请求 (如果你配置了type = "https"
的 Proxy,并且服务端需要根据域名来路由)。 但在这种纯转发场景下,可能只是作为一个监听端口。更准确的理解: 云服务器 443 端口接收到 TCP 连接请求后,直接将 TCP 数据流 (HTTPS 请求数据) 通过 FRP 连接通道转发给 Frpc 客户端。
Frps 服务端通过 FRP 连接将 HTTPS 请求数据转发给 Frpc 客户端 (端口 7000 隧道,但传输的是 443 端口的数据):
frps 服务端通过 FRP 连接 (端口 7000) 将 443 端口接收到的原始 TCP 数据流 (HTTPS 请求数据) 转发给 Frpc 客户端。
流量路径 (通过 FRP 隧道,携带 443 端口数据): Frps 服务端 (云服务器) → 互联网 (FRP 连接通道) → Frpc 客户端 (本地服务器,端口 7000,但隧道内传输 443 端口数据)
Frpc 客户端接收到 443 端口的 HTTPS 请求数据,转发给本地 OpenResty (端口 443):
Frpc 客户端接收到来自 frps 服务端转发的 443 端口的原始 TCP 数据流 (HTTPS 请求数据)。
根据
frpc.toml
中 web-https 代理的配置 (type = "https"
,localPort = 443
,customDomains = "abc.com"
), Frpc 客户端将 接收到的 443 端口数据流,重新建立 TCP 连接,转发给本地服务器的 127.0.0.1 的 443 端口。流量路径 (本地网络): Frpc 客户端 (本地服务器) → 本地服务器内部 OpenResty (监听 443 端口)
本地 OpenResty (端口 443) 接收 HTTPS 请求,进行 SSL 终止和反向代理:
本地服务器的 OpenResty (监听 443 端口) 接收到来自 Frpc 客户端转发的 HTTPS 请求。
OpenResty 进行 SSL 终止,使用配置的 SSL 证书解密 HTTPS 连接,获得原始的 HTTP 请求。
OpenResty 根据域名和配置,将解密后的 HTTP 请求 反向代理 到 本地服务 127.0.0.1:10086。
流量路径 (本地服务器内部): 本地服务器 OpenResty (443 端口,SSL 终止) → 反向代理到 本地服务 (127.0.0.1:10086)
本地服务 (127.0.0.1:10086) 处理请求,返回 HTTP 响应 (端口 10086):
本地服务 (运行在 127.0.0.1:10086) 接收到来自 OpenResty 反向代理的 HTTP 请求。
本地服务处理请求,生成 HTTP 响应,并通过 10086 端口 返回给 OpenResty。
流量路径 (本地服务器内部): 本地服务 (127.0.0.1:10086) → 返回 HTTP 响应给 OpenResty
HTTPS 响应原路返回: OpenResty (443) → Frpc 客户端 → Frps 服务端 → 用户浏览器 (端口 7000 隧道,端口 443 返回):
OpenResty 接收到来自本地服务 10086 的 HTTP 响应。
OpenResty 将 HTTP 响应 重新封装成 HTTPS 响应 (使用 SSL 证书加密)。
HTTPS 响应会按照 反方向 原路返回:
本地服务器 OpenResty (443 端口,SSL 加密) → Frpc 客户端
Frpc 客户端 → Frps 服务端 (通过 FRP 端口 7000 隧道)
Frps 服务端 → 互联网 → 你的电脑/手机浏览器 (通过 443 端口返回 HTTPS 响应)
流量路径 (反向,最终返回 HTTPS 响应): 本地服务器 OpenResty (443端口) → Frpc 客户端 → Frps 服务端 → 互联网 → 你的电脑/手机浏览器 (最终浏览器收到 HTTPS 响应,显示
https://abc.com
)
- 感谢你赐予我前进的力量