【入門編】 ICMPベースtraceroute(Windows tracert)の動作と仕様 – トラブルシューティング&ネットワーク運用監視実践ガイド

こんにちは!NOC(ネットワークオペレーションセンター)で日々、パケットの荒波と格闘しているシニアエンジニアです。

データセンターの深夜、突然鳴り響くアラート音。「おい、海外の主要拠点への通信が急に遅延してるぞ!」「どのルーターでパケットが迷子になってるんだ!?」——そんな修羅場をいくつもくぐり抜けてきましたが、どんなに巨大で複雑なネットワークであっても、トラブルシューティングの基本はいつだって「足元の一歩」から始まります。

ネットワークの道中を調べるコマンドといえば、誰もが最初に思い浮かべるのが traceroute(Windowsでは tracert)ですよね。「あ、途中のルーターで止まってるな」となんとなく画面を見ているかもしれませんが、このコマンドが裏側でどれほどドラマチックな動きをしているか、考えたことはありますか?

今回は、インフラの世界に飛び込んだばかりのあなたへ向けて、Windows版の tracert が繰り出す「郵便配達の裏技」を、泥臭い現場の知見を交えながら優しく紐解いていきましょう!一歩ずつ理解していきましょうね。

—

1. 宛先までの道のり:郵便配達で例える traceroute の基本

私たちが普段使っている ping は、「おい、そこにいるか?」と宛先に声をかけて返事をもらうだけのシンプルなツールです。これに対し、traceroute は「出発地から宛先までに、いったい何人の郵便配達員(ルーター)を経由しているのか」をすべて暴き出すスグレモノです。

通常、手紙(パケット)を出すとき、私たちは宛先の住所だけを書きますよね。郵便局のシステムは、宛先に向かって最短ルートで荷物を運んでくれます。途中の郵便局員たちは、宛先を見て「お、これは次の街へ送る荷物だな」とリレー形式でバトンを渡していきます。

もし、途中の道が通行止めになっていたり、荷物が迷子になったりしたとき、「どこでストップしたのか」を知りたくありませんか? traceroute は、まさにその「どこで止まったか」を突き止めるための探偵なんです。

—

2. Windows版 tracert が使う「ちょっとずるい」手口とは?

ここで、Unix系(LinuxやmacOS)とWindowsの traceroute の大きな違いについてお話ししておきましょう。ここが今日のハイライトの一つです!

  • Unix系(traceroute)の基本:

デフォルトでは「UDPパケット」や、最近では「TCPパケット」を使って道中を探ります。

  • Windows系(tracert)の基本:

一貫して「ICMP Echo Request(いわゆるpingのパケット)」を使って道中を探ります。

「えっ、pingと同じパケットでどうやって途中のルーターの場所がわかるの?」って思いますよね。ここに、ネットワークの世界の面白い仕組みが隠されています。

寿命(TTL)という名の「カウントダウン・タイマー」

パケットには、インターネットの海を永遠にさまよい続けて迷子にならないように、TTL(Time To Live / 生存時間)という「歩数制限(カウントダウン・タイマー)」が必ず備わっています。

ルーターを1つ通過するたびに、このTTLの値は必ず 1 ずつ減らされます。そして、もしTTLが 0 になってしまったら、そのパケットを預かった不運なルーターは、「おっと、これ以上旅を続ける寿命がないな」と判断し、パケットをゴミ箱に捨てます。そして、元の送信者に向けてこう叫ぶのです。

「おい!お前が送った荷物、寿命切れでうちのルーターで破棄したぞ!(ICMP Time Exceeded)」

Windowsの tracert は、このルーターたちの「寿命切れです!」という悲鳴(エラー通知)を逆手に取っているんです。

—

3. 実践!Windows tracert のシーケンスを覗き見してみよう

それでは、実際にWindowsのコマンドプロンプトを開いて、おなじみのコマンドを叩いてみましょう。

C:\> tracert 8.8.8.8

このコマンドを実行したとき、Windowsの内部では次のようなドラマが繰り広げられています。

1. 第1投(TTL = 1):
Windowsは、まず寿命を 1 に設定したICMP Echo Request(ping)を 8.8.8.8 に向けて発射します。
しかし、自宅のすぐ隣にあるルーター(最初のゲートウェイ)を通過した瞬間、TTLは 1 - 1 = 0 になり、そのルーターで力尽きます。
ルーターは「寿命です!」というエラー(Time Exceeded)をWindowsに送り返してきます。これで「1番目のルーターのIPアドレスと名前」が判明します!

2. 第2投(TTL = 2):
次にWindowsは、寿命を 2 に増やしたICMPパケットを発射します。
1つ目のルーターを無事に通過(TTLが 1 に減少)、しかし2つ目のルーターを通過した瞬間に力尽きます(TTLが 0 に)。
2つ目のルーターが「寿命です!」と叫ぶため、これで「2番目のルーターのIPアドレス」が判明します。

3. ゴールへ到達するまで繰り返し:
これを TTL = 3, 4, 5... と徐々に増やしながら繰り返していくことで、宛先(8.8.8.8)にたどり着くまでのすべてのルーターの足跡を綺麗に一本のリストとして画面に描き出すのです。

すごく泥臭くて、かつシンプルで美しい仕組みだと思いませんか?

—

4. 現場のシニアが教える! tracert 読み解きのコツと注意点

実務の現場では、この tracert の結果をいかに正しく読み解くかがエンジニアの腕の見せ所です。最後に、現場で役立つ実践的な知見をいくつかシェアしておきますね。

① アスタリスク(*)が並ぶ理由

画面に * * * リクエストがタイムアウトしました。 と表示されることがあります。「うわ、障害だ!」と焦るかもしれませんが、ちょっと待ってください。
世の中のルーターやファイアウォールの中には、セキュリティ上の理由(DDoS攻撃対策など)や単なるポリシーとして、「寿命切れの通知(ICMP Time Exceeded)をあえて送り返さないように設定されている」ものがたくさんあります。
そのため、途中のルーターが無口なだけで、通信自体は正常に通過しているケースも多々あります。「星印が出ても、その先の行でちゃんとレスポンスが帰っていれば気にしなくてOK」と覚えておきましょう。

② Windows版とUnix系の挙動の違いにハマるな

セキュリティエンジニアやネットワーク監視の現場でよくあるのが、「Linuxからだとtracerouteが通るのに、Windowsからだと途中で止まる(あるいは逆の現象)」というトラブルです。
前述した通り、WindowsはICMPベース、Unix系はUDP/TCPベースです。企業の厳重なファイアウォールでは、「ICMPは通すけど、特定のUDPポートは塞ぐ」といったポリシーが組まれていることがよくあります。
「ツールによって使っているプロトコルが違うから、パケットの通り道が変わる(あるいはファイアウォールに弾かれ方が変わる)」という点を頭の片隅に置いておくだけで、原因究明のスピードが劇的に変わりますよ。

—

まとめ

今回は、Windowsの tracert がICMPを使ってどのように経路を暴き出しているのか、その裏側のドラマを解説しました。

一見すると無機質なコマンドの実行結果も、パケットの寿命(TTL)という仕組みと、ルーターたちの「寿命切れです!」という応答のキャッチボールだと分かると、見え方がガラリと変わったのではないでしょうか。

ネットワークの世界は、突き詰めるととても人間味のある「ルーターたちの伝言ゲーム」で成り立っています。これからもトラブルに直面したときは、「今、パケットはどのルーターでどんな会話をしているんだっけ?」と想像力を膨らませて、楽しく手を動かしていきましょう!

コメント

タイトルとURLをコピーしました