traceroute/tracertコマンドの詳細について説明します。
traceroute/tracertコマンドとは
概要
traceroute/tracertコマンドは、IPのTTL値(Time to Live)と、ICMPの「Query(問い合わせ)/Error(エラー通知)」という機能を組み合わせて、ネットワークの経路情報を確認するためのコマンドです。
ICMPの説明とType/Codeの一覧については下記を参照してください。
コマンドの種類
OSにより利用されるコマンドやプロトコルが異なります。
コマンド | OS | 利用プロトコル | 備考 |
---|---|---|---|
traceroute | Mac, Linux, Cisco | UDP+ICMP | Mac/Linuxは、オプションによりICMPのみを利用することが可能 |
tracert | Windows | ICMP | – |
traceroute/tracert通信の詳細
ネットワーク構成
下記のネットワークをCiscoCMLで構築し、traceroute通信の検証を行います。
Desktop → Server へのtraceroute実施
Desktopでtracerouteコマンドを実行します。CiscoCML上のDesktopは、LinuxベースのOSとなるため、”-I”オプションを付けてICMPを利用するようにしています。
traceroute -I 172.16.1.1
Desktop:~$ traceroute -I 172.16.1.1
traceroute to 172.16.1.1 (172.16.1.1), 30 hops max, 46 byte packets
1 192.168.1.254 (192.168.1.254) 5.659 ms 4.206 ms 6.972 ms
2 10.0.0.2 (10.0.0.2) 8.835 ms 12.807 ms 10.753 ms
3 172.16.1.1 (172.16.1.1) 14.788 ms 7.926 ms 11.677 ms
通信フロー
tracerouteコマンドを実行すると、DesktopからServerに対して、ICMPエコー要求をTTL=1として送信します。
パケットキャプチャで詳細を確認すると、TTL値(Time to live)が、”1″に設定されていることがわかります。
パケットキャプチャ抜粋
Internet Protocol Version 4, Src: 192.168.1.1, Dst: 172.16.1.1
Time to live: 1
Protocol: ICMP (1)
Source: 192.168.1.1
Destination: 172.16.1.1
Internet Control Message Protocol
Type: 8 (Echo (ping) request)
Code: 0
Checksum: 0x6b11 [correct]
Sequence number (BE): 1 (0x0001)
Sequence number (LE): 256 (0x0100)
Router1がTTL=1のパケットを受け取ると、それ以上ルーティングができないため、パケットを破棄します。そして、パケットを破棄したことを送信元(Desktop)へ伝えるために、Time Exceeded(Type11)のICMPパケットを送信します。
Time Exceeded/Time to Live Exceeded in Transitは、ICMPのType11/Code0が利用されます。また、ICMPのデータ部には送信されたICMPエコー要求の情報が格納されます。
パケットキャプチャ抜粋
Internet Protocol Version 4, Src: 192.168.1.254, Dst: 192.168.1.1
Time to live: 255
Protocol: ICMP (1)
Source: 192.168.1.254
Destination: 192.168.1.1
Internet Control Message Protocol
Type: 11 (Time-to-live exceeded)
Code: 0 (Time to live exceeded in transit)
Checksum: 0xf600 [correct]
Internet Protocol Version 4, Src: 192.168.1.1, Dst: 172.16.1.1
Time to live: 1
Protocol: ICMP (1)
Source: 192.168.1.1
Destination: 172.16.1.1
Internet Control Message Protocol
Type: 8 (Echo (ping) request)
Code: 0
Checksum: 0x6b11 [unverified] [in ICMP error packet]
Sequence number (BE): 1 (0x0001)
Sequence number (LE): 256 (0x0100)
Router1からICMPパケットを受け取ったDesktopは、Router1までの疎通は問題ないと判断します。応答パケットはエラー通知(Time Exceeded)ですが、何かしらの応答があればOKと判断します。
次に、DesktopからServerに対して、ICMPエコー要求をTTL=2として送信します。
パケットキャプチャで詳細を確認すると、TTL値(Time to live)が、”2″に設定されていることがわかります。
パケットキャプチャ抜粋
Internet Protocol Version 4, Src: 192.168.1.1, Dst: 172.16.1.1
Time to live: 2
Protocol: ICMP (1)
Source: 192.168.1.1
Destination: 172.16.1.1
Internet Control Message Protocol
Type: 8 (Echo (ping) request)
Code: 0
Checksum: 0x680d [correct]
Sequence number (BE): 4 (0x0004)
Sequence number (LE): 1024 (0x0400)
Desktopから送信されたTTL=2のパケットは、Router1を経由し、Router2がTTL=1の状態で受け取ります。Router2がTTL=1のパケットを受け取ると、それ以上ルーティングができないため、パケットを破棄します。そして、パケットを破棄したことを送信元(Desktop)へ伝えるために、Time Exceeded(Type11)のICMPパケットを送信します。
Time Exceeded/Time to Live Exceeded in Transitは、ICMPのType11/Code0が利用されます。また、ICMPのデータ部には送信されたICMPエコー要求の情報が格納されます。
パケットキャプチャ抜粋
Internet Protocol Version 4, Src: 10.0.0.2, Dst: 192.168.1.1
Time to live: 254
Protocol: ICMP (1)
Source: 10.0.0.2
Destination: 192.168.1.1
Internet Control Message Protocol
Type: 11 (Time-to-live exceeded)
Code: 0 (Time to live exceeded in transit)
Checksum: 0xf901 [correct]
Internet Protocol Version 4, Src: 192.168.1.1, Dst: 172.16.1.1
Time to live: 1
Protocol: ICMP (1)
Source: 192.168.1.1
Destination: 172.16.1.1
Internet Control Message Protocol
Type: 8 (Echo (ping) request)
Code: 0
Checksum: 0x680d [unverified] [in ICMP error packet]
Sequence number (BE): 4 (0x0004)
Sequence number (LE): 1024 (0x0400)
Router2からICMPパケットを受け取ったDesktopは、Router2までの疎通は問題ないと判断します。応答パケットはエラー通知(Time Exceeded)ですが、何かしらの応答があればOKと判断します。
次に、DesktopからServerに対して、ICMPエコー要求をTTL=3として送信します。
パケットキャプチャで詳細を確認すると、TTL値(Time to live)が、”3″に設定されていることがわかります。
パケットキャプチャ抜粋
Internet Protocol Version 4, Src: 192.168.1.1, Dst: 172.16.1.1
Time to live: 3
Protocol: ICMP (1)
Source: 192.168.1.1
Destination: 172.16.1.1
Internet Control Message Protocol
Type: 8 (Echo (ping) request)
Code: 0
Checksum: 0x6509 [correct]
Sequence number (BE): 7 (0x0007)
Sequence number (LE): 1792 (0x0700)
ICMPエコー要求を受け取ったServerは、ICMPエコー応答を返信することにより、ネットワークが正常であることをDesktopへ伝えます。
エコー応答は、ICMPのType0が利用されます。
パケットキャプチャ抜粋
Internet Protocol Version 4, Src: 172.16.1.1, Dst: 192.168.1.1
Time to live: 62
Protocol: ICMP (1)
Source: 172.16.1.1
Destination: 192.168.1.1
Internet Control Message Protocol
Type: 0 (Echo (ping) reply)
Code: 0
Checksum: 0x6d09 [correct]
Sequence number (BE): 7 (0x0007)
Sequence number (LE): 1792 (0x0700)
Desktopは、宛先となるServerから応答を受け取り、ネットワーク全体が正常であると判断します。また、途中経路の機器からも応答を受け取ることで、どの機器を経由し宛先まで到達するかを把握することができます。
なお、tracerouteでは、同じTTL値の3パケットずつ送信しています。全体の通信状況をパケットキャプチャしたものは下記となります。
【参考】UDPを利用する場合
ICMPエコー要求ではなく、UDPを利用する場合は、下記の通信フローとなります。UDPの宛先ポート番号は、33434〜33534が利用されます。Serverからの応答は、UDPで利用されるポート番号が開放されていないことを意味する、「Port Unreachable(Type3/Code3)」が利用されます。
全体の通信状況をパケットキャプチャしたものは下記となります。
以上で、ICMPを利用した技術(2.traceroute/tracertコマンド)の説明は完了です!