我正在使用 docker 容器网络。C1 的路由表如下,其默认网关172.17.0.1
是 docker 桥接器。其 eth1 接口连接到 C2 中的 eth2,并将所有前缀为 192.1 的目的地路由到 C2 中的 eth2。
Dest Gateway Genmask Iface
default 172.17.0.1 0.0.0.0 eth0
192.1.0.0 0.0.0.0 255.255.0.0 eth1
C2 的路由表如下。它通过 C2 上的 eth3 和 C3 上的 eth4 连接到 C3。
Dest Gateway Genmask Iface
192.1.2.0 192.1.2.1 255.255.254.0 eth3
我能够使用 从 C1 ping C2 ping 192.1.1.2
,但是无法使用 从 C1 ping C3 。当我尝试 ping C3 时,C1 发出一个 ARP 查询,查找 C3 的 Mac 地址,但只有 C2 收到该查询,因此失败。 ping 192.1.2.2
如果我手动更新 C1 的 ARP 表并为其提供 C2 中 eth2 的 Mac 地址,则可以成功 ping C3。192.1.2.2
我相信我也可以通过修改 C1 的路由表来实现这一点,使其与 C3 位于不同的子网中,并使用 C2 作为其默认网关。这样,它就希望 C2 的 MAC 地址能够 ping C3。
Dest Gateway Genmask Iface
default 192.1.1.2 0.0.0.0 eth1
192.1.2.0 0.0.0.0 255.255.254.0 eth1
但是,我被告知只需修改 C2 的路由表就可以从 C1 ping 通 C3。这可能吗?
答案1
你可以通过功能来实现proxy-arp
。当在 C2 上启用代理 ARP 时,它将在 ARP 回复中使用自己的 MAC 地址来回答 ARP 请求。这就是你想要的。
eth0
要在C2 接口上启用代理 arp ,您需要运行
sysctl -w net.ipv4.conf.eth2.proxy_arp=1
要在所有接口上启用,请运行:
sysctl -w net.ipv4.conf.all.proxy_arp=1
为了使此更改永久生效,您应该编辑 sysctl 设置文件。