他社SWにCiscoスイッチを接続したらCisco側でポートブロックされた話

# はじめに
既設の上位L2-SWに新設のciscoのL2-SWを接続した時にハマった。
結構有名な話らしいけど調査した時のメモを残しておく。

# いきさつ
自宅のネットワークは以下のようにバックボーンにC2960CG-1があって下位スイッチであるTL-SG105EにはタグVLANを使いトランク接続されている。
バックボーンのC2960CGはSTPが動作していてデフォルトのPVST+が動作している。

![STP.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2570780/f9656c6a-e2fc-4993-5deb-f8bb0a795b64.png)

下位のTL-SG105Eのアクセスポート(通常のPC等が接続されるポート)に別のC2960CG-2のアクセスポートを接続したところ以下のメッセージがコンソールに吐き出され、当該ポートはブロックされてしまった。

```
Mar 30 01:33:46.712: %SPANTREE-7-RECV_1Q_NON_TRUNK: Received 802.1Q BPDU on non trunk FastEthernet0/2 VLAN10.                         
Mar 30 01:33:46.712: %SPANTREE-7-BLOCK_PORT_TYPE: Blocking FastEthernet0/2 on VLAN0010. Inconsistent port type.                      
```

通常、このエラーはアクセスポートに誤ってトランクポートのケーブルを接続した時に発生するものである。
故意にトランクポートをアクセスポートに接続してみたら同様な結果になった。
しかしながら何度確認してもアクセスポート同士しか接続していない。

# 原因
STPが動作している時、アクセスポートから送出されるはBPDU(STPを制御するパケット)は送信先MACアドレスが01-80-C2-00-00-00のIEEE802.3D準拠のIEEE BPDUである。
(ciscoの場合は完全準拠ではないが特定条件下で規格に適合する)
一方、トランクポートから送出されるBPDUパケットはIEEE BPDUの他にCISCOが独自に実装した送信先MACアドレスが01-00-0c-cc-cc-cd(SSTPアドレス)のPVST BPDUが送信される。
まとめると上記環境(Native VLANが1の場合)では

+ アクセスポートから送出されるBPDU
IEEE BPDU (タグなし)

+ トランクポートから送出されるBPDU
PVST BPBU VLAN1(タグなし)
PVST BPBU VLAN10(タグ付き)
PVST BPBU VLAN12(タグ付き)
IEEE BPDU (タグなし)

本来、上位L2-SW(C2960CG-2)とトランク接続された下位L2-SW(TL-SG105E)は受けたBPDUパケットを解釈してアクセスポートから出す際にはIEEE BPDUだけを流すようにしなけらばならない。
しかし、TL-SG105EはSTP機能(IEEE802.3D)を実装していないのでトランクから入ったパケットの中身を解釈せずEthernetフレームからVLANタグを取るだけでPVST BPDUをアクセスポートに流してしまう。
すると、さらに下位に接続されたL2-SWであるC2960CG-2はPVST BPDUが流れてきたのでトランク接続されたものと解釈してしまい当該ポートをブロックしてしまう。

実はこの事についてはciscoの技術文書である「[スパニングツリーの PVID とタイプの不一致のトラブルシューティング](https://www.cisco.com/c/ja_jp/support/docs/lan-switching/spanning-tree-protocol/24063-pvid-inconsistency-24063.html)」に書かれている。
トラブルシューティングの冒頭を読むとアクセスポートにトランクポートを接続しているから不具合が発生するんだと言いたげである。
でも、こっちとしてはアクセスポートにトランクポートなんて接続してない。小学生じゃあるまいし。
で、怒りながら読み進めてゆくと

![cisco_tech.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2570780/b56d9030-ca54-491e-d692-a603a3b07991.png)

>注：スイッチを直接接続する必要はありません。1 台以上の IEEE 802.1D または IEEE 802.1Q スイッチ—またはハブ—を介して接続されている場合、効果は同じです。

と言う超重要なことが書いてあった。
TP-SG105EはIEEE802.3Qをサポートするスイッチなので、まさにこの例に当てはまる。
<font color="Red">重要な事をさらっと書いてんじゃねーよ。しかも、文章がわかりにくいんだよ。</font>
ciscoの技術文章はどれも初見殺しで読む人に理解させる気持ちで書かれているとは思えない。(怒)

いずれにせよ、このままでは上位Ｌ２−SWとciscoのL2-SWと通信ができないので以下のコマンドを
cisco側に投入することで当該ポートがBPDUを受信しなくなるので問題を回避することができる。
ただし、STPが無効になるのでPC接続などループが発生しないポートのみ適用のこと。

```
(config)#interface FastEthernet0/2
(config-if)# spanning-tree bpdufilter enable 
```

# 高価なL2-SWでもCISCOと接続する際には問題ありそう

比較的高価なFortigateのネットワーク機器はPVSTを解釈するっぽい。
安価なL2-SWだとPVSTを解釈しないので逸般の誤家庭では結構ありがちな問題なのかもと思ったけど、お高いArubanetworks社のスイッチもPVSTをまともに解釈していないっぽくて[PVST BPDUをアクセスポートに流してしまうらしい。](https://community.arubanetworks.com/community-home/digestviewer/viewthread?GroupId=421&MID=29258&CommunityKey=2aebb618-b76c-4ff1-a097-4f434ee9ee7d&ReturnUrl=%2Fcommunity-home%2Fdigestviewer%3FCommunityKey%3D2aebb618-b76c-4ff1-a097-4f434ee9ee7d)
この場合、IEEE BPDUだけをアクセスポートに流すフィルタのような動作をさせるコマンド「native-vlan-ieee-bpdu」をArubanetworks機器に投入する必要があるとのことだ。

TL-SG105Eは価格の割に機能が盛り沢山なので良いスイッチだと思うけど思わぬ問題にさらされた。
ただ自宅ネットワークは今のところ冗長化の予定は無いし、TL-SG105Eにはループ検知機能があるので、このままでいいかなと思っている。


参考文献
[CloudEngine シリーズスイッチ典型的な設定例](https://support.huawei.com/enterprise/jp/doc/EDOC1100023631?section=j02e)
[[Switch] Cisco SwitchとPVST接続時の注意点](https://community.arubanetworks.com/community-home/digestviewer/viewthread?GroupId=421&MID=29258&CommunityKey=2aebb618-b76c-4ff1-a097-4f434ee9ee7d&ReturnUrl=%2Fcommunity-home%2Fdigestviewer%3FCommunityKey%3D2aebb618-b76c-4ff1-a097-4f434ee9ee7d)