通过 Bridge 实现 Linux VLAN

通过 Bridge 实现 Linux VLAN

我正在尝试桥接 dot1q 中继,但似乎无法解决。我能够使用 eth0.2 接口连接到中继上的主机,但当我使用 br0 桥接接口并尝试连接时,却什么也没得到。我是不是错过了一些简单的东西?

auto lo
iface lo inet loopback

auto br0
iface br0 inet manual
bridge_ports eth0
bridge_stp off
bridge_fd 9
bridge_hello 2
bridge_maxwait 0

auto br0.100
iface br0.100 inet static
address 192.168.100.99
netmask 255.255.255.0

auto eth0.2
iface eth0.2 inet static
 address 10.1.2.225
 netmask 255.255.255.0
 network 10.1.2.1
 broadcast 10.2.1.255
 gateway 10.1.2.1
 mtu 1500

答案1

如果将接口(eth0就您而言)添加到网桥,默认情况下,其 VLAN 子接口 ( eth0.2) 将不再接收传入流量 — 所有数据包都将传递到网桥。在 Linux 2.6.37 之前,VLAN 子接口有时可以根据您的硬件工作(如果硬件和驱动程序支持 RX VLAN 加速 ( NETIF_F_HW_VLAN_RX),在桥接之前处理 VLAN,则 VLAN 子接口可以工作);自 2.6.37 起,所有卡和驱动程序的行为都相同。

有几种解决方案,但各有缺点:

  1. 向网桥添加 VLAN 子接口,而不是物理接口。但在这种情况下,网桥的所有端口都可以访问所有 VLAN,这可能不是我们所希望的。

  2. 用于ebtables将 802.1Q 标记的流量传递到 VLAN 子接口:

    ebtables -t broute -A BROUTING -i eth0 -p 802_1Q -j DROP
    

    (在BROUTINGchain中ACCEPT表示“桥梁”,DROP表示“路由”,或者实际上是“根据 ethertype 进行处理”,对于 802_1Q 类型来说,表示“传递到适当的 VLAN 子接口”。)

    在这种情况下,桥接器不会获得任何标记的流量,但由于 ebtables 处理,开销会稍微大一些。

  3. 重新配置网络以使接口上的所有流量都带标记,从而完全避免桥接未带标记的流量。

答案2

一旦您将接口添加到桥接器,您就应该使用桥接接口和子接口来获取未标记和 VLAN 标记的数据包。

因此,在您的示例中,您需要用eth0.2替换br0.2

您将只有一座桥接器(br0),但使用桥接子接口(例如br0.2),您可以从任何您喜欢的 VLAN 获取流量。

要将所有信息从 传递eth0br0,只需添加eth0br0然后就完成了。看来您已经完成了此操作。

您可能还想切换以下选项:

sudo sysctl net.bridge.bridge-nf-filter-vlan-tagged=1

这是1在我的 Jaunty 盒子上,但0在 Lucid 上。我必须这样做1才能使我的桥接/VLAN 设置再次工作。

答案3

这里有些东西混在一起了。标记通常发生在实际的以太网接口(即 eth0.2)上,而桥接通常不需要任何类型的显式标记(尽管也有例外)。

好的 - 我假设您希望 VLAN 2 和 VLAN 100 通过以太网 0。

1.) 您要创建 eth0.2 和 eth0.100。请勿在其中输入 IP 地址(inet 手册)。

2.) 创建 br2 和 br100(为了方便)并分配您想要在这些 VLAN 中使用的 IP(inet static)。

3.) eth0.2 将成为 br2 中的 bridge_port。eth0.100 将成为 br100 中的 bridge_port。

答案4

长话短说:标记您的接口,然后添加桥接。因此,要使 vlan100 可以在桥接模式下使用,您需要

eth0 -> eth0.100 -> br100

要添加另一个标签:

eth0 -> eth0.100 -> br100
........->eth0.101 -> br101

等等

相关内容