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が使えるとは限らないということですね。