场景:托管到机房一台机器,安装 LINUX 或 EXSI 系统 ,在这台机器上装 2 到 3 台虚拟机(用 A,B,C 代替), 只有一个公网 IP 。 问题:如果我把公网 IP 的 80 或 443 转发到虚拟机 A 上,在虚拟机内用网络查看命令“:netstat 查看 访问虚拟机 A 80 ,443 对应服务器的 IP ,是内网 IP 。而不是真实的客户 IP 。 怎么实现 虚拟机内 netstat 能看到真实的客户访问 IP 而不是内网地址。是要装软路由吗,还是有其它方案。谢谢
![]() |
1
seers 2024-06-05 21:36:29 +08:00
网络不要用 nat ,用桥接
|
![]() |
2
povsister 2024-06-05 21:56:05 +08:00
如果网关可以跑 nginx ,可以用 proxy protocol 反代转发
如果网关就是普通路由,那需要三层真实 IP ,网关做个策略路由+mangle force route ,别用 NAT 就行了 |
![]() |
3
privil 2024-06-05 21:56:34 +08:00
80 443 最前面起个 Nginx xff 后端应用就能获取到 IP 了
|
5
whywei8 OP @povsister 不一定是网关,如果跑其它服务 ,你说的策略路由+mangle force route ,netstat 下 能看到真实 IP
|
![]() |
7
FabricPath 2024-06-06 00:47:43 +08:00
用 toa ,搜 TCP Option Address
|
![]() |
8
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 识别代码就能完美实现需求。 |
9
GuuJiang 2024-06-06 06:31:47 +08:00 via iPhone
想要 netstat 看到是不可能的,除非你自己魔改一个 netstat ,前面所有答案都没有审题吗?
答案就是,不要拘泥于 netstat ,而是在具体的应用里识别,因为不管是 xff 也好,代理协议也好,都是把真实 ip 作为应用层数据的一部分携带过去,后端需要自行提取 |
![]() |
11
povsister 2024-06-06 10:45:46 +08:00
@whywei8 我被你带坑里了,楼上所有人也被带歪了。
要看到来源 IP ,直接路由 DNAT 不就行了吗,DNAT 又不改变 SrcIP 。。 |
![]() |
12
LoliconInside 2024-06-06 11:01:49 +08:00
@chinanala haproxy 的话,你可以 nginx 开启 proxy_protocol 就可以正确识别来源 IP ,不用做额外调整
|