✅ FRPS 在http和tcp模式下 Nginx 获取客户端真实 IP 的配置对比总结
› 社区话题 › Linux/macOS 与自动化运维 › ✅ FRPS 在http和tcp模式下 Nginx 获取客户端真实 IP 的配置对比总结
标签: frp穿透

- 作者帖子
- 2025年9月14日 - 下午5:32 #1103
追光管理员在使用 frps(Fast Reverse Proxy Server) 作为内网穿透服务时,根据其转发协议类型的不同(HTTP/HTTPS 模式 vs TCP/V2 协议模式),Nginx 服务器获取客户端真实 IP 的方式存在本质区别。以下是两种模式的配置原理与差异总结:
? 1. HTTP/HTTPS 模式:通过 X-Forwarded-For 头传递真实 IP
工作原理:
frps 在 HTTP/HTTPS 模式下,会自动在请求头中插入标准的 X-Forwarded-For 字段,包含原始客户端的 IP 地址。该行为符合 HTTP 反向代理的通用规范。
Nginx 配置要求:listen 80; listen 443 ssl http2;< #告诉 Nginx 接受来自任意地址的代理请求(通常为 frps 本地地址) setrealipfrom 0.0.0.0/0; #指定真实 IP 存在于 X-Forwarded-For 头中 realipheader X-Forwarded-For; #启用递归解析(处理多层代理链) realiprecursive on;
关键特点:
无需特殊协议支持,仅依赖 HTTP 头字段。
若未配置上述参数,Nginx 仍可正常响应页面,但日志和后端程序获取到的是 frps 所在服务器的 IP,而非最终用户真实 IP。
适用于 Web 应用、API、静态资源等基于 HTTP 的场景。? 2. TCP/V2 协议模式:通过 Proxy Protocol 传递真实 IP
工作原理:
在 TCP 模式(或启用 V2 协议)下,frps 使用 Proxy Protocol(由 HAProxy 提出的标准协议)在 TCP 连接建立之初,以二进制格式封装原始客户端的 IP 和端口信息,并附加在 TCP 流的最前面。此机制不依赖 HTTP 层,因此适用于非 HTTP 协议(如 MySQL、SSH、自定义 TCP 服务等)。
Nginx 配置要求:
listen 80 proxyprotocol; listen 443 ssl http2 proxyprotocol; 告诉 Nginx 接受来自任意地址的 Proxy Protocol 请求 setrealipfrom 0.0.0.0/0; 指定真实 IP 来源于 Proxy Protocol 协议头 realipheader proxyprotocol;
(可选)若需记录原始端口,可配合 $proxyprotocoladdr 使用
关键特点:
在v2协议下传输ip头必须开启 proxyprotocol,否则 Nginx 无法正确解析数据流,会导致连接失败或超时(即“不设置就打不开网站”)。
由于 Proxy Protocol 是二进制前置头,Nginx 必须明确声明监听时启用它,否则会将该头部误认为是 HTTP 请求内容,从而报错(如 400 Bad Request 或直接断开连接)。
仅适用于 TCP 转发场景,不能用于纯 HTTP 模式(HTTP 模式下不应加 proxyprotocol,否则也会导致错误)。? 总结对比表
| 对比项 | HTTP/HTTPS 模式 | TCP/V2 协议模式 |
| IP 传递方式 | HTTP Header:X-Forwarded-For | 二进制协议:Proxy Protocol |
| 是否必须配置 | ❌ 可不配(仅丢失真实IP) | ✅ 必须配(否则连接失败) |
| Nginx 监听指令 | listen 80; | listen 80 proxyprotocol; |
| realipheader 设置 | X-Forwarded-For | proxyprotocol |
| 适用协议 | HTTP、HTTPS | TCP、UDP、SSH、MySQL 等任意 TCP 服务 |
| 错误表现 | 日志显示 frps IP,功能正常 | 连接超时、400 错误、页面打不开 |
| 推荐场景 | Web 网站、API、前端应用 | 数据库穿透、远程桌面、游戏服务器、私有 TCP 服务 |⚠️ 注意事项
切勿混用:HTTP 模式下不要加 proxyprotocol,TCP 模式下不要用 X-Forwarded-For,否则会导致 Nginx 解析异常。
安全建议:setrealipfrom 0.0.0.0/0 仅在 frps 与 Nginx 部署在同一可信网络(如内网)时可用。生产环境应限制为 frps 的固定内网 IP,例如 setrealipfrom 192.168.1.100;。验证方法:可在 Nginx 日志中添加 $remoteaddr 和 $proxyprotocoladdr 字段,确认是否成功获取真实 IP。
✅ 最佳实践建议
“HTTP 用头,TCP 用协议”
根据 frps 的转发模式选择对应的 Nginx 配置方式,二者互斥,不可混淆。合理配置后,即可在任何穿透场景下准确获取客户端真实访问 IP,保障日志审计、访问控制、防刷限流等功能的完整性。
- 2025年9月14日 - 下午5:40 #1111
追光管理员✅ 补充:NPS 的 HTTP/HTTPS 模式下 Nginx 获取客户端真实 IP 的配置
在使用 NPS(Netty Proxy Server) 作为内网穿透工具时,其 HTTP 和 HTTPS 模式 与 frps 类似,会自动在转发的 HTTP 请求中插入标准的代理头字段,以携带原始客户端的真实 IP 地址。Nginx 只需正确解析这些头部信息,即可获取真实访问者 IP。
? 配置方式(NPS → Nginx)
nginx
server { listen 80; listen 443 ssl http2;
=== 启用真实 IP 解析 ===
告诉 Nginx 接受来自任意地址的代理请求(建议替换为 NPS 实际 IP)
setrealipfrom 0.0.0.0/0; 生产环境请改为 NPS 服务器的内网 IP,如:192.168.1.100;指定真实 IP 存在于 X-Forwarded-For 头中 NPS 默认添加此字段
realipheader X-Forwarded-For;启用递归解析(支持多层代理链,如 NPS → CDN → Nginx)
realiprecursive on;=== 其他常规配置(示例)===
servername example.com;
root /var/www/html;
index index.html;location / {
tryfiles $uri $uri/ =404;
}
}✅ 结论:
NPS 与 frps 在 HTTP/HTTPS 模式下的真实 IP 传递机制完全一致,均通过 X-Forwarded-For 头实现,Nginx 配置方式无需区分,通用配置即可兼容。⚠️ 重要提醒:不要与 TCP/V2 模式混淆!
NPS 的 TCP 模式(启用 V2 协议) 使用的是 Proxy Protocol,此时必须配置:
nginxlisten 80 proxyprotocol; realipheader proxyprotocol;
但 HTTP/HTTPS 模式 ≠ TCP 模式!
如果你在 HTTP 模式下错误地加了 proxyprotocol,会导致 Nginx 报错:
invalid parameter \”proxyprotocol\” 或 400 Bad Request
反之,TCP 模式下若用 X-Forwarded-For,则无法获取 IP,因为 TCP 层没有 HTTP 头。?️ 安全加固建议(生产环境必做)
nginx
示例:只信任 NPS 内网 IP(推荐)setrealipfrom 192.168.10.50; NPS 服务器内网 IP setrealipfrom 172.16.0.0/12; 可选:私有网络段 realipheader X-Forwarded-For; realiprecursive on;
✅ 为什么重要?
若允许 0.0.0.0/0,攻击者可通过伪造 X-Forwarded-For: 1.2.3.4 绕过 IP 黑名单、CC 防护、地域限制等机制。必须只信任你控制的 NPS 服务器。这样可在日志中清晰看到:
$realipremoteaddr → 经 Nginx 解析后的最终真实 IP
$httpxforwardedfor → 原始头内容(可用于调试)✅ 一句话总结:
NPS 的 HTTP/HTTPS 模式使用标准的 X-Forwarded-For 头传递真实 IP,Nginx 配置方式与 frps 完全相同只需开启 realipheader X-Forwarded-For 并信任 NPS 服务器 IP 即可,切勿误用 proxyprotocol。
- 作者帖子
- 在下方一键注册,登录后就可以回复啦。