LinuxでVLANとブリッジを使用してRSTPをセットアップする方法を理解しようとしましたが、今では完全に混乱しています。
3つのインターフェースをブリッジしようとしています。そのうち2つはトランク(hdlc0およびhdlc1)として機能し、1つはアクセスポート(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を経由することになっているため、 2つの橋。両方のブリッジで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)で説明されているようにebtablesを使用して変更できます。 -oh-my-part-2 。ただし、スパニングツリーに関する限り、物理インターフェイスと関連する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.1DSTPのみをネイティブにサポートしていることに注意してください。 RSTPおよびPVST +のサポートを追加するには、 https://github.com/mstpd/mstpd を使用します(mstpdに関連するドキュメントは次の場所にもあります: https://docs.cumulusnetworks .com/display/DOCS/Spanning + Tree + and + Rapid + Spanning + Tree )。 mstpdはMSTPを話すこともできますが、LinuxがそのFIBを実装する方法により、現在MSTPトポロジをLinuxブリッジにマッピングすることができないため、MSTPは実際には機能しません。
2番目の質問に答えるために、STPまたはRSTPを使用して、1つのトランク上の2つの異なるVLANのそれぞれを他の2つのトランクに転送することは(Linuxを使用している場合だけでなく、どのスイッチでも)可能ではないと思います。これは、PVST +またはMSTPを使用してのみ実現できますが、前述のように、MSTPはLinuxではサポートされていません。
Linuxカーネル3.0以降、Linuxブリッジが「VLAN対応)でない」というのはもはや正しくありません。 https://linux-blog.anracom.com/2017/10/ 30/fun-with-veth-devices-in-unnamed-linux-network-namespaces-i / とフォローアップ記事はかなり良い説明を提供しますが、要約すると:
bridge(8)
ツールを使用して、ほとんどの管理対象スイッチと同じように、ブリッジとVLANの相互作用を操作できます。
あなたの状況では、あなたは次のようなことを試みるかもしれません:
# ip link set br0 type bridge vlan_filtering 1 vlan_default_pvid 1 stp_state 1 priority 32768 nf_call_iptables 1 nf_call_arptables 1
# bridge vlan add vid 1 pvid untagged dev eth0
bridge vlan add vid 19 dev eth0
ip link set up dev eth0
ip link set up dev hdlc0
ip link set up dev hdlc1
# if you only want to bridge VLAN42, you don't need these, but here's how you'd create them:
# ip link add link hdlc0 name hdlc0.42 type vlan protocol 802.1q id 1 reorder_hdr on gvrp on mvrp on loose_binding off
# ip link add link hdlc1 name hdlc1.42 type vlan protocol 802.1q id 1 reorder_hdr on gvrp on mvrp on loose_binding off
# ip link set up dev hdlc0.42
# ip link set up dev hdlc1.42
# now for the actual bridging:
brctl addbr br1
brctl addif br1 eth0
brctl addif br1 hdlc0
brctl addif br1 hdlc1
# port eth0 is an untagged port; assuming it should be in VLAN42:
bridge vlan add vid 42 dev eth0 pvid untagged
# hdlc0 is a trunk interface that forwards vlan42 in a tagged manner:
bridge vlan add vid 42 dev hdlc0
# hdlc1 carries vlan42 and vlan43, both with tagging:
bridge vlan add vid 42 dev hdlc1
bridge vlan add vid 43 dev hdlc1
brctl stp br1 on
ip link set up dev br1
ブリッジにVLANインターフェイスを追加することもできます。これにより、論理的なことを実行できます。ブリッジはイーサネットフレームを生成し、ポートに渡して送信します。問題のポートはVLANインターフェイスであるため、フレームを送信する前にVLANタグを追加します。これには有効な用途があると確信していますが、現時点では考えられません。 :)