図解 tracert の見方 ~WindowsとLinuxの違い(icmp/udp),経路途中のIPが表示されない理由~ | SEの道標
IP

図解 tracert の見方 ~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

コメント

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