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

240 天前
 whywei8

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

2106 次点击
所在节点    Linux
12 条回复
seers
240 天前
网络不要用 nat ,用桥接
povsister
240 天前
如果网关可以跑 nginx ,可以用 proxy protocol 反代转发
如果网关就是普通路由,那需要三层真实 IP ,网关做个策略路由+mangle force route ,别用 NAT 就行了
privil
240 天前
80 443 最前面起个 Nginx xff 后端应用就能获取到 IP 了
privil
240 天前
@privil #2 Nginx 啥的 走 xff 或者 代理协议
whywei8
240 天前
@povsister 不一定是网关,如果跑其它服务 ,你说的策略路由+mangle force route ,netstat 下 能看到真实 IP
CodeWind
240 天前
@privil #4 xff 是可以伪造的
FabricPath
240 天前
用 toa ,搜 TCP Option Address
chinanala
240 天前
不管前面怎样转发,在最后面一台 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
240 天前
想要 netstat 看到是不可能的,除非你自己魔改一个 netstat ,前面所有答案都没有审题吗?
答案就是,不要拘泥于 netstat ,而是在具体的应用里识别,因为不管是 xff 也好,代理协议也好,都是把真实 ip 作为应用层数据的一部分携带过去,后端需要自行提取
privil
240 天前
@CodeWind #6 那我挂个 http 代理是不是我 IP 也能伪造了。
povsister
240 天前
@whywei8 我被你带坑里了,楼上所有人也被带歪了。
要看到来源 IP ,直接路由 DNAT 不就行了吗,DNAT 又不改变 SrcIP 。。
LoliconInside
240 天前
@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