💰

パケットキャプチャでSTPを学ぶ(6) Port Costの変更

2022/07/01に公開

前回のおさらい

STP(Spanning Tree Protocol)構成をLinuxの中にLinux Bridgeで作成して、パケットキャプチャを取りながらSTPトポロジが完成するところまで確認しました。また、Bridge Priorityを変更することで指定したBridgeをRoot Brideにすることができました。

https://zenn.dev/takai404/articles/eec415ccbb13d4

Root Bridgeを頂点とした木構造で書くとこのような構成です。

ネットワーク構成図っぽく書くとこのような構成です。

今回の目的

Root Bridgeはcore1にしたままで以下の図のようにEast-Westトラフィックを短い距離で通信できるようにします。もう少し具体的に言うとaccess2_e0とaccess4_e0がRoot Portになるようにします。

方針

Root Portの決定に使われる条件は以下の通りです。各ポートが受信したBPDUを見て、条件1が同位の場合は条件2で、条件2が同位の場合は条件3で決定します。

  1. ルートパスコストが最小
  2. Bridge IDが最小
  3. ポートIDが最小

ルートパスコストを変更

core1がRoot Bridgeで、各リンクがすべて10Gbpsの場合、access2のe0とe1はどちらもRoot Path Cost=4です。
勘違いしやすいのがこの「4」が何を足し算しているかです。

以下の図の赤の丸囲みがポートに設定されたコストを示しています。ピンクの数字はネットワークを流れるBPDUのRoot Path Costフィールドの値です。

  1. core1はRoot Path Cost=0でBPDUを送信
  2. access1はe1でBPDUを受信
  3. access1はaccess1のe1のコストである2を加算した0+2=2をaccess1 e1のRoot Path Costであると認識
  4. access1はRoot Path Cost=2でBPDUを送信
  5. access2はe0でBPDUを受信
  6. access2はaccess2のe0のコストである2を加算した2+2=4をaccess0 e0のRoot Path Costであると認識

パケットキャプチャも一応見ておくと、以下がaccess2_e0で受信しているBPDUです。Root Path Cost=2です。

access2のe1も同じようにRoot Path Cost=2のBPDUを受信し、access2が自分のe1のコストを加算してRoot Path Cost=4と認識しています。
BPDUの送信側のコストは関係ない、受信したBridgeがコスト計算しているというのがポイントのひとつです。

このRoot Path Costを上げる、または下げることでaccess2のRoot Portをコントロールできます。

ではどこのコストを変更するべきかですね。数値を上げるか下げるかはあまり重要じゃないと思うのですが、STPの上流で変更するか下流で変更するかは重要です。

各ポートのコストと受信BPDUのRoot Path Cost値を確認するコマンドは以下の通りです。ポートのコストはすべて10Gbpsのデフォルトの2であることが分かります。

# ip -o -d link show type veth | sed -ne 's/[^ ]* \([^@]*\)@.*\(cost [^ ]*\).*\(designated_cost [^ ]*\).*/\1\t\2\t\3/p' | sort
access1_e0      cost 2  designated_cost 2
access1_e1      cost 2  designated_cost 0
access1_e2      cost 2  designated_cost 2
access2_e0      cost 2  designated_cost 2
access2_e1      cost 2  designated_cost 2
access2_e2      cost 2  designated_cost 4
access3_e0      cost 2  designated_cost 2
access3_e1      cost 2  designated_cost 0
access3_e2      cost 2  designated_cost 2
access4_e0      cost 2  designated_cost 2
access4_e1      cost 2  designated_cost 2
access4_e2      cost 2  designated_cost 4
core1_e0        cost 2  designated_cost 0
core1_e1        cost 2  designated_cost 0
core1_e2        cost 2  designated_cost 0
core2_e0        cost 2  designated_cost 0
core2_e1        cost 2  designated_cost 2
core2_e2        cost 2  designated_cost 2

ルートパスコストを変更(下流)

まずは分かりやすくaccess2_e1のコストを変更してみます。

bridge link set dev access2_e1 cost 3

上位Bridgeから受信するBPDUは2で変わっていないです。

# ip -o -d link show type veth | sed -ne 's/[^ ]* \([^@]*\)@.*\(cost [^ ]*\).*\(designated_cost [^ ]*\).*/\1\t\2\t\3/p' | sort
access1_e0      cost 2  designated_cost 2
access1_e1      cost 2  designated_cost 0
access1_e2      cost 2  designated_cost 2
access2_e0      cost 2  designated_cost 2
access2_e1      cost 3  designated_cost 2
access2_e2      cost 2  designated_cost 4
access3_e0      cost 2  designated_cost 2
access3_e1      cost 2  designated_cost 0
access3_e2      cost 2  designated_cost 2
access4_e0      cost 2  designated_cost 2
access4_e1      cost 2  designated_cost 2
access4_e2      cost 2  designated_cost 4
core1_e0        cost 2  designated_cost 0
core1_e1        cost 2  designated_cost 0
core1_e2        cost 2  designated_cost 0
core2_e0        cost 2  designated_cost 0
core2_e1        cost 2  designated_cost 2
core2_e2        cost 2  designated_cost 2

access2_e1のcostが3になりました。

トポロジは以下のように変わりました。うまいことaccess1とaccess2の間が通れるようになりました。


access2と同じようにaccess4のcostも変更します。

bridge link set dev access4_e1 cost 3

目的のSTPトポロジに収束しました。


次の実験のために、変更した設定値を元に戻しておきます。

bridge link set dev access2_e1 cost 2
bridge link set dev access4_e1 cost 2

ルートパスコストを変更(上流)

今度はSTPの上流に位置するcore2(のRoot Portであるe0)を変更してみます。

bridge link set dev core2_e0 cost 3
# ip -o -d link show type veth | sed -ne 's/[^ ]* \([^@]*\)@.*\(cost [^ ]*\).*\(designated_cost [^ ]*\).*/\1\t\2\t\3/p' | sort
access1_e0      cost 2  designated_cost 2
access1_e1      cost 2  designated_cost 0
access1_e2      cost 2  designated_cost 2
access2_e0      cost 2  designated_cost 2
access2_e1      cost 2  designated_cost 3
access2_e2      cost 2  designated_cost 4
access3_e0      cost 2  designated_cost 2
access3_e1      cost 2  designated_cost 0
access3_e2      cost 2  designated_cost 2
access4_e0      cost 2  designated_cost 2
access4_e1      cost 2  designated_cost 3
access4_e2      cost 2  designated_cost 4
core1_e0        cost 2  designated_cost 0
core1_e1        cost 2  designated_cost 0
core1_e2        cost 2  designated_cost 0
core2_e0        cost 3  designated_cost 0
core2_e1        cost 2  designated_cost 3
core2_e2        cost 2  designated_cost 3

core2の下流に位置するaccess2_e1、access4_e1のRoot Path Costが2から3に変わりました。Root Path Costは上流から下流に向けて加算されていくので、こんな風にまとめてトポロジを変更することができます。

パケットキャプチャでもRoot Path Costが2から3に変わったことが分かります。

Blockingポートがどこかも確認しておきます。access2_e1、access4_e1がBlocking状態になっています。

# bridge link  | sed -ne 's/[^ ]* \([^@]*\)@.*\(state [^ ]*\).*/\1\t\2/p' | sort
access1_e0      state forwarding
access1_e1      state forwarding
access1_e2      state forwarding
access2_e0      state forwarding
access2_e1      state blocking
access2_e2      state forwarding
access3_e0      state forwarding
access3_e1      state forwarding
access3_e2      state forwarding
access4_e0      state forwarding
access4_e1      state blocking
access4_e2      state forwarding
core1_e0        state forwarding
core1_e1        state forwarding
core1_e2        state forwarding
core2_e0        state forwarding
core2_e1        state forwarding
core2_e2        state forwarding


次の実験のために、変更した設定値を元に戻しておきます。

bridge link set dev core2_e0 cost 2

まとめ

BPDU受信ポートのコストを変更することでSTPトポロジを変えることができました。
次はポートコスト以外の方法でSTPトポロジを変えてみます。

Discussion