Linux:網橋、VLAN 和 RSTP
我試圖弄清楚如何在涉及 VLAN 和網橋的 Linux 上設置 RSTP,但現在完全糊塗了。
我正在嘗試橋接三個介面,其中兩個應該充當中繼(hdlc0 和 hdlc1),一個應該充當訪問埠(eth0)。我還需要在網橋中包含的每個介面上啟用 RSTP,但使用下面列出的配置,RSTP 數據包通過 hdlc0 和 hdlc1 標記(!)發送,因此其他設備拒絕它們。由於 Linux 沒有“本機 vlan”的概念,我不知道如何修復它。
這是我的配置:
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
另一個問題:我也想知道如何在我有多個網橋的情況下配置 RSTP:假設 eth0 是中繼,允許使用 vlan 42-42,vlan 42 應該通過 hdlc0,vlan 43 應該通過 hdlc1,所以我有兩座橋。如果我在兩個網橋上啟用 RSTP,它將(可能)在每個網橋上獨立執行,所以我很快就會遇到問題?
在 Linux 中,VLAN 和網橋是完全獨立的結構,Linux 網橋不是“VLAN 感知”的。
當您創建 VLAN 介面時,Linux 在將數據包傳入/傳出底層物理(“主幹”)介面之前,會在該介面上標記/取消標記數據包。但是,您仍然可以使用底層物理介面發送未標記(“本機 VLAN”)數據包。
當您創建網橋時,Linux 在相關介面之間交換數據包,而不用擔心數據包上的 VLAN 標記(或缺少)。如果您將中繼介面連接到網橋,網橋將愉快地切換帶有 VLAN 標記的數據包,而不考慮標記。當您在網橋上啟用 STP 時,Linux 會生成未標記的 STP 數據包並將它們丟棄在網橋上。
當網橋連接到也具有關聯 VLAN 介面的物理介面時,這些 VLAN 介面將停止查看任何不以物理介面的 MAC 地址為目的地的流量。此行為是由於處理橋接和 VLAN 標記的順序造成的,並且可以使用http://blog.rackspace.com/vms-vlans-and-bridges-oh-my-part-2中所述的 ebtables 進行更改. 但是,就生成樹而言,將網橋連接到物理介面和關聯的 VLAN 介面只有在您使用 PVST+ 時才能正常工作(因為 STP 埠阻塞是為每個網橋獨立管理的),所以它不是真的在這里相關。
但您也可以在傳遞 VLAN 標記數據包的網橋上創建 VLAN 介面,然後將這些 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的一些相關文件也可以在以下位置找到:https ://docs.cumulusnetworks.com/display/DOCS/Spanning+Tree+和+快速+生成+樹)。mstpd 也能夠說 MSTP,但由於 Linux 實現其 FIB 的方式,目前無法將 MSTP 拓撲映射到 Linux 網橋,因此 MSTP 實際上沒有功能。
要回答您的第二個問題,我認為不可能(在任何交換機上,而不僅僅是在使用 Linux 時)使用 STP 或 RSTP 將單個中繼上的兩個不同 VLAN 中的每一個引導通過其他兩個中繼。這只能使用 PVST+ 或 MSTP 來完成,儘管如上所述,Linux 不支持 MSTP。