我对在 Linux 中设置虚拟交换机的方式感到困惑。我按如下方式进行:
ip link add name br0 type bridge
ip link set br0 up
这应该创建一个名为 br0 的虚拟交换机。现在,假设我的机器上有一个名为 eth0 的物理网络设备和一个由 KVM/qemu 创建的分流设备 vnet0。 Tap 设备会自动连接到 br0(通过配置),并且 eth0 可以手动添加:
ip link set eth0 master br0
两个设备现在都应连接到交换机 br0。
我将 IP 地址 192.168.1.1 分配给 eth0,将 192.168.1.2 分配给虚拟化内部的网络接口。当然,tap 接口本身并不知道这个地址的任何信息。
如果我使用物理交换机而不是虚拟交换机进行此设置,我希望能够从主机系统 ping 地址 192.168.1.2。但是,无法通过 ping 到达此 IP:
PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
From 192.168.1.2 icmp_seq=1 Destination Host Unreachable
...
这是为什么?
我期望 eth0 向其所属的所有以太网段发送 ARP 请求。这是物理的,也是 br0 定义的。 vnet0 应该使用其 MAC 地址来应答 ARP 请求。
我找到的解决方案是也为 br0 分配一个 IP 地址:
ip addr add 192.168.1.3/24 dev br0
现在 ping 工作正常。
答案1
我将IP地址192.168.1.1分配给eth0
这就是这个设置出错的地方。eth0
已设置为桥接成员接口(第 2 层),因此不应具有任何 IP(第 3 层)地址。
(您可能会以一种损坏的配置结束,涉及两条到 192.168.1.0/24 的直接路由)通过 2 个不同的接口,只有其中一个有效。但错误设置的具体细节并不重要。)
这是为什么?
我期望 eth0 向其所属的所有以太网段发送 ARP 请求。这是物理的,也是 br0 定义的。
eth0 不会发送任何 ARP。一旦成为网桥的一部分,它就不再是第 3 层接口。
- 该网桥上的(第 2 层)端口是
eth0
,tap0
, 和- 桥梁本身。
- 该桥上的(第 3 层)参与者是(按相同顺序)
- 可通过的所有设备
eth0
(最有可能的是:本地网络上的一堆其他设备) - 无论另一边是什么
tap0
(这可能是一回事) - 界面
br0
- 可通过的所有设备