パケットキャプチャでSTPを学ぶ(2) 起動時のキャプチャ
前回のおさらい
こちらでSTP(Spanning Tree Protocol)の動作確認環境を作りました。
STPが収束するときのBPDUを確認すべく、今回はパケットキャプチャを全インターフェイスで一斉に取得します。
パケットキャプチャの取得
IPv6無効
必須ではないのですが、IPv6を無効にしておきます。IPv6を有効にしていると定期的にIPv6パケットを発生させてパケットキャプチャの結果が見づらくなるためです。
sysctl -w net.ipv6.conf.all.disable_ipv6=1
sysctl -w net.ipv6.conf.default.disable_ipv6=1
ip -a netns exec sysctl -w net.ipv6.conf.all.disable_ipv6=1
ip -a netns exec sysctl -w net.ipv6.conf.default.disable_ipv6=1
Bridge全停止
まずすべてのBridgeを停止させます。
ip linkコマンドでBridge一覧を取得してxargsでip link set ~ downを実行しています。
ip -br link show type bridge | awk '{print $1}' | xargs -t -i ip link set {} down
上記のコマンドは以下のコマンド(を素早く連続で打つの)と同じです。
ip link set core1 down
ip link set core2 down
ip link set access1 down
ip link set access2 down
ip link set access3 down
ip link set access4 down
キャプチャ開始
vEthernetの両端でパケットキャプチャを開始します。
Ctl-Cを押せばパケットキャプチャを終了しますが、まだ終了させないです。
ip -br link show type veth | awk -F @ '{print $1}' | xargs -t -P 0 -i tcpdump -i {} -w {}.pcap
上記のコマンドは以下のコマンド(を素早く連続で打つの)と同じです。
tcpdump -i core2_e0 -w core2_e0.pcap
tcpdump -i core1_e0 -w core1_e0.pcap
tcpdump -i access1_e1 -w access1_e1.pcap
tcpdump -i core1_e1 -w core1_e1.pcap
tcpdump -i access3_e1 -w access3_e1.pcap
tcpdump -i core1_e2 -w core1_e2.pcap
tcpdump -i access2_e1 -w access2_e1.pcap
tcpdump -i core2_e1 -w core2_e1.pcap
tcpdump -i access4_e1 -w access4_e1.pcap
tcpdump -i core2_e2 -w core2_e2.pcap
tcpdump -i access2_e0 -w access2_e0.pcap
tcpdump -i access1_e0 -w access1_e0.pcap
tcpdump -i access4_e0 -w access4_e0.pcap
tcpdump -i access3_e0 -w access3_e0.pcap
tcpdump -i access1_e2 -w access1_e2.pcap
tcpdump -i access2_e2 -w access2_e2.pcap
tcpdump -i access3_e2 -w access3_e2.pcap
tcpdump -i access4_e2 -w access4_e2.pcap
Bridge全起動
Bridge全停止の逆で、すべてを素早く起動します。
起動直後にpingを開始することでだいたい何秒で疎通できるようになるかを確認できます。
ip -br link show type bridge | awk '{print $1}' | xargs -t -i ip link set {} up; ip netns exec pc1 ping 10.0.0.2 -D -c 60
上記のコマンドは以下のコマンド(を素早く連続で打つの)と同じです。
ip link set core1 up
ip link set core2 up
ip link set access1 up
ip link set access2 up
ip link set access3 up
ip link set access4 up
ip netns exec pc1 ping 10.0.0.2 -D -c 60
# ip -br link show type bridge | awk '{print $1}' | xargs -t -i ip link set {} up; ip netns exec pc1 ping 10.0.0.2 -D -c 60
ip link set core1 up
ip link set core2 up
ip link set access1 up
ip link set access2 up
ip link set access3 up
ip link set access4 up
PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
[1655657009.971255] From 10.0.0.1 icmp_seq=9 Destination Host Unreachable
[1655657009.971327] From 10.0.0.1 icmp_seq=10 Destination Host Unreachable
[1655657009.971330] From 10.0.0.1 icmp_seq=11 Destination Host Unreachable
[1655657013.091127] From 10.0.0.1 icmp_seq=12 Destination Host Unreachable
[1655657013.091187] From 10.0.0.1 icmp_seq=13 Destination Host Unreachable
[1655657013.091190] From 10.0.0.1 icmp_seq=14 Destination Host Unreachable
[1655657016.211140] From 10.0.0.1 icmp_seq=15 Destination Host Unreachable
[1655657016.211200] From 10.0.0.1 icmp_seq=16 Destination Host Unreachable
[1655657016.211203] From 10.0.0.1 icmp_seq=17 Destination Host Unreachable
[1655657019.331131] From 10.0.0.1 icmp_seq=18 Destination Host Unreachable
[1655657019.331189] From 10.0.0.1 icmp_seq=19 Destination Host Unreachable
[1655657019.331192] From 10.0.0.1 icmp_seq=20 Destination Host Unreachable
[1655657022.451160] From 10.0.0.1 icmp_seq=21 Destination Host Unreachable
[1655657022.451220] From 10.0.0.1 icmp_seq=22 Destination Host Unreachable
[1655657022.451223] From 10.0.0.1 icmp_seq=23 Destination Host Unreachable
[1655657025.571189] From 10.0.0.1 icmp_seq=24 Destination Host Unreachable
[1655657025.571290] From 10.0.0.1 icmp_seq=25 Destination Host Unreachable
[1655657025.571296] From 10.0.0.1 icmp_seq=26 Destination Host Unreachable
[1655657028.691122] From 10.0.0.1 icmp_seq=27 Destination Host Unreachable
[1655657028.691181] From 10.0.0.1 icmp_seq=28 Destination Host Unreachable
[1655657028.691184] From 10.0.0.1 icmp_seq=29 Destination Host Unreachable
[1655657029.731589] 64 bytes from 10.0.0.2: icmp_seq=30 ttl=64 time=1040 ms
[1655657029.731659] 64 bytes from 10.0.0.2: icmp_seq=31 ttl=64 time=0.016 ms
[1655657030.771845] 64 bytes from 10.0.0.2: icmp_seq=32 ttl=64 time=0.412 ms
[1655657031.811741] 64 bytes from 10.0.0.2: icmp_seq=33 ttl=64 time=0.284 ms
[1655657032.851736] 64 bytes from 10.0.0.2: icmp_seq=34 ttl=64 time=0.594 ms
[1655657033.892972] 64 bytes from 10.0.0.2: icmp_seq=35 ttl=64 time=0.392 ms
[1655657034.931469] 64 bytes from 10.0.0.2: icmp_seq=36 ttl=64 time=0.196 ms
[1655657035.971351] 64 bytes from 10.0.0.2: icmp_seq=37 ttl=64 time=0.142 ms
[1655657037.011329] 64 bytes from 10.0.0.2: icmp_seq=38 ttl=64 time=0.081 ms
[1655657038.051423] 64 bytes from 10.0.0.2: icmp_seq=39 ttl=64 time=0.261 ms
[1655657039.091136] 64 bytes from 10.0.0.2: icmp_seq=40 ttl=64 time=0.075 ms
[1655657040.131159] 64 bytes from 10.0.0.2: icmp_seq=41 ttl=64 time=0.058 ms
[1655657041.171189] 64 bytes from 10.0.0.2: icmp_seq=42 ttl=64 time=0.075 ms
[1655657042.211179] 64 bytes from 10.0.0.2: icmp_seq=43 ttl=64 time=0.082 ms
[1655657043.251179] 64 bytes from 10.0.0.2: icmp_seq=44 ttl=64 time=0.060 ms
[1655657044.291127] 64 bytes from 10.0.0.2: icmp_seq=45 ttl=64 time=0.058 ms
[1655657045.331182] 64 bytes from 10.0.0.2: icmp_seq=46 ttl=64 time=0.080 ms
[1655657046.371185] 64 bytes from 10.0.0.2: icmp_seq=47 ttl=64 time=0.057 ms
[1655657047.411164] 64 bytes from 10.0.0.2: icmp_seq=48 ttl=64 time=0.057 ms
[1655657048.451153] 64 bytes from 10.0.0.2: icmp_seq=49 ttl=64 time=0.060 ms
[1655657049.491128] 64 bytes from 10.0.0.2: icmp_seq=50 ttl=64 time=0.060 ms
[1655657050.531172] 64 bytes from 10.0.0.2: icmp_seq=51 ttl=64 time=0.058 ms
[1655657051.571101] 64 bytes from 10.0.0.2: icmp_seq=52 ttl=64 time=0.056 ms
[1655657052.611144] 64 bytes from 10.0.0.2: icmp_seq=53 ttl=64 time=0.057 ms
[1655657053.651197] 64 bytes from 10.0.0.2: icmp_seq=54 ttl=64 time=0.115 ms
[1655657054.691116] 64 bytes from 10.0.0.2: icmp_seq=55 ttl=64 time=0.058 ms
[1655657055.732032] 64 bytes from 10.0.0.2: icmp_seq=56 ttl=64 time=0.073 ms
[1655657056.771243] 64 bytes from 10.0.0.2: icmp_seq=57 ttl=64 time=0.079 ms
[1655657057.811303] 64 bytes from 10.0.0.2: icmp_seq=58 ttl=64 time=0.083 ms
[1655657058.851717] 64 bytes from 10.0.0.2: icmp_seq=59 ttl=64 time=0.248 ms
[1655657059.891352] 64 bytes from 10.0.0.2: icmp_seq=60 ttl=64 time=0.076 ms
--- 10.0.0.2 ping statistics ---
60 packets transmitted, 31 received, +21 errors, 48.3333% packet loss, time 61385ms
rtt min/avg/max/mdev = 0.016/33.692/1040.472/183.811 ms, pipe 4
Bridge起動から約30秒でPingが通るようになりました。
先ほどから実行していたパケットキャプチャをCtl-Cで終了しましょう。以下のファイルができているはずです。
access1_e0.pcap
access1_e1.pcap
access1_e2.pcap
access2_e0.pcap
access2_e1.pcap
access2_e2.pcap
access3_e0.pcap
access3_e1.pcap
access3_e2.pcap
access4_e0.pcap
access4_e1.pcap
access4_e2.pcap
core1_e0.pcap
core1_e1.pcap
core1_e2.pcap
core2_e0.pcap
core2_e1.pcap
core2_e2.pcap
キャプチャしたファイルを見やすくするために以下の設定も実行しておきましょう。
キャプチャファイルの結合
解析しやすくするために結合したキャプチャファイルを作ります。
例えば、core1 Bridgeとaccess1 Bridgeの間のやり取りに着目するときはcore1_e1.pcapを見ればよいのですが、core1 Bridgeが他とどのようなパケットをやり取りしているのかに着目するときはcore1_e0.pcap、core1_e1.pcap、core1_e2.pcapを見比べながら解析する必要があります。
wiresharkパッケージにはmergecapというコマンドが含まれており、これを使うと複数のキャプチャファイルを1つにまとめることができます。core1 Bridgeと外部とのやり取りを見るにはcore1.pcapを見ればOKです。
apt install wireshark-common
mergecap -w access1.pcap access1_e0.pcap access1_e1.pcap access1_e2.pcap
mergecap -w access2.pcap access2_e0.pcap access2_e1.pcap access2_e2.pcap
mergecap -w access3.pcap access3_e0.pcap access3_e1.pcap access3_e2.pcap
mergecap -w access4.pcap access4_e0.pcap access4_e1.pcap access4_e2.pcap
mergecap -w core1.pcap core1_e0.pcap core1_e1.pcap core1_e2.pcap
mergecap -w core2.pcap core2_e0.pcap core2_e1.pcap core2_e2.pcap
Windows版Wiresharkだと以下にmergecap.exeがあるのでこれを使っても大丈夫です。
C:\Program Files\Wireshark\mergecap.exe
Discussion