使用 nginx 实现端口流量转发,需求是 ip 透传,请教下我该如何实现?

2020-06-11 18:40:09 +08:00
 Raul7

客户端( Client ):A 机器

Nginx 机器:B 机器

转发的目标:C 机器

需求:A 机器请求 B 机器的端口,将 B 机器的端口( TCP/UDP )流量转发到 C 机器。C 机器记录到的请求 ip 要是 A 机器的 ip 。


网上查询到这篇文章: https://cloud.tencent.com/developer/article/1449427

文章中列了三种方案,分别是 IP 地址透传、DSR (上游服务无公网)、DSR (上游服务有公网)。

方案 1 和方案 2 适配我当前的环境,但是需要 C 机器配置网关,但是目前的环境限制,不允许我修改 C 机器的网关(主要是修改网关可能会影响 C 机器上跑的服务)。

请教下 V 友们,我的需求该如何实现呢?

7708 次点击
所在节点    NGINX
42 条回复
abcbuzhiming
2020-06-12 11:48:01 +08:00
Nginx 的开源版曾经是是不支持第 4 层(传输层 TCP/UDP)转发的。商业版有第 4 层转发。

但是现在有一个 stream 模块支持这个,用 Nginx -V 查看模块,检查是否安装了
--with-stream
--with-stream_realip_module

第一个模块能实现传输层转发,第二模块实现了 PROXY 协议标头( 1.11.4 )中发送请求来源的的地址和端口
http://nginx.org/en/docs/stream/ngx_stream_realip_module.html
fengjianxinghun
2020-06-12 13:49:02 +08:00
你们不知道有 tproxy 可以透传 tcp+udp ?
mgrddsj
2020-06-12 13:54:12 +08:00
tcp/udp 的话应该是用 iptables 吧?
Meano
2020-06-12 14:12:50 +08:00
难道要做协议伪装?为了抗 ISP QOS 做 tcp/udp-over-http 么
julyclyde
2020-06-12 14:33:04 +08:00
首先限定了错误的方法和目标要求
然后问怎么实现
Raul7
2020-06-12 17:21:28 +08:00
@julyclyde ???
Raul7
2020-06-12 17:22:11 +08:00
@mgrddsj iptables 透传不了 udp
Raul7
2020-06-12 17:26:49 +08:00
@fengjianxinghun 请教大佬 tproxy 如何配置呢?
Raul7
2020-06-12 17:29:52 +08:00
@also24 我还在研究 网上没找到好的参考资料
littlewing
2020-06-12 17:38:09 +08:00
你需要 4 层负载均衡,比如说 LVS
Raul7
2020-06-12 18:06:40 +08:00
@littlewing 肿么配置呀 有相关的文章吗表哥 我参考一下
pagxir
2020-06-12 18:07:02 +08:00
不管你怎么弄,你都得修改路由让 C 到 A 的报文经过 B 机器。不过你只是想知道 A 机器的 IP 而不担心修改 C 的程序,你可以用 IPv6 的 NAT64 。否则你可以在 B 跟 C 之间建立 IPv4 隧道,让 c 到 a 的报文走隧道。
littlewing
2020-06-12 18:09:26 +08:00
@Raul7 google 一搜一大推,非常成熟的东西了,很多大公司也用
sujin190
2020-06-12 18:17:42 +08:00
代理的话,能配出 C 直接看到是 A 的 ip,又不在应用层协议内支持,nginx 应用层不可能做到,ip 层应该是可能的,那么你这是要逆天啊

单纯转发流量的话太简单了,自己做一个都不需要 3 分钟
warcraft1236
2020-06-12 18:21:55 +08:00
nginx 能做 if 判断吗?比如如果是 http 就转发到哪,不是就转发到哪
Aruforce
2020-06-12 18:46:02 +08:00
C 机器记录到的请求 ip 要是 A 机器的 ip 。

这个 NGINX 实现不了吧?
zgk
2020-06-12 19:02:17 +08:00
传输层的 TCP/UDP 协议本质上是基于 IP 协议之上工作的,基于传输层想改请求 IP 的记录并不可能啊?

假设就算改了来源的报文,B 与 C 在 TCP 握手时往回发送 IP 包也会直接往 A 机器去发了,连接也建立不起来。这里的限制条件已经无法满足了。
watzds
2020-06-12 19:21:15 +08:00
这个 NAT 实现不了,一般用 LVS 或者 iptables
kaneg
2020-06-12 21:58:11 +08:00
nginx 做不到的,得用 F5
vsyour
2020-09-17 12:29:11 +08:00
尝试试了很多办法不行.

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

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

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

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

© 2021 V2EX