当存在相同 VLAN(未标记)的网桥时,为所有 VLAN(标记)设置 Linux 网桥

当存在相同 VLAN(未标记)的网桥时,为所有 VLAN(标记)设置 Linux 网桥

TL;DR:有人知道如何让与 VLAN 关联的网桥(如 virbr0.101)和支持所有 VLAN 的通用网桥(如 virbr0)共存吗?

抱歉,我的故事有点冗长,但我会为你逐层讲解。我有一个非常通用的配置,用于在 CentOS 7 服务器上运行 KVM/LibVirt 客户机,其中

“eno1” + “eno2” + “eno3” + “eno4” 绑定成为“bond0”。在我的交换机结构中,我有一个 803.2ad+LACP 接口,然后我在该接口上配置 802.1Q 中继模式并向其添加 VLAN 101、102、103、104。

回到 Linux,然后我使用 vlan 接口扩展“bond0”:“bond0.101”、“bond0.102”、“bond0.103”、“bond0.104”

最后,我为 KVM 客户机使用了一组桥接器:“virbr0.101”、“virbr0.102”、“virbr0.103”、“virbr0.104”

到目前为止一切顺利。客户机使用“virbr0.101”之类的桥接器,并使用未标记的数据包访问 VLAN 101。我为所有客户机配置了一个简单的“eth0”,他们不知道自己在哪个网段中运行。桥接器会取消数据包的标记。我已经这样做了很多年。效果非常好。


快进到现在,我有了一个新的虚拟防火墙,我想要(需要)将整个标记的 VLAN 中继引入到该 KVM 客户机。

回到服务器上,我自然而然地设置了“virbr0”,它是“bond0”的桥梁,并创建了我的虚拟防火墙。我也用一台标准的 Centos 机器做过这件事,所以让我用 Linux 术语而不是 Juniper Junos vSRX 术语来解释:

我有一个 CentOS 7 客户机与其他客户机在同一 KVM 主机服务器上运行,这个新客户机使用“virbr0”;我假设它是完全标记的桥接器。然后我跳转到该新客户机并配置一个“eth0.101”接口,其 IP 地址应在 VLAN 101 上工作。(注意:实际上,我还希望运行“eth0.102”、“eth0.103”和“eth0.104”。)


我尝试 ping,但没有任何效果。我无法访问 VLAN 101 网络上的任何内容。

使用 KVM 服务器上的 tcpdump 观察:

  • virbr0 显示传出的 ARP 请求,带有 VLAN 101 标记
  • bond0 显示传出的 ARP 请求,带有 VLAN 101 标记
  • bond0 显示传入的 ARP 响应,带有 VLAN 101 标记
  • bond0.101 显示传入的 ARP 响应,没有 VLAN 标记
  • virbr0.101 显示传入的 ARP 响应,没有 VLAN 标记
  • virbr0 不显示传入的 ARP 响应

我认为正在发生的情况如下:

  • ARP 响应进入 eno[1-4] 接口,然后进入 bond0 接口
  • 因为它是 VLAN 101,所以内核取消标记流量并将其发送到 bond0.101 和 virbr0.101
  • 与此同时,需要流量的目的地——virbr0——却没有得到流量。

流量被分流至 bond0.101/virbr0.101,并且从未出现在 virbr0(连接到 bond0 的桥)上。

最终结果是,使用 virbr0 的“VLAN 中继客户机”上的 eth0.101 的 MAC 地址从未被学习过,并且与该客户的网络连接中断。


我到处寻找解决方案,尝试了很多方法,足以写成一本小书。有谁知道如何让与 VLAN 关联的网桥(如 virbr0.101)和支持所有 VLAN 的通用网桥(如 virbr0)共存?

-马克

相关内容