跳到主要内容

TCP 隧道获取真实 IP(PROXY v2,进阶)

仅适合本地有 Nginx stream、HAProxy 等支持 PROXY Protocol v2 的程序。普通远程桌面、SSH、数据库不要开。

适用场景

TCP 隧道后面接的是 Nginx stream、HAProxy 或你自己开发的、明确支持 PROXY Protocol v2 的程序,想在它的日志里看到访客真实 IP。

远程桌面、SSH、数据库不支持这个功能,打开后会直接连不上。

前置条件

  • 最新版客户端,隧道协议为 TCP。
  • 能修改本地 Nginx 或 HAProxy 的配置。

操作步骤

第 1 步:准备一个接收 PROXY 头的端口

以 Nginx stream 为例:新开 9000 端口接收带 PROXY 头的连接,再转给原来在 9001 端口的业务:

stream {
    server {
        listen 127.0.0.1:9000 proxy_protocol;
        proxy_pass 127.0.0.1:9001;
    }
}

日志里用 $proxy_protocol_addr 记录真实 IP。HAProxy 写法是在 frontend 中用 bind 127.0.0.1:9000 accept-proxy。

修改后执行 nginx -t,成功后会看到 test is successful,再重载 Nginx。

第 2 步:修改隧道

  1. 控制台“隧道”页点这条隧道的“配置”。
  2. 端口改为 9000(接收 PROXY 头的端口)。
  3. “真实访客 IP 透传”选“发送 PROXY Protocol v2”,保存。

第 3 步:验证

重启客户端里的这条隧道,从外网新建一次连接。

成功后会看到:Nginx/HAProxy 日志里记录的是访客公网 IP,业务也能正常使用。

成功检查

  • 日志里是访客真实 IP。
  • 业务连接正常。

常见错误

现象 怎么办
打开后业务报协议错误、连不上 后端不支持 PROXY v2。把“真实访客 IP 透传”改回“关闭(保持原始 TCP 字节流)”,端口改回原值
担心 IP 被伪造 9000 端口只监听 127.0.0.1 或只允许客户端电脑访问,不要对外开放
想用于 UDP 不支持

相关教程

远程桌面/SSH 等 TCP 服务 · 网站获取访客真实 IP · Nginx stream 官方文档