Pingが失敗したのにtracerouteだけ通った謎
今回起きた問題
以前、研究室PCにCloudflare TunnelsでSSHするで外部から接続できるようにしたPCに繋がらなくなりました。
どうやらルータが変わったようで、ならばとケーブルを差し替えてping
を打ってみます。通りません。
そこで、問題が起きている場所を探るためにtraceroute
を叩いてみます。
不思議なことに、今度は最後まで通るのです。
他にもいろいろやってみると、むしろping
だけが通らないように見えます。
コマンド | 結果 |
---|---|
ping www.google.com | ❌ 不通 |
ping www.tus.ac.jp | ✅ 成功 |
traceroute www.google.com | ✅ 成功 |
curl www.google.com | ✅ 成功 |
似た事例
途方に暮れていたところ、pingは通るのにtracerouteは通らない - dullwhaleのメモ帳という記事を見つけました。 僕のちょうど逆(逆ではない)パターンです。
この記事によると、ファイアウォールなどによって、プロトコルごとに通信が許可されたりされなかったりする場合があると言います。
調査
ICMPがブロックされているのではないかと仮説を立てて、調べてみます。
デフォルトではUDPを使用するtraceroute
ですが、-I
オプションをつけることでICMPを使うように設定できます。
traceroute -I www.google.com
すると、無事?失敗しました。
先程は通過できていた4番目のルータで返答がありません。
どうやら、これがファイアウォールだったようです。
www.tus.ac.jp
宛だとping
が成功したのは、大学内部のネットワークだったからなのでしょう。
Ping ・ traceroute
もう少し両コマンドについて調べてみると、traceroute
もICMPを利用しているようです。
UDPでテスト用のパケットを送信しているものの、TTL切れを知らせるメッセージはICMPで返ってくるからです。
それが正しく返ってきていることを考えると、先程のファイアウォールはICMPのecho requestのみをブロックしているのだと思われます。
Cloudflare Tunnels
肝心のTunnelは繋がっていました。
結果
ping
に失敗したものの、当初の予想通り、LANケーブルを差し替えた時点で接続は復活していたというオチでした。
いつでもインターネット疎通確認にping
が使えるとは限らないということですね。