Linux:网桥,VLAN和RSTP

我试图找出如何在Linux上使用VLAN和桥接来设置RSTP,现在完全困惑。

我试图桥接三个接口,其中两个应该充当trunk(hdlc0和hdlc1),另一个应该充当接入端口(eth0)。 我还需要在网桥中包含的每个接口上启用RSTP,但是使用下面列出的configuration,RSTP数据包通过hdlc0和hdlc1标记(!)发送,以便其他设备拒绝它们。 由于Linux没有“native vlan”的概念,我不知道如何解决这个问题。

这是我的configuration:

ifconfig eth0 up ifconfig hdlc0 up ifconfig hdlc1 up vconfig add hdlc0 42 vconfig add hdlc1 42 ifconfig hdlc0.42 up ifconfig hdlc1.42 up brctl addbr br1 brctl addif br1 eth0 brctl addif br1 hdlc0.42 brctl addif br1 hdlc1.42 ifconfig br1 up brctl stp br1 on 

另一个问题:我也想知道如何在有多个网桥的情况下configurationRSTP:比如eth0是vlan 42-42的中继线,vlan 42应该通过hdlc0,而vlan 43应该通过hdlc1,所以我有两座桥梁。 如果我在两个桥上启用RSTP,它将(可能)在每个桥上独立运行,所以我很快就会遇到问题?

在Linux中,VLAN和网桥是完全独立的结构,Linux网桥不是“VLAN感知”的。

当你创build一个VLAN接口时,Linux会在这个接口上标记/取消标记数据包,然后将它们传递到底层物理(“trunk”)接口。 但是,仍然可以使用底层物理接口发送未标记(“本地VLAN”)数据包。

在创build网桥时,Linux会在相关接口之间交换数据包,而不用担心数据包上的VLAN标记(或缺less)。 如果将一个中继接口连接到网桥,网桥将愉快地切换VLAN标记的数据包,而不考虑标记。 当您在网桥上启用STP时,Linux会生成未标记的STP数据包并将其丢弃到网桥上。

当网桥连接到也具有关联的VLAN接口的物理接口时,这些VLAN接口将停止看到任何不是指向物理接口的MAC地址的stream量。 这种行为是由于处理桥接和VLAN标记的顺序造成的,并且可以使用ebtables进行更改,如http://blog.rackspace.com/vms-vlans-and-bridges-oh-my-part-2 。 但是,就生成树而言,只要使用PVST +(因为STP端口阻塞是针对每个桥独立pipe理的),将桥连接到物理接口和关联的VLAN接口将只能正常工作,所以它不是真的这里有关。

但是,您也可以在通过VLAN标记的数据包的网桥的顶部创buildVLAN接口,然后将这些VLAN接口添加到其他网桥。

所以,要完成你想要的,试试:

 ip link set dev hdlc0 up ip link set dev hdlc1 up brctl addbr br_native brctl addif br_native hdlc0 brctl addif br_native hdlc1 brctl stp br_native on ip link set dev br_native up ip link add link br_native name br_native.42 type vlan id 42 ip link set dev br_native.42 up ip link set dev eth0 up brctl addbr br_42 brctl addif br_42 br_native.42 brctl addif br_42 eth0 ip link set dev br_42 up 

请注意,Linux内核桥接代码本身仅支持传统的802.1D STP。 要添加对RSTP和PVST +的支持,请使用https://github.com/mstpd/mstpd (有关mstpd的相关文档也可以在以下urlfind: https ://docs.cumulusnetworks.com/display/DOCS/Spanning+Tree+ 和+快速+跨越+树 )。 mstpd也可以讲MSTP,但是由于Linux实现FIB的方式,现在不可能将MSTP拓扑映射到Linux网桥上,所以MSTP实际上并不起作用。

为了回答第二个问题,我不相信(在任何交换机上,不仅仅是在使用Linux的时候),使用STP或RSTP通过其他两个中继线在一条中继线上引导两个不同的VLAN中的每一个都是可能的。 这只能使用PVST +或MSTP完成,尽pipe如上所述,MSTP在Linux中不受支持。