公网 FRPS 暴露的端口不是 80/443,而内网本地服务仍然是 80/443 时,FRPS链路图

社区话题 Linux/macOS 与自动化运维 FRP 与 NPS 穿透技术深度解析:通信端口、流量链路与最佳实践 公网 FRPS 暴露的端口不是 80/443,而内网本地服务仍然是 80/443 时,FRPS链路图

#815

追光
管理员

当 公网 FRPS 暴露的端口不是 80/443,而内网本地服务仍然是 80/443 时,链路依然是通过 FRPS 的 remote_port 或 vhost_http_port 进行入口 → 隧道转发 → FRPC 转发到本地端口。
跳转不是“HTTP 重定向”,而是 FRP 隧道层转发。而为了去掉端口号,我们一般都用nginx做反向代理,链路如下:

用户 → 公网Nginx (80/443) → 反代到 FRPS (8080) → 隧道 → FRPC → 内网服务 (80/443)

这种情况下,链路多了一层 公网 Nginx 反向代理,它的作用是 接管标准端口 80/443,让用户无感知地访问网站


完整流量链路(详细)

[ 用户浏览器 ]
   │
   │  TCP:80 (HTTP 请求) 或 TCP:443 (HTTPS 请求)
   ▼
[ 公网 Nginx ]
   │
   │  (反代到 FRPS 8080)
   │  proxy_pass http://127.0.0.1:8080;
   ▼
[ FRPS ]
   │
   │  (通过 bind_port = 7000 隧道发送给 FRPC)
   │
   ▼
[ FRPC ]
   │
   │  (转发到内网服务 127.0.0.1:80)
   ▼
[ Nginx 内网服务 ]

从用户角度:访问域名不带端口(80/443),但实际上 FRPS 监听的是 8080,通过反代隐藏了端口差异。


这个链路的特点

  • 公网 80/443 由外部 Nginx 接管,你可以加:

    • SSL(HTTPS 证书)

    • WAF(安全防护)

    • HTTP/2、缓存

  • FRPS 无需直接占用 80/443,避免与其他服务冲突。

  • FRP 仍然用隧道传输(控制通道 bind_port),公网 Nginx 只是入口代理。


配置要点

公网 Nginx 反代配置

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

FRPS 配置

[common]
bind_port = 7000
vhost_http_port = 8080

FRPC 配置

[common]
server_addr = x.x.x.x
server_port = 7000

[web]
type = http
local_port = 80
custom_domains = example.com


链路性能注意点

  • 额外一层 Nginx 反代会增加 一次 TCP 握手,但性能损耗非常低。

  • 如果使用 HTTPS,建议 SSL 终止在公网 Nginx,FRPS 和 FRPC 之间走纯 HTTP,减少加解密负担。

  • 可以开启 Nginx 的 gzip + 缓存,减少带宽压力。