連載
» 2017年01月10日 05時00分 公開

traceroute(tracert) 〜ネットワークの経路を調査する:ネットワークコマンドの使い方

traceroute(Windowsではtracert)は、あるホストから別のホストまでのネットワーク経路をリスト表示するコマンドだ。ここでいう経路とは、ホスト間を接続するルーター(ゲートウェイ)のこと。tracerouteにより、経路上にどのようなルーターが位置しているかを表示する。

[中屋静治(ルーズデイズ),@IT]

目的と用途

 traceroute(Windowsではtracert)は、あるホストから別のホストまでのネットワーク経路をリスト表示するコマンドだ。ここでいう経路とは、ホスト間を接続するルーター(ゲートウェイ)のこと。tracerouteにより、経路上にどのようなルーターが位置しているかを表示する。

 主な用途としては、pingで相手ホストから正常な応答がなかった場合などに、ホスト自身や経路上のルーターのルーティング設定が正しいかどうかを確認するために用いられる。また、目的ホストまでのルーターのリストから、「設置場所が不明なホストのおおまかな場所を推測する」といった利用も行えるだろう。

 その他、各ルーターからのレスポンス時間などの統計値も表示されるので、経路上のボトルネックを探るなどの簡易的なネットワーク性能評価にも役立つ。

書式

Windows(Windows 10)の場合

IPv4/v6兼用

tracert [-d] [-h 最大ホップ数] [-j ゲートウェイ・リスト] [-w タイムアウト時間] [-R] [-S ソースアドレス] [-4] [-6] 対象ホスト(ホスト名またはIPアドレス)

-d 結果に表示するIPアドレスからホスト名への名前解決を行わない
-h 使用する最大TTL(Time To Live)。つまりここで指定した数のルーターしかホップしない
-j 経由すべきゲートウェイ(ルーター)のアドレスを最大9個まで指定できる。ただし指定されていないゲートウェイも経由できる(loose source routed)。IPv4のみ
-w タイムアウト時間を指定する。単位はミリ秒
-R 往復のパスをトレースする。IPv6のみ
-S 自身ではない別のホストを送信元ホストとして指定する。ただしもちろん結果は自身へは返ってこない。あくまで試験用オプション。IPv6のみ
-4 IPv4の使用を強制する
-6 IPv6の使用を強制する

Mac(macOS 10.12)の場合

IPv4用

traceroute [-adDeFInrSvx] [-A ASサーバ] [-f 初期TTL値] [-g ゲートウェイ・リスト] [-i インタフェース] [-M 初期TTL値] [-m 最大TTL値] [-P プロトコル] [-p ポート番号] [-q 試行回数] [-s 送信元アドレス] [-t TOS] [-w 待機時間] [-z pausemsecs] 対象ホスト(ホスト名またはIPアドレス) [パケットサイズ]

-a BGPのAS番号を表示する
-d モードで動作する
-D パケットの内容を表示する
-e ファイアウォール回避モード。通常は試行の度にインクリメントされる送信先ポート番号を固定してファイアウォールを回避しやすくする
-F IPパケットの分割(フラグメント)を禁止する
-I UDPの代わりにICMP Echo Requestを用いる。これは-Pオプションのシノニムでもある
-n 出力をIPアドレスのみに抑制する(DNS逆引きを行わない)
-r ルーティングテーブルを無視して直接パケットを指定したホストに転送するように指示する。すなわち、同一の物理ネットワーク上に目的のホストがない場合はエラーになる
-S ホップごとに返答率を表示する
-v 詳細モード
-x ICMPのCheckSumの評価を行う
-A BGPのAS番号を表示するとともに、指定されたASサーバを使用する
-f 使用するTTLの初期値を指定する
-g 経由すべきゲートウェイ(ルーター)のアドレスを最大8個まで指定できる
-i 指定されたインタフェース(バインドされたIPアドレス)を用いて実行する
-M 使用するTTLの初期値を指定する
-m 使用するTTLの最大値を指定する。つまりこの最大値のホップ数のゲートウェイまでが表示される
-P 使用するIPプロトコルを指定する。UDP、TCP、GRE、ICMPが指定できる
-p 使用するUDP/TCPパケットのポート番号を指定する(UDP/TCPパケットを使用する場合)
-q 1つのゲートウェイに対する試行回数を指定する。デフォルトは3
-s 指定されたIPアドレスからの実行とする(Source Addressを指定する)
-t パケットのTOS(Type Of Service)を指定された値に設定する
-w タイムアウト時間を指定する。単位は秒

IPv6用

traceroute6 [-dIlnNrUv] [-f 初期ホップ数] [-g ゲートウェイ・リスト] [-m 最大ホップ数] [-p ポート番号] [-q 試行回数] [-s 送信元アドレス] [-w 待機時間] 対象ホスト(ホスト名またはIPアドレス) [パケットサイズ]

-d デバッグモードで動作する
-I UDPの代わりにICMP Echo Requestを用いる
-l ホスト名とIPアドレス両方を表示する
-n 出力をIPアドレスのみに抑制する(DNS逆引きを行わない)
-N 調査目的のため、上位レイヤーのヘッダを含まないようにする
-r ルーティングテーブルを無視して直接パケットを指定したホストに転送するように指示する。すなわち、同一の物理ネットワーク上に目的のホストがない場合はエラーになる
-U UDPパケットを用いる(デフォルト)
-v 詳細モード
-f 使用する初期ホップ数を指定する。つまりこの初期値のホップ数のみのトレースとなる
-g 経由すべきゲートウェイ(ルーター)のアドレスを最大8個まで指定できる
-m 最大ホップ数を指定する。最大は255、デフォルトは30
-p 使用するUDP/TCPパケットのポート番号を指定する(UDP/TCPパケットを使用する場合)
-q 1つのホップにおける試行回数を指定する
-s 指定されたIPアドレスから実行する(Source Addressを指定する)
-w タイムアウト時間を指定する。単位は秒

Linux (Ubuntu 16.04 LTS)の場合

IPv4およびv6用

traceroute [-46dFITnreAUDV] [-f 初期TTL値] [-g ゲートウェイ・リスト] [-i インタフェース] [-m 最大TTL値] [-N 並列数] [-p ポート番号] [-P プロトコル番号] [-t TOS] [-l フローラベル] [-w タイムアウト時間] [-q 試行回数] [-s 送信元アドレス] [-z 間隔時間] [--sport=送信元ポート番号] [ --fwmark=num] [-UL] [-M プロトコル] [-O mod_options] [--mtu] [--back] 対象ホスト(ホスト名またはIPアドレス) [パケットサイズ]

IPv6用

traceroute6 [-dnrvV] [-m 最大TTL値] [-p ポート番号] [-q 試行回数] [-s 送信元アドレス] [-t TOS] [-w タイムアウト時間] 対象ホスト(ホスト名またはIPアドレス) [パケットサイズ]

-4 IPv4の使用を強制する
-6 IPv6の使用を強制する
-d デバッグモードで動作する
-F IPパケットの分割(フラグメント)を禁止する
-I ICMP Echo Requestを用いる
-T TCP SYNパケットを用いる。デフォルトのポート番号は80
-n 出力をIPアドレスのみに抑制する(DNS逆引きを行わない)
-r ルーティングテーブルを無視して直接パケットを指定したホストに転送するように指示する。すなわち、同一の物理ネットワーク上に目的のホストがない場合はエラーになる
-e ICMPの拡張を表示する
-A BGPのAS番号を表示する
-U UDPパケットを用いる。デフォルトのポート番号は53
-D DCCP(Datagram Congestion Control Protocol/RFC 4340)を用いる。デフォルトのポート番号は33434
-V バージョン情報を表示する
-f 使用するTTLの初期値を指定する
-g 経由すべきゲートウェイ(ルーター)のアドレスを最大8個まで指定できる。ただし指定されていないゲートウェイも経由できる(loose source routed)
-i 指定されたインタフェース(ネットワークカード名。バインドされたIPアドレスでも可)を用いて実行する
-m 使用するTTLの最大値を指定する。つまりこの最大値のホップ数のゲートウェイまでが表示される
-N 並列してパケットを送信する数。デフォルトは16。大きな値を指定することは推奨されない
-p 使用するUDP/TCPパケットのポート番号を指定する(UDP/TCPパケットを使用する場合)。またICMPパケットの場合は初期シーケンス番号を指定する
-P RAWパケットを使用するためのプロトコル番号を指定する。デフォルトは253
-t パケットのTOS(Type Of Service)を指定された値に設定する。IPv6の場合はトラフィックコントロール値を指定する
-I IPv6のフローラベルを指定する
-w タイムアウト時間を指定する。単位は秒。デフォルトは5秒
-q 1つのゲートウェイに対する試行回数を指定する。デフォルトは3回
-s 指定されたIPアドレスから実行する(Source Addressを指定する)
-z 送信パケットの間隔時間(秒)。デフォルトは0秒
--sport 送信元ポート番号を指定する
--fwmark パケットへファイアウォールマーク(SO_MARK)を設定する
-UL UDPLITE(RFC 3828)パケットを使用する
-M 用いるプロトコルを指定する。デフォルトは“default”(UDP)である。また“icmp”または“tcp”が指定できる。-U、-Iまたは-Tオプションと同じ
-O 用いるプロトコルごとの拡張オプションを指定する
--mtu MTUを決定するために指定する。このオプションを指定すると現在のMTU値も表示する。-Fオプションと組み合わせることで各経路でのMTUを調査できる
--back 復路のホップ数を表示する

使用方法

 traceroute(Windowsではtracert)の最も簡単な使用方法は、引数として経路を調査したいホストを指定する方法である。ホスト名かIPアドレスが指定できる。

Windowsでの使用例(IPv4)

C:\>tracert www.example.net
www.example.net [93.184.216.119] へのルートをトレースしています    <---(1)
経由するホップ数は最大 30 です:    <---(2)
  1    <1 ms    <1 ms    <1 ms  xxxxx [192.168.1.1]
  2     8 ms     6 ms     6 ms  tokyoxx-xxx.flets.2iij.net [210.149.xx.xx]
  3     5 ms     6 ms     5 ms  TOKYOxx-NTTxxxx.flets.2iij.net [210.149.xx.xx]
  4     6 ms     5 ms     5 ms  tky001lip30.iij.net [203.180.20.97]
  5     5 ms     5 ms     5 ms  tky001bb10.IIJ.Net [210.138.115.209]    <---(3)
  6     6 ms     6 ms     6 ms  tky009bf01.IIJ.Net [58.138.80.21]
  7    90 ms    92 ms    89 ms  sea001bf00.IIJ.net [206.132.169.121]
  8   110 ms   109 ms   109 ms  xe-0-5-0-11.r05.sttlwa01.us.bb.gin.ntt.net [129.250.198.177]
  9   110 ms   109 ms   152 ms  xe-0-0-0-28.r05.sttlwa01.us.ce.gin.ntt.net [198.104.202.90]
 10   104 ms   106 ms   105 ms  93.184.216.119
トレースを完了しました。

 上の例では、www.example.netへの経路を表示している(経路情報は一部マスクしてある)。

 (1)の部分は、以下の結果がこのホスト名とIPアドレスへの経路であることを示している。

 (2)は、最大で30個の経路情報を表示することを示している。ルーターにより、あるサブネットから別のサブネットへパケットがルーティングされることを「ホップ:Hop」と呼び、「ルーターを1つ越える」単位を“1Hop”として数えることがある。つまり30 hopsは、最大30台のルーターまでをリストアップすることを意味する。また、このホップはTTL(後述)の最大値とも一致することになる。

 (3)が経路情報の一覧となる。各行は順に、「順序番号」「各ルーター間のレスポンス時間(試行3回分のそれぞれの結果。単位はミリ秒)」「(DNSに登録されている場合)ホスト名」「IPアドレス」を意味している。10番目の結果は指定したホスト自身であるので、経路上には9台のルーターが配置されていることが分かる。

 各ルーターからのレスポンス時間は、この例ではそれぞれ3回の試行結果が表示されている。これを基に、極端に時間がかかっているルーター間がボトルネックであると理解できる。この例ではどうやらルーター名から推測するに、日本―アメリカ間の接続網が最も全体のレスポンスに影響を与えているであろうことが分かる。なお、この試行回数はオプションで変更することもできる。

Linuxでの使用例(IPv6)

 IPv6での例も示しておこう。

$ traceroute6 www.example.net
traceroute to www.example.net (2606:2800:220:6d:26bf:1447:1097:aa7) from 2400:8900::xxxx:xxxx:xxxx:xxxx, 30 hops max, 16 byte packets
 1  2400:8900:ffff:0:xxxx:xxxx:xxxx:xxxx (2400:8900:ffff:0:xxxx:xxxx:xxxx:xxxx)  1.848 ms  0.534 ms  0.565 ms
 2  2001:268:f702:6c::1 (2001:268:f702:6c::1)  2.568 ms  0.924 ms  0.621 ms
 3  6otejbb205.int-gw.kddi.ne.jp (2001:268:fb13:1::1)  1.76 ms  2.054 ms  1.799 ms
 4  6pajbb001.int-gw.kddi.ne.jp (2001:268:fb02:53::2)  119.672 ms  107.226 ms  107.178 ms
 5  6ix-pa4.int-gw.kddi.ne.jp (2001:268:fb81:27::2)  259.832 ms  316.889 ms  168.779 ms
 6  2001:268:fc81:7::2 (2001:268:fc81:7::2)  118.001 ms  117.768 ms  120.898 ms
 7  10ge11-6.core1.lax1.he.net (2001:470:0:34::2)  114.145 ms  107.853 ms  116.516 ms
 8  ec-eqix1-lax-10g.edgecastcdn.net (2001:504:0:3:0:1:5133:1)  189.411 ms  220.958 ms  185.971 ms
 9  2606:2800:220:6d:26bf:1447:1097:aa7 (2606:2800:220:6d:26bf:1447:1097:aa7)  192.614 ms  187.726 ms  183.261 ms

 上のように基本的にはIPアドレスがIPv6形式で表示されるだけで、v4と変わらないと考えてよい。

tracerouteとTTL

 traceroute(tracert)コマンドでは、こうした経路上に存在する各ルーターを割り出すために、IPパケットにおけるTTL(Time To Live)の仕組みをうまく利用している。TTLとはIPパケットヘッダに指定可能な「生存時間」という意味だ。ただし時間ではなく、「ホップ数」を意味している。つまり、そのパケットが「生存」できるホップ数を指定するのがTTLなのである。

 もともとインターネットに代表されるIPネットワークはさまざまなネットワークの集合体なので、接続環境やルーティング設定についても、完全なものである保証は全くない。もしルーティング設定が間違っていれば、一度発生したパケットが延々ループに陥って、いつまでもインターネット上をさまよい続けるという事態も考えられないではない。そこでIPパケットの送出時には必ずTTLを設定することになっている。TTLは最大255まで設定可能で、ルーターをホップする度に必ず1ずつ減らされる。そして0に達したパケットは発見したルーターが破棄することになっている。

 どの程度のTTLなら十分なのかは、目的ホストまでにたどり着くまでにどれだけのルーターやゲートウェイを越える可能性があるかによる。つまり、これはインターネットの「広さ」と密接に関連している。通常は30程度までとされているが、一般的なアプリケーションでは255や128など、十分な大きさを指定する場合が多いようだ。

図1 TTLとICMP Time Exceeeded 図1 TTLとICMP Time Exceeeded

 パケットが単に破棄されたままでは送信元ホストは正しく相手のホストにパケットが届いたかどうか分からない。そこで、(ルーターの設定にもよるのだが)破棄したルーターはICMPのTime Exceededエラー(Type=11)を送信元ホストへ報告することになっている。この通知を受け取ることで、送信元ホストはルーティングなどに何らかの問題が発生していることを知ることができるわけだ。

図2 tracerouteの動作

 tracerouteコマンドでは、このTTLを1から順に増やして試行を重ねて結果を得ている。

 例えば、最初にTTLを1としてIPパケットを対象ホストへ送出すると、1番目のルーター(1ホップ目)が受け取った時点でTTLを減算した結果0となってしまうので、ルーターはICMP Time Exceededエラーを返答する。これが1台目のルーターの結果となる。次にTTLを2にして送出すれば、2台目のルーターの結果が得られる。

 このように、目的のホストに到達するまでTTLを増加させつつ次々にパケットを送出することで、tracerouteの結果を得ることができるというわけだ。

コラム:なぜUDPパケットでも調査に使用できるのか

 LinuxやmacOSでは、tracerouteコマンドのためにICMPではなくUDPパケットを使用することもできる(Linuxでは逆にデフォルトがUDPとなっている)。

 tracerouteなどのネットワーク経路の調査にはICMPの機能を利用すると理解している人からすると違和感があるかもしれないが、上記のようなtracerouteの動作原理が分かればそれほど不思議でもなくなるはずだ。

 つまり、「調査の根拠となるのは往路ではなく復路のICMPパケットだ」ということである。例えば、tracerouteではICMP Time Exceededエラーを返答してくれればよいので、往路のパケットはICMPでもUDPでも関係がなく、IPパケットであればよい。これは、ICMPがIPネットワークにおけるエラーを通知するためのプロトコルであるからだ。「主役は復路のICMPパケットである」というICMPの特性をうまく活用したコマンドである。

対応していないルーターも存在する

 なお、調査するホストによっては次のような結果が得られることもある。

	:
  2    40 ms    40 ms    40 ms  tokyo-gate.isp.xx.jp [203.xxx.xxx.xxx]
  3    * * *
  4    40 ms    40 ms    30 ms  xxx.xxx.isp.xx.jp [203.xxx.xxx.xxx]
	:

 これは、このルーターがICMP Time Exceededに対応していないために起こる。

 前述のように、tracerouteはICMP Time Exceededエラーの結果を受け取らなければ結果を表示できない。この例では、3番目のルーターからエラーが返らず、tracerouteコマンドがタイムアウトをしてこのような表示になっていると考えられる。

 また、単に対応していないというだけでなく、ルーターによってはセキュリティ上の要件からICMPパケットをフィルタしている場合もある。主にISPの管理するルーターではそうしたケースが多いようだ。

関連ネットワーク・コマンド/ツール

ping 〜ネットワークの疎通を確認する

traceroute(tracert) 〜ネットワークの経路を調査する

route 〜ルーティングテーブルの設定/表示


ネットワークコマンド使い方


更新履歴

【2017/01/10】最新の状況に合わせて内容を精査の上、更新しました

【2001/08/30】初版公開


Copyright© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。