インターネット壊れた

解いた人:nonnonno

参照した問題・解説のサイト:インターネット壊れた

使用環境・ツール

BGP(プロトコル)
ルータ
PC

問題文でされた操作

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

バグの内容

手元のPC(おそらくPC1)から $ ping 192.168.19.30 をしても応答がない。

理想の終了状態

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

考えられる原因とその検証・修正手順

pingが飛ばない原因について
参考

PCのNICの状態、IPアドレス設定など、PC側に問題がないかどうか

  • PCのNICにLANケーブルは接続されているか
  • PCのNICのLANアダプタの設定は有効か ifconfigコマンドで(aオプションとか付けるとよさそう)NIC情報を確認
    4行目冒頭あたりにUPと書いてあれば正常に稼働していることを意味する また、同じくifconfigコマンドで、割り振られているIPアドレスやサブネットマスク、デフォルトゲートウェイの設定情報を確認する

デフォルトゲートウェイへのpingを飛ばし、L2,L3デバイス設定の確認

デフォルトゲートウェイとなるL3スイッチorルータでICMPをブロックする設定がないかどうか確認
ACLの定義参考リンク参考、以下のように設定可能

Cisco(config)# access-list 101 permit icmp any any echo-reply
Cisco(config)# access-list 101 permit icmp any any time-exceeded
Cisco(config)# access-list 101 permit icmp any any unreachable
  • PCに設定しているIPアドレス、サブネットマスクの値が間違っている。

  • デフォルトゲートウェイのL3デバイスのIPアドレスの設定が間違っている。

  • デフォルトゲートウェイのL3デバイスのLANポートを有効化(no shut)していない。

  • デフォルトゲートウェイのL3デバイスのLANポートにストレートケーブルまたはクロスケーブルの適切なLANケーブルが接続されておらず、ポートLEDがグリーン状態ではない。

  • PCとデフォルトゲートウェイのL3デバイスの間にあるL2スイッチで、適切なVLANが設定されていないなど、L2スイッチに問題がある。

宛先デバイスに到達するまでの経路の確認

tracerouteコマンドで、経路を確認し、どのL3デバイスまで意図したようにルーティングできているか確認できる。

意図しないルーティングテーブルがないか確認

routeコマンドで、ルーティングテーブルの表示・設定を行う。

MTU値を確認

今回の問題では、ping自体も通らない。
ルータ間でMTUの値が異なると、OSPF(Open Shortest Path First、最短経路を割り出すためのプロトコル)が機能せず、ネイバー関係になることができない。
一方で、pingは通るのに他の通信データの送受信ができない、というケースもあるそうで、pingのデータサイズは通れるが、通信データのパケットサイズはMTUを超過しているために破棄されることがある。

解説

原因

R2とR3のルータ間のMTUが合っておらず、通信ができない

解決方法

両側のルータにアクセス可能な場合:Cisco解説サイト

今回の問題では、R3にアクセスすることができない。
よって、PC1からR2の192.168.19.26までpingを飛ばして、その経路上で、パケットがMTUを超過した際に返ってくるエラーメッセージからR3の192.168.19.25からR2の192.168.19.26までの間のMTU値を調べることができる。
具体的には以下。
ping -s MTU値 -M do IPアドレスとするため、今回はping -s MTU値 -M do 192.168.19.26

ちなみに、MTU値を変えて複数回pingをする場合、linuxがMTU値をキャッシュするためpingをする前にsudo ip route flush cacheを実行してキャッシュを削除する必要がある。

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

参考リンクより

なお、R2のVyOS上でtcpdump(ネットワーク通信の生のデータをキャプチャし、その結果を出力してくれるキャプチャツール)を行って、OSPFのパケットの中身からMTU値を割り出す方法もある。

tcpdump使用法参考リンク