使用路由表和 arp 的 Docker Linux 网络拓扑

使用路由表和 arp 的 Docker Linux 网络拓扑

我正在使用 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 设置文件。

相关内容