请问大家一个关于转发怎么获取真实 IP 的运维的问题

2024-06-05 21:33:20 +08:00
 whywei8

场景:托管到机房一台机器,安装 LINUX 或 EXSI 系统 ,在这台机器上装 2 到 3 台虚拟机(用 A,B,C 代替), 只有一个公网 IP 。 问题:如果我把公网 IP 的 80 或 443 转发到虚拟机 A 上,在虚拟机内用网络查看命令“:netstat 查看 访问虚拟机 A 80 ,443 对应服务器的 IP ,是内网 IP 。而不是真实的客户 IP 。 怎么实现 虚拟机内 netstat 能看到真实的客户访问 IP 而不是内网地址。是要装软路由吗,还是有其它方案。谢谢

2358 次点击
所在节点    Linux
12 条回复
seers
2024-06-05 21:36:29 +08:00
网络不要用 nat ,用桥接
povsister
2024-06-05 21:56:05 +08:00
如果网关可以跑 nginx ,可以用 proxy protocol 反代转发
如果网关就是普通路由,那需要三层真实 IP ,网关做个策略路由+mangle force route ,别用 NAT 就行了
privil
2024-06-05 21:56:34 +08:00
80 443 最前面起个 Nginx xff 后端应用就能获取到 IP 了
privil
2024-06-05 21:57:11 +08:00
@privil #2 Nginx 啥的 走 xff 或者 代理协议
whywei8
2024-06-06 00:03:18 +08:00
@povsister 不一定是网关,如果跑其它服务 ,你说的策略路由+mangle force route ,netstat 下 能看到真实 IP
CodeWind
2024-06-06 00:09:34 +08:00
@privil #4 xff 是可以伪造的
FabricPath
2024-06-06 00:47:43 +08:00
用 toa ,搜 TCP Option Address
chinanala
2024-06-06 05:52:13 +08:00
不管前面怎样转发,在最后面一台 Nginx 配置文件中加上识别代码就正常了:

set_real_ip_from 0.0.0.0/0;
real_ip_header X-Forwarded-For;
real_ip_recursive on;


我开始是用 iptables 转发,这个工作在三层,如果前端套 CDN 的话,没法把用户真实 IP 带过去。
后面改用 haproxy ,可以设置走 TCP 或者 HTTP ,然后后端 Nginx 配置里加上 xff 识别代码就能完美实现需求。
GuuJiang
2024-06-06 06:31:47 +08:00
想要 netstat 看到是不可能的,除非你自己魔改一个 netstat ,前面所有答案都没有审题吗?
答案就是,不要拘泥于 netstat ,而是在具体的应用里识别,因为不管是 xff 也好,代理协议也好,都是把真实 ip 作为应用层数据的一部分携带过去,后端需要自行提取
privil
2024-06-06 08:38:56 +08:00
@CodeWind #6 那我挂个 http 代理是不是我 IP 也能伪造了。
povsister
2024-06-06 10:45:46 +08:00
@whywei8 我被你带坑里了,楼上所有人也被带歪了。
要看到来源 IP ,直接路由 DNAT 不就行了吗,DNAT 又不改变 SrcIP 。。
LoliconInside
2024-06-06 11:01:49 +08:00
@chinanala haproxy 的话,你可以 nginx 开启 proxy_protocol 就可以正确识别来源 IP ,不用做额外调整

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

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

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

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

© 2021 V2EX