【図解】tracerouteの仕組み/見方〜WindowsとLinuxの違い(icmp/udp),戻りの経路,, 経路途中のIPが表示されない理由〜

traceroute (tracert)とは

tracert(Linux系の場合はtraceroute。読み方:トレースルート。)とは、宛先までに辿るIPネットワーク経路のIPアドレスを調査するツールです。

つまり、パケットが通過するIPアドレスを表示させることができます。

ルーティング・ループが発生している箇所では、同じアドレスが何度も表示されるので、ルーティング・ループの調査にも使うことができます

Windowsであれば、コマンドプロンプトから使うことができます。例えば自分のPCからGoogleのIPアドレスまでの経路を確認したいときは、コマンドプロンプトで > tracert 8.8.8.8 と打ちます。なお、8.8.8.8はGoogleの公開DNSサーバのIPアドレスです。

  1. Windowsキー + R
  2. 「ファイル名を指定して実行」の名前入力欄に "cmd" と入力し、Enterを押下
  3. tracert 8.8.8.8 と入力し、Enterを押下

1番目には tracert を実行したWindows PC のデフォルトゲートウェイが表示されます。その後は210.148.147.101 ⇒ 210.148.147.21 ⇒ ・・・ と辿っていき、最終的に8.8.8.8へ辿り着いていることが分かります。

実行して頂くと分かると思いますが、表示が遅いです。これは、得られた経路途中のIPについて、DNSの逆引きを行うためです。早く表示させたい場合は、-d オプションを付けます。これによりDNSの逆引きを実行しなくなります。

> tracert -d 8.8.8.8

tracert で経路途中のIPが、表示されず飛ばされたり、アスタリスクとして表示される場合

tracertコマンドの結果、表示されるはずと思っていたIPが表示されず次のIPが表示されたり、アスタリスクとして表示される場合があると思います。この理解については、tracertの仕組みを理解する必要があります

tracert (traceroute)の仕組み

先程の8.8.8.8宛を例として考えます。

tracert で利用するプロトコルは、主にICMPです。

例えば tracert 8.8.8.8 を実行すると、8.8.8.8 宛に "ICMP Echo Request" を TTL=1 で送信します。しかしDGWのルータではルーティングをしようとしたタイミングでTTL=0となり、ルータからは送信元IP=192.168.31.1(PCのDGW)、宛先IP=[PCのIP] の "ICMP Time Exceeded" が送信されます。コマンドプロンプト上で1番目のルートとして表示されているのは、この送信元IP=192.168.31.1 になります。

次にはTTL=2で送信し、ISPルータでTTLが0になり、PCに近いほうのインタフェースのIPアドレスである210.148.147.101を送信元IPとしてICMP Time Exceededが送信されます。

次にはTTL=3で送信し、、、というのを宛先に辿り着くまで、もしくはTTL=30まで繰り返します

以上から分かるように、通過する経路上のIPすべてが表示されるわけではなく、通過するNW機器のうち、送信端末に近い側のインタフェースのIPが順番に表示されていくのです。

つまり、宛先に近い側のインタフェースは経路ではありますが、そのインタフェースのIPアドレスは表示されないのです。

また、途中からずっとアスタリスクが表示され、30番目まで到達してしまう場合は、途中からTTL expired が戻ってきてないことを意味しています

これは最後に到達した機器がTTL expiredを返さない設定になっているか、その手前の機器でドロップされているか、さもなければ最後に到達した機器からの戻りのルーティングが無いかのいずれかです。

戻りの経路は関係あるのか?

上図の挙動から分かる通り、戻りの経路は関係ありません。そして戻りの経路が原因でTTL expired が受信できなかった場合どうなるかというと、やはりアスタリスクが表示されます。なので戻りのルートを確認したいときは、対向機器から逆向きに traceroute を実行する必要があります。

LinuxやCisco系のtraceroute

LinuxやCisco機器上では traceroute が使えます。 tracert ではありません。

役割に違いはありませんが、少し実装が異なります。送信に使うプロトコルは ICMP Echo RequestではなくUDPのハイヤーポート33434 から送信のたびに1ずつ増やしていきます。なのでFW上でICMPを空けている場合、WindowsのtracertはできてもLinuxのtracerouteはできない、という状態になります。

宛先に辿り着くまでは同じくICMP Time Exceeded が届き、宛先に辿り着くと、ICMP Destination Unreachable(Port Unreachable) が返ってくる想定になります。

ただ、オプションで -I をつければWindowsのtracertと同じく、ICMP Echo Request での動作になります。

# traceroute -I 8.8.8.8

シェアする

  • このエントリーをはてなブックマークに追加

フォローする