Docker

使用路由表和 arp 的 Docker Linux 網路拓撲

  • July 17, 2019

我正在使用 docker 容器網路。C1的路由表如下,它的預設網關172.17.0.1是docker bridge。它的 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 從 C2 ping C2 ping 192.1.1.2,但是我不能使用 C1 從 C3 ping C3 ping 192.1.2.2。當我嘗試 ping C3 時,C1 發出一個 ARP 查詢,尋找 C3 的 Mac 地址,該地址僅由 C2 接收,但失敗了。如果我手動更新 C1 的 ARP 表並將 C2 中 eth2 的 Mac 地址提供給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。這可能嗎?

您可以通過功能來實現它proxy-arp。在 C2 上啟用 proxy-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 設置文件。

引用自:https://serverfault.com/questions/975629