traceroute (tracert)とは
tracert (Linux 系の場合は traceroute。読み方:トレースルート。) とは、宛先までに辿る IP ネットワーク経路の IP アドレスを調査するツールです。
つまり、パケットが通過する IP アドレスを表示させることができます。
ルーティング・ループが発生している箇所では、同じアドレスが何度も表示されるので、ルーティング・ループの調査にも使うことができます。
Windows であれば、コマンドプロンプトから使うことができます。例えば自分の PC から Google の IP アドレスまでの経路を確認したいときは、コマンドプロンプトで > tracert 8.8.8.8 と打ちます。なお、8.8.8.8 は Google の公開 DNS サーバの IP アドレスです。
- Windowsキー + R
- 「ファイル名を指定して実行」の名前入力欄に "cmd" と入力し、Enterを押下
- 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
コメント