这个问题听起来可能完全是愚蠢的,但请耐心等待。是否有可能绑定到Linux机器上任何接口上的IP地址?显而易见的答案似乎是“不,你不能约束”。
我在GoogleCloud机器实例上看到这一点(a.b.c.d是一个真正的公共IP地址)
=============
测试@ gateway4:〜$ sudo ip -d addr show | grep a.b.c.d
=============
这表明linux机器不相信它有任何IP地址接口a.b.c.d
然而,我可以运行netcat,绑定到这个IP地址,甚至让客户端与它通话!
=============
test @ gateway4:〜$ nc -l a.b.c.d 9000
客户说你好
=============
这怎么可能?
果然我无法使用任何其他随机IP地址执行此操作。上述实验是在Google云计算机实例上完成的,该实例创建了一个转发规则,指示将指向a.b.c.d的流量传递到此实例(https://cloud.google.com/compute/docs/load-balancing/network/forwarding-rules)。即使这样,对于内核的堆栈来ACCEPT具有该目标地址的数据包,内核是否应该认为本地接口上存在IP地址?
在玩游戏时,我确实看到GCP在这个a.b.c.d地址的“本地”表中创建了一个路由。是否存在此路由足以让内核允许nc绑定到此IP地址?并且内核要将发往a.b.c.d的数据包发送到本地接口?
==============
测试@ gateway4:〜$ sudo ip route show table local | grep a.b.c.d
local a.b.c.d dev eth0 proto 66 scope host
==============
谢谢!
答案 0 :(得分:0)
这是因为这个公共IP是内部IP的NAT。您可以通过此“a.b.c.d”IP从外部访问它,但在其后面有一个私有IP,所有后NAT请求都将发送到该IP。
检查VM的设置以查找PUBLIC< - >私有IP映射。