V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
NGINX
NGINX Trac
3rd Party Modules
Security Advisories
CHANGES
OpenResty
ngx_lua
Tengine
在线学习资源
NGINX 开发从入门到精通
NGINX Modules
ngx_echo
toyst
V2EX  ›  NGINX

nginx 转发 tcp 后端获取客户端真实 IP

  •  
  •   toyst · 2022-08-24 15:35:51 +08:00 · 3821 次点击
    这是一个创建于 815 天前的主题,其中的信息可能已经有所发展或是发生改变。

    用的 nginx 代理 udpxy ,

    udpxy 显示的是 nginx 服务器的 IP 地址,

    抓包发现 udpxy 是通过 TCP 链接 IP 来记录的客户端地址,

    尝试用 nginx 的 TCP 代理,

    在 /etc/nginx/nginx.conf 配置里面添加如下配置,

    stream {
    	server {
    		listen 9999;
    		proxy_pass 192.168.1.1:50000;
    		proxy_protocol on;
    	}
    }
    

    但是 udpxy 显示的仍然是 nginx 服务器 IP 地址,请问还需要改哪里吗?

    13 条回复    2022-08-25 09:20:41 +08:00
    Renewmm
        1
    Renewmm  
       2022-08-24 15:38:32 +08:00
    在 nginx 设置一个请求头将真实 ip 发给程序
    allenforrest
        2
    allenforrest  
       2022-08-24 15:39:29 +08:00
    udpxy 不支持 proxy protocol 的话,你这个配置没法透传 IP 给 udpxy 诶。
    可以试试看 IP transparent 方案:
    proxy_bind $remote_addr transparent
    cs8425
        4
    cs8425  
       2022-08-24 15:44:49 +08:00
    可以参考下 haproxy proxy protocol 跟 mmproxy (go-mmproxy)
    c332030
        5
    c332030  
       2022-08-24 15:50:15 +08:00
    楼主是四层代理吧,传报文头是七层代理
    CEBBCAT
        6
    CEBBCAT  
       2022-08-24 15:52:33 +08:00
    看一下这篇文章 https://razeen.me/posts/nginx-tcp-stream-proxy-keep-real-client-ip/ ,关键词 Proxy Protocol
    zliea
        7
    zliea  
       2022-08-24 15:53:27 +08:00   ❤️ 1
    proxy_set_header X-Real-IP $remote_addr;
    zliea
        8
    zliea  
       2022-08-24 15:54:26 +08:00
    看错了,是 tcp 的真实 ip ,上边的是 http 的
    tramm
        9
    tramm  
       2022-08-24 16:31:32 +08:00
    在线蹲一个解决方案, 虽然现在单机还扛得住...

    #3 这个里面只看 Nginx -> Nginx 的. 如果直接转发到我的服务端是不是还得我的服务端支持 PROXY Protocol 啊?
    cs8425
        10
    cs8425  
       2022-08-24 16:43:18 +08:00
    @tramm 参考下 mmproxy (go-mmproxy), Linux 限定
    toyst
        11
    toyst  
    OP
       2022-08-24 17:11:18 +08:00
    ```
    sub_filter '<td>192.168.1.11' '<td>$remote_addr';
    ```

    在 location 里面用这个热替换了,
    有个坑,自带的 sub_filter 不支持正则,第三方的 subs_filter (多个 s) 支持正则。
    tramm
        12
    tramm  
       2022-08-25 08:13:32 +08:00
    @cs8425 我去看看 :P
    ShuA1
        13
    ShuA1  
       2022-08-25 09:20:41 +08:00
    tcp 是 4 层代理,修改报文头是需要 7 层代理的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2622 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 05:46 · PVG 13:46 · LAX 21:46 · JFK 00:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.