なぜ「届かないはずの郵便」を投げるのか?tracerouteの不思議な仕組みを紐解く
ネットワークエンジニアの現場にいると、必ずと言っていいほどお世話になるツールが traceroute です。「パケットがどこで止まっているか」を教えてくれる頼れる相棒ですが、皆さんはその中身を深く考えたことはありますか?
実は、traceroute がやっていることは、少しばかり「意地悪」なんです。今日は、UNIX系OSの traceroute が使う「33434番以降のUDPポート」という仕組みを、郵便配達に例えて優しく解説していきます。
—
郵便配達で例える「わざとエラーを起こす」という作戦
ネットワークの世界には、ping のような「相手に呼びかけて返事をもらう」という手段もありますが、traceroute はもっと回りくどい方法をとります。
例えるなら、こんな感じです。
1. あなた(送信元)は、宛先不明の荷物をわざと郵便局へ送ります。
2. 途中の郵便局(ルーター)は、その荷物を見て「おっと、これ宛先が不明だぞ。返送しなきゃ!」と、わざわざあなたに「届きませんでした通知(ICMP Time Exceeded)」を送り返してくれます。
3. あなたはその「届きませんでした通知」を受け取ることで、「あ、この郵便局まではパケットが届いたんだな」と場所を特定するのです。
traceroute は、この「わざとエラーを起こさせて、その返信から場所を突き止める」という戦略をとっています。
—
なぜ「33434番」という中途半端なポート番号なのか?
ここで登場するのが、UDPポート番号です。traceroute は、宛先のサーバーに対して、あえて「通常は使われていないはずの、めちゃくちゃ高いポート番号(33434番から順に)」を指定してパケットを投げます。
なぜこんな高い番号を使うのか? それには明確な理由が2つあります。
- 「閉まっている」ことを教えてもらうため: サーバー側には、そのポートで待ち構えているプログラム(サービス)がいません。だからこそ、サーバーは「そんなポート開いてないよ!」という拒絶通知を返してくれます。これを受け取ることで、私たちは「あ、宛先まで到達したんだな」と判断できるのです。
- 他の通信を邪魔しないため: ネットワークのプロトコルには、HTTP(80番)やSSH(22番)など、大切な通信が使うポートが決まっています。これらを避けて、誰も使っていない高位のポート(33434〜)をわざと選ぶことで、本物の通信を邪魔することなく診断ができるようになっているんです。
—
実際にコマンドを叩いて確認してみよう
では、実際にコマンドを打ってみましょう。Linux環境であれば、traceroute は標準でこの挙動をします。
# 宛先サーバーに対してtracerouteを実行します
# -n オプションはDNS逆引きをスキップして高速に表示させるための小技です
traceroute -n 8.8.8.8
実行すると、以下のような結果が返ってきます。
1 192.168.1.1 0.500 ms 0.400 ms 0.300 ms
2 10.0.0.1 1.200 ms 1.100 ms 1.000 ms
...
このとき、裏側では 33434 番、33435 番…と、ポート番号をインクリメント(1ずつ加算)しながら通信が試行されています。
もし「ファイアウォール」に阻まれたら?
最近のデータセンターやクラウド環境では、セキュリティのためにUDPの通信を全拒否しているケースも珍しくありません。そんなときは、traceroute が反応しなくなってしまいます。
そんな時のために、最近のエンジニアはTCPを使った traceroute もよく使います。
# -T オプションでTCPモードに切り替え
# -p 80 でHTTPポート(80番)を指定して、通信を通りやすくする
sudo traceroute -T -p 80 8.8.8.8
このように、UDPがダメならTCPで、ポートがダメならHTTPで……と、あの手この手で「道筋」を探るのが、現場のエンジニアの腕の見せ所というわけです。
—
初学者の皆さんへ:トラブルシューティングの心構え
最後に一つだけ。トラブルシューティングで一番大切なのは、コマンドを覚えることではなく、「今、自分のパケットがどこでどう扱われているか」を想像することです。
traceroute の結果に * * * と表示されたら、それは「パケットが消えた」のではなく、「相手が返事をくれない(セキュリティでブロックしている、あるいはルートがループしている)」というメッセージです。
「パケットが郵便配達のように、一つ一つのルーターを渡り歩いている」。そう想像するだけで、ネットワークのトラブルは少しずつ、必ず解けるようになりますよ。
焦らず、一歩ずつ。まずは身近なサイトへ向かって traceroute を投げてみることから始めてみてくださいね!
コメント