同一网络上的两个接口通过桥接器连接

同一网络上的两个接口通过桥接器连接

我有 qemu 虚拟机管理程序,它有 2 个物理接口。eth0 用于主机的流量(管理),eth1 没有 IP,与 VM 的 tap 接口一起属于 br0。两个物理网卡都连接到同一个非托管交换机上,所有内容都位于同一个网络 (192.168.1.0/24) 上。

一切正常。但虚拟机与主机(例如,主机运行 samba 服务器)之间的流量从 eth0 流出并返回 eth1。这很有道理。但如果流量发往虚拟机,我宁愿让主机将其流量直接转发到 br0。当虚拟机响应主机时,流量似乎直接从 br0 转发到主机(而不流出 eth1)。因此,在我的 ARP 表中,我为每个虚拟机 IP 获得了两个条目。一个表示可以通过 eth0 访问虚拟机,另一个表示可以通过 br0 访问虚拟机。

所以我的问题是:有没有办法告诉主机,如果其缓存中有两个 ARP 条目,对于同一个设备,则优先选择其中一个?

或者我的设计从一开始就很糟糕。我喜欢将一个接口保留用于 VM 流量(因为它是 GB 接口),将另一个接口保留用于管理(因为它是 FE 接口)。我明白,要利用这些 NIC 的总吞吐量,我可能应该绑定两个 NIC,但这对我来说不是一个选择,因为它们所连接的交换机是非托管的。

我将非常感激任何建议。

谢谢。

答案1

我找到了一种方法来实现我需要的功能。这只适用于 openvswitch,而不适用于普通的 Linux 桥接器(幸运的是,我使用的是 OVS)

我现在有 eth0、eth1 和 br0 中的所有 tap 接口。我将网桥的“内部”端口和 eth0 设置为具有 vlan 200 的访问端口

ovs-vsctl add-port br0 eth0 tag=200
ovs-vsctl set port br0 tag=200

然后我在网桥中添加 eth1(我希望虚拟机流量通过的虚拟机物理网卡),但使用 vlan 200 以及所有 tap 接口

ovs-vsctl add-port br0 eth1 tag=100
ovs-vsctl add-port br0 tap1 tag=100 -- set interface tap1 ofport_request=1001
ovs-vsctl add-port br0 tap2 tag=100 -- set interface tap2 ofport_request=1002

此时,由于我们有 2 个 VLAN,因此就像拥有两个网桥一样。现在,我希望能够让流量在主机和每个虚拟机之间流动,而不必离开 eth0 并返回 eth1。因此,对于每个 tap 接口,我添加了 2 个流:

ovs-ofctl add-flow br0 "table=0,in_port=1001,priority=500,dl_type=0x800,nw_dst=192.168.1.33,actions=output=LOCAL"
ovs-ofctl add-flow br0 "table=0,in_port=LOCAL,priority=500,dl_dst=mac_of_vm,actions=output=1001"

相关内容