关于 nginx 四层转发问题求助

2022-11-12 16:34:34 +08:00
 cndns
各位 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
3477 次点击
所在节点    Linux
16 条回复
rrfeng
2022-11-12 16:42:13 +08:00
listen 后面加 proxy_protocol
这个 on 改成 off 。
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
2022-11-12 16:44:36 +08:00
RDP 服务端应该不支持 PROXY Protocol ,做 IP Transparent 吧
1260475686
2022-11-12 16:45:17 +08:00
nginx 四层开了 proxy_protocol 那后端肯定也得支持对 proxy_protocol 的接入呀
ihciah
2022-11-12 17:37:38 +08:00
转发常见的有 4 层和 7 层,7 层可以用 http 头携带原始请求者 ip ,4 层不太容易,可以用 SO_ORIGINAL_DST 。不过无论是哪种,都需要转发目标服务手动感知原始 ip 。
你这个需求其实是三层转发,只有类似 iptables 这种面向 ip 包的手段能搞,一般都是内核态搞,ng 这种不可能的。
iptables 直接配一个 SNAT+DNAT 应该就 ok 。
beyondgamp
2022-11-12 19:54:52 +08:00
nginix 功能很强 但要搞明白还得自己花时间
Tianao
2022-11-12 20:01:09 +08:00
TCP Option Address (TOA) 了解一下?
salmon5
2022-11-12 21:56:01 +08:00
salmon5
2022-11-12 21:58:19 +08:00
TOA 还是算了,几乎已经没价值了。
salmon5
2022-11-12 22:04:49 +08:00
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
2022-11-12 23:06:44 +08:00
这个可以 4 层转发,支持 rdp ,vpc 远程桌面

https://www.i996.me

用 v2
bugfan
2022-11-12 23:06:59 +08:00
vpc -> vnc
cndns
2022-11-13 09:39:13 +08:00
@bugfan 我不是内网转发不了而是我想获取真实 IP 到 windows 目标机器上
julyclyde
2022-11-14 09:33:33 +08:00
@salmon5 为什么现在 TOA 没有价值了呀
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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/894715

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX