インターネット壊れた

概要

BGPの検証ネットワークを構築してみたところ、PC1<–>PC2間でpingが飛ばないという現象が起きました。
ただしR3実環境ではとある組織の所有物なので設定の変更はできないものとし、R3は何かしらのダイナミックのルーティングプロトコルが動作しているときいている。
PC1<–>PC2間の間で通信ができないので原因を突き止めてほしい。

前提条件

  • static routesを書かないで
  • R3にはsshできません

初期状態

手元のPCから $ ping 192.168.19.30 をしても応答がない。

終了状態

PC1からPC2までpingが正しく飛ぶ。

解説

想定解

この問題はMTUの不一致でOSPFのネイバーがR2<–>R3間で確立できておらずEBGPのピアが張れないため、PC1<–>PC2間で通信ができないという問題でした。
この問題はR3が触れないためR3のR2側のインターフェースのMTUを割り出す必要があります。
割り出しにはPCからのpingを使います。ping -s MTU値 -M do IPアドレスを使えばIPアドレスまでの経路で指定したMTU値でpingが通れるかどうかを調べることができます。
PC1でping -s MTU値 -M do 192.168.19.26を実行し、もし経路上のMTUより指定したMTU値が大きい場合は以下のように経路上のMTUの上限を通知してくれます。

user@PC:~$ ping -s 1450 -M do 192.168.19.26
PING 192.168.19.26 (192.168.19.26) 1450(1478) bytes of data.
ping: local error: message too long, mtu=1350
ping: local error: message too long, mtu=1350
ping: local error: message too long, mtu=1350
^C
--- 192.168.19.26 ping statistics ---
3 packets transmitted, 0 received, +3 errors, 100% packet loss, time 2034ms

ここで注意すべきはpingの宛先IPアドレスでPC1からpingが通らないと思って192.168.19.26ではなく192.168.19.25に上記のオプションでpingを飛ばすと192.168.19.25のインターフェースのMTU値は見ることができません。このオプションのpingのパケットが出ていくインターフェースのMTU値しかわからないので192.168.19.26まで飛ばしてパケットを192.168.19.25から出す必要があります。

なお上記オプションでMTU値を変えて複数回pingをする場合、linuxがMTU値をキャッシュするためpingをする前にsudo ip route flush cacheを実行してキャッシュを削除する必要があります。

R3のMTU値が解ればR2のR3側のインターフェースに同じMTU値を設定すればOSPFのネイバーが確立できるのでEBGPのネイバーも張ることができ、PC1<–>PC2間でpingが通るようになります。

その他解法

実際の本選参加者は上記のようなまどろっこしい解法は行わずR2のVyOS上でtcpdumpを行いOSPFのパケットの中身を見てMTU値を割り出していました。おそらくそちらのほうがメジャーなやり方ですが、tcpdumpを使えない環境等でpingでMTU値を割り出す方法も知っていると便利かと思います。

採点基準

この問題は50点問題なので部分点などは与えずPC1<–>PC2間で疎通が取れるようになる解答のみに点数を与えています。