了解 Linux 中的虚拟交换机

了解 Linux 中的虚拟交换机

我对在 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

相关内容