V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
cndns
V2EX  ›  Linux

关于 nginx 四层转发问题求助

  •  
  •   cndns · 2022-11-12 16:34:34 +08:00 · 3730 次点击
    这是一个创建于 771 天前的主题,其中的信息可能已经有所发展或是发生改变。
    各位 v 友们好,因为是 4 层的转发需求,我想实现的目标是转发机器能把客户连过的 IP 传递到后端 windows 服务器上
    看了下 iptables , rinetd 都均不能实现这种目的然后网上搜了 nginx 好像可以转发把真实客户 IP 传过去后端机器

    nginx/1.22.1
    编译安装参数如下
    ./configure --with-stream --with-stream_realip_module
    make && make install
    nginx.conf 配置文件如下
    worker_processes auto;
    events {
    worker_connections 1024;
    }
    stream {
    log_format proxy '$remote_addr [$time_local] '
    '$protocol $status $bytes_sent $bytes_received '
    '$session_time "$upstream_addr" '
    '"$upstream_bytes_sent" "$upstream_bytes_received" "$upstream_connect_time"';

    upstream backend {
    server 192.168.100.10:3389 ; #后端 windows 服务器
    }
    server {
    listen 13389;
    proxy_connect_timeout 10s;
    proxy_timeout 30s;
    proxy_protocol on ; # on 不正常改为 off 就正常
    proxy_pass backend;
    }
    }
    proxy_protocol 改为 off 就正常但是开启就不正常端口是通的但是无法远程桌面一直在尝试连接弹不出输入账户密码那一步,但是如果改成 off 的话,windows 服务器看不到真实客户端 IP
    16 条回复    2022-11-15 10:23:43 +08:00
    rrfeng
        1
    rrfeng  
       2022-11-12 16:42:13 +08:00 via Android
    listen 后面加 proxy_protocol
    这个 on 改成 off 。
    cpstar
        2
    cpstar  
       2022-11-12 16:44:23 +08:00
    你这个带 IP 的需求,基本上就,额,需要看协议。
    HTTP 可以带 X-FORWARDED-FOR 塞进 HEADER 里告诉服务器客户的 IP ,但是确实无法修改 IP 包里的源 IP 实现服务器的 IP 认证。同样的,如果 RDP 协议只认 TCP 包里的源 IP 。
    然后如果 Proxy_Protocol on 的时候,RDP 服务器拒绝了链接,那只能说,RDP 不支持这个插帧。

    https://www.jianshu.com/p/cc8d592582c9
    ZeroClover
        3
    ZeroClover  
       2022-11-12 16:44:36 +08:00
    RDP 服务端应该不支持 PROXY Protocol ,做 IP Transparent 吧
    1260475686
        4
    1260475686  
       2022-11-12 16:45:17 +08:00
    nginx 四层开了 proxy_protocol 那后端肯定也得支持对 proxy_protocol 的接入呀
    ihciah
        5
    ihciah  
       2022-11-12 17:37:38 +08:00 via iPhone
    转发常见的有 4 层和 7 层,7 层可以用 http 头携带原始请求者 ip ,4 层不太容易,可以用 SO_ORIGINAL_DST 。不过无论是哪种,都需要转发目标服务手动感知原始 ip 。
    你这个需求其实是三层转发,只有类似 iptables 这种面向 ip 包的手段能搞,一般都是内核态搞,ng 这种不可能的。
    iptables 直接配一个 SNAT+DNAT 应该就 ok 。
    beyondgamp
        6
    beyondgamp  
       2022-11-12 19:54:52 +08:00 via iPhone
    nginix 功能很强 但要搞明白还得自己花时间
    Tianao
        7
    Tianao  
       2022-11-12 20:01:09 +08:00
    TCP Option Address (TOA) 了解一下?
    salmon5
        8
    salmon5  
       2022-11-12 21:56:01 +08:00   ❤️ 1
    salmon5
        9
    salmon5  
       2022-11-12 21:58:19 +08:00
    TOA 还是算了,几乎已经没价值了。
    salmon5
        10
    salmon5  
       2022-11-12 22:04:49 +08:00
    cus
        11
    cus  
       2022-11-12 22:58:31 +08:00
    开启代理协议后需要后端服务支持代理协议。

    > The Proxy Protocol works by adding a header that contains the client’s IP address to the beginning of a TCP connection.

    https://www.haproxy.com/blog/use-the-proxy-protocol-to-preserve-a-clients-ip-address
    https://docs.nginx.com/nginx/admin-guide/load-balancer/using-proxy-protocol
    bugfan
        12
    bugfan  
       2022-11-12 23:06:44 +08:00
    这个可以 4 层转发,支持 rdp ,vpc 远程桌面

    https://www.i996.me

    用 v2
    bugfan
        13
    bugfan  
       2022-11-12 23:06:59 +08:00
    vpc -> vnc
    cndns
        14
    cndns  
    OP
       2022-11-13 09:39:13 +08:00
    @bugfan 我不是内网转发不了而是我想获取真实 IP 到 windows 目标机器上
    julyclyde
        15
    julyclyde  
       2022-11-14 09:33:33 +08:00
    @salmon5 为什么现在 TOA 没有价值了呀
    loovezsh
        16
    loovezsh  
       2022-11-15 10:23:43 +08:00
    要 Windows 获取到真实 IP ,那需要 Windows 那边对 proxy_protocol 支持才行。因为 proxy_protocol 会进行特殊封包的。这是 proxy_protocol 的文档: https://www.haproxy.org/download/1.8/doc/proxy-protocol.txt?spm=a2c4g.11186623.0.0.618564e8nKffLD&file=proxy-protocol.txt
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   918 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 19:48 · PVG 03:48 · LAX 11:48 · JFK 14:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.