✅ FRPS 在http和tcp模式下 Nginx 获取客户端真实 IP 的配置对比总结

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

标签: 

正在查看 1 条回复
  • 作者
    帖子
    • #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,保障日志审计、访问控制、防刷限流等功能的完整性。

    • #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,此时必须配置:
      nginx

      listen 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。

正在查看 1 条回复
  • 在下方一键注册,登录后就可以回复啦。