我在两台主机 A 和 B 上有基于 debian 8 的 proxmox 4。两者都有两个 NIC。每个主机的一个 NIC 通过交叉电缆连接。
Host A:
eth0: public IP
eth1: 10.0.0.2/24
vmbr1: 10.0.0.1/24
Host B:
eth0: public IP
eth1: 10.0.1.2/24
vmbr1: 10.0.1.1/24
在 vmbr1 上,每个主机上都有一个 10.0.x.10 的容器。我会这样表示:
Host A:
veth100i1@if12: 10.0.0.10/24 (IP only visible inside container on eth0)
Host B:
veth100if1@if30: 10.0.1.10/24 (IP only visible inside container on eth0)
路由表主机 A:
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 X.X.X.X 0.0.0.0 UG 0 0 0 eth0
X.X.X.0 X.X.X.X 255.255.255.224 UG 0 0 0 eth0
X.X.X.0 0.0.0.0 255.255.255.224 U 0 0 0 eth0
10.0.0.0 0.0.0.0 255.255.255.0 U 0 0 0 vmbr1
10.0.1.0 10.0.0.2 255.255.255.0 UG 0 0 0 eth1
10.0.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
路由表主机 B:
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 Y.Y.Y.Y 0.0.0.0 UG 0 0 0 eth0
Y.Y.Y.0 Y.Y.Y.Y 255.255.255.224 UG 0 0 0 eth0
Y.Y.Y.0 0.0.0.0 255.255.255.224 U 0 0 0 eth0
10.0.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
10.0.0.0 10.0.1.2 255.255.255.0 UG 0 0 0 eth1
10.0.1.0 0.0.0.0 255.255.255.0 U 0 0 0 vmbr1
从 Host AI 可以 ping 到
- 它的容器在 10.0.0.10
- 主机的 B eth1 在 10.0.1.2
- 主机 B vmbr1 在 10.0.1.1
- 但不适用于 10.0.1.10 上的主机 B 容器
从 Host BI 可以 ping 到
- 它的容器在 10.0.1.10
- 主机在 10.0.0.2 上的 A eth1
- 主机的 A vmbr1 在 10.0.1.1
- 但不在 10.0.0.10 上的主机 A 容器上
当我尝试在主机 BI 中的容器上从主机 A ping 10.0.1.10 时,可以在主机 B 的 eth1 上看到以下内容:
tcpdump -nni eth1
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 262144 bytes
12:42:48.567438 ARP, Request who-has 10.0.1.10 tell 10.0.0.2, length 46
在主机 B 的 vmbr1 上,tcpdump 没有显示任何内容。
如何将数据包路由到其他主机的容器中?
尝试将 eth1 接口设置为第三个子网中的地址,例如 10.0.3.0/24。您可能还需要添加如下所列的转发。
或者尝试为可用服务器代理 ARP 请求。您可以使用类似的命令手动启用此功能。
/etc/sysctl.d
一旦你让它工作,你可以通过添加一个包含如下行的文件来让它在重新启动时保持不变:您可能还需要使用以下任一设置启用转发:
另一种方法是在 vmbr1 定义中包含 eth1。从长远来看,这可能是更好的方法。