抱歉,这篇文章的标题不太清楚,我不太确定该如何称呼这种行为。
我已经设置了一个虚拟网络拓扑,如下所示:
+------------+ +------------+
| host1 | | router |
| 172.41.1.1 | <---- net1 ----> | 172.41.2.1 | +------------+
+------------+ (172.41.0.0/16) | 172.42.2.1 | <---- net2 ----> | host2 |
+------------+ (172.42.0.0/16) | 172.42.1.1 |
+------------+
这些“节点”实际上是容器,而网络是Docker 网络。(此外,net1
是一个隧道网络,但我省略了这一点,因为我认为它与我看到的问题无关。)
当我ping 172.42.1.2
在 上运行 时host1
,我看不到响应。在(是 的接口)tcpdump -i eth1 -n
上运行,我看到了在我看来正确的数据包被转发:router
eth1
net2
15:06:09.180072 IP 172.41.1.1 > 172.42.1.1: ICMP echo request, id 1, seq 14, length 64
15:06:10.181545 IP 172.41.1.1 > 172.42.1.1: ICMP echo request, id 1, seq 15, length 64
15:06:11.182521 IP 172.41.1.1 > 172.42.1.1: ICMP echo request, id 1, seq 16, length 64
15:06:12.184381 IP 172.41.1.1 > 172.42.1.1: ICMP echo request, id 1, seq 17, length 64
然而,host2
我看到了以下内容:
15:06:58.257789 IP 172.42.0.1 > 172.42.1.1: ICMP echo request, id 1, seq 63, length 64
15:06:58.257811 IP 172.42.1.1 > 172.42.0.1: ICMP echo reply, id 1, seq 63, length 64
15:06:59.259254 IP 172.42.0.1 > 172.42.1.1: ICMP echo request, id 1, seq 64, length 64
15:06:59.259282 IP 172.42.1.1 > 172.42.0.1: ICMP echo reply, id 1, seq 64, length 64
也就是说,数据包的源 IP 似乎被更改为网络地址net2
:172.42.0.1
。为什么会发生这种情况?
答案1
请注意,172.41.0.0/16 和 172.42.0.0/16 不是私有地址 (RFC1918)。20 位私有网络是 172.16.0.0/12,其范围为 172.16.0.0 至 172.31.255.255。这不应该是导致此问题的原因,但如果您希望能够访问互联网上的所有主机,则可能会给您带来麻烦。
这个问题没有提供关于路由器配置的信息,但我的第一猜测是路由器上有数据包处理 (NAT) 规则。请执行此iptables -F
操作并重试。