使用 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 友们,我的需求该如何实现呢?

7707 次点击
所在节点    NGINX
42 条回复
tomczhen
2020-06-11 19:59:54 +08:00
要么是 xy 问题,要么你应该去看看 TCP/IP 协议相关的知识,至少先了解下 IP 协议再说。

其他人就别浪费时间了。
joesonw
2020-06-11 20:05:02 +08:00
你需要的是 iptables
xl224
2020-06-11 20:05:45 +08:00
nginx 配置转发时增加 X-Real-IP HTTP 头,到了 C 里面通过过去 http 头拿到真实 ip
dreamage
2020-06-11 20:19:05 +08:00
x-forward-for
proxy protocol
tcp option
SaberJack
2020-06-11 20:20:31 +08:00
今天刚遇到这个问题:nginx 通过 X-Forwarded-For 获得用户的真实 ip,就必须先使用 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for 。
hundan
2020-06-11 20:41:05 +08:00
简单说一下

这篇文章说的是四层下 tcp 和 udp 的 ip 透传问题 所以你的需求是 http 还是 tcp/udp ?

3-5 楼说的都是 http 协议 2 楼说的没有涉及到透传问题

如果是 http 协议 加一个 x-forward-for 就可以了

如果不是 ...
hundan
2020-06-11 20:42:19 +08:00
仔细看了一下帖子 的确不是 http 协议哈 有答案了记得艾特我一下 学习学习
myd
2020-06-11 20:47:32 +08:00
端口转发,用 ssh 就可以实现
also24
2020-06-11 20:47:48 +08:00
首先需要确认一下你需要转发的流量类型,如果只是 http 协议的流量,那么可以使用 HTTP X-Forwarded-For 解决。

但是如果你需要转发的是纯 TCP / UDP 流量的话,就需要使用 Proxy Protocol 了。
遗憾的是,nginx 只支持对 TCP 流量转发启用 Proxy Protocol 功能。

如果希望对 UDP 流量也生效,就需要一些魔改方案了。
我看到一篇文章对更魔改的方案做了介绍,可以看一下:
http://www.taohui.pub/2018/04/08/udp%E7%9A%84%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86%EF%BC%9Anginx/
also24
2020-06-11 20:52:21 +08:00
噗嗤,我看了下楼主给的链接,原来是同一篇文章 hhh
also24
2020-06-11 21:00:14 +08:00
继续补充一下,其实我个人对方案 2 方案 3 很不喜欢,觉得已经属于魔改的范畴。

为什么要吊死在 nginx 上呢?也许可以尝试下 traefik 看看?

从文档上来看,traefik 似乎是同时支持 UDP 和 Proxy Protocol 的。
https://docs.traefik.io/routing/entrypoints/#proxyprotocol
also24
2020-06-11 21:09:44 +08:00
另:
我本来还是对 haproxy 抱有希望的,翻了下发现,他们好像并不打算支持 UDP
https://github.com/haproxy/haproxy/issues/62
Raul7
2020-06-12 00:31:33 +08:00
@also24 是哈 haproxy 我测试了 不支持 UDP 协议。
nuk
2020-06-12 00:55:12 +08:00
tcp/udp stream 。。。要企业版。。得花钱。。。
est
2020-06-12 01:00:19 +08:00
lz 还是去付费咨询吧,优质客户
aladdindingding
2020-06-12 09:19:58 +08:00
proxy protocol 会在数据包头加一层 自己做解析吧
Raul7
2020-06-12 09:21:45 +08:00
@aladdindingding 目前 nginx 对 proxy protocol 的支持则仅止于 tcp 协议,还不支持 udp 协议-^-
dowson521
2020-06-12 09:34:03 +08:00
这个问题我也一直在想办法处理,目前没有找到合适的方案。
方案 1:nginx 转发 tcp/udp 在 proxy_bind 那里增加 transparent 参数 并将配置文件中 user 改为 root 同时要修改路由。据 nginx 官方文档说是可以实现,但是目前看来网络上并没有成功实现的范例。
proxy_protocol 这个协议头需要代理和被代理的两端都使用支持该协议的转发程序,限制太多了。另外 nginx 企业版也没有这样的功能。

总之这个问题不太好解决:(
also24
2020-06-12 10:33:18 +08:00
@Raul7
有没有试试我在 11 楼提到的 traefik
okletswin
2020-06-12 10:39:46 +08:00
纯 4 层转发,考虑下 lvs ? dr 或者 fullnat 模式

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

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

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

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

© 2021 V2EX