我正在使用 Debian 9 机器作为具有两个接口的路由器:
eth0 for WAN
eth1 for LAN
eth1 具有用于多个 VLAN(eth1.10;eth1.20;eth1.30)的子接口,并具有与托管交换机的中继连接。各种设备连接到交换机访问端口并可以访问 Internet。相当标准的设置,一切都按预期工作。
现在我要做的是使用 libvirt/KVM/Qemu 在 Debian 路由器内创建一些虚拟机,并使用 OVS 网桥将它们连接到现有的 VLAN。类似于重新创建与我上面描述的相同的物理配置,但已虚拟化。
我尝试创建 ovsbr0,将 eth1 端口添加到桥接,然后为我希望 VM 连接到的特定 VLAN 添加标记端口,如下所示:
# ovs-vsctl add-br ovsbr0
# ovs-vsctl add-port ovsbr0 eth1
# ovs-vsctl add-port ovsbr0 vnet1 tag=10
# ovs-vsctl add-port ovsbr0 vnet2 tag=20
# ovs-vsctl add-port ovsbr0 vnet3 tag=30
当我运行实际的虚拟机时,网桥如下所示:
# ovs-vsctl show
Bridge ovsbr0
Port ovsbr0
Interface ovsbr0
type: internal
Port "eth1"
Interface "eth1"
Port "vnet1"
tag: 10
Interface "vnet1"
Port "vnet2"
tag: 20
Interface "vnet2"
Port "vnet3"
tag: 30
Interface "vnet3"
令我惊讶的是,虚拟机 vnet 接口没有连接。从 eth1 上的 tcpdump,我可以看到来自 VM 的 ARP 帧被正确标记并到达 eth1 接口,但由于某种原因没有转发到子接口。我以前从未使用过 OVS,所以我显然遗漏了一些重要的东西,但无法弄清楚它是什么。
有人可以指出我正确的方向吗?
OVS 网桥只会将流量转发到实际配置的网桥中的端口。尽管 eth1 作为中继接口正确添加到网桥,但子接口(eth1.10;eht1.20;eth1.30)不是网桥的一部分,永远不会看到流量。解决方案很简单 - 只需将提到的 VLAN 子接口添加到网桥即可。