Linux绑定到“ip -d addr show”

时间:2017-03-13 18:43:04

标签: networking routing linux-kernel google-cloud-platform

这个问题听起来可能完全是愚蠢的,但请耐心等待。是否有可能绑定到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

==============

谢谢!

1 个答案:

答案 0 :(得分:0)

这是因为这个公共IP是内部IP的NAT。您可以通过此“a.b.c.d”IP从外部访问它,但在其后面有一个私有IP,所有后NAT请求都将发送到该IP。

检查VM的设置以查找PUBLIC< - >私有IP映射。