UNIX/Linuxの部屋 tracerouteコマンドの使い方

TOP UNIX/Linuxの部屋 UNIX/Linuxコマンド一覧 用語集 新版 由来/読み方辞書 環境変数マニュアル Cシェル変数 システム設定ファイル システムコール・ライブラリ ネットワークプログラミングの基礎知識 クラウドサービス徹底比較・徹底解説




コマンド traceroute ネットワークの接続経路を表示する このエントリーをはてなブックマークに追加

UNIX/Linux の traceroute コマンドは、宛先までの送信経路を表示するコマンドである。Windows での tracert コマンドに相当する。



traceroute コマンドの基本的な使い方
引数にホスト名や IP アドレスを指定すると、対象ホストまでのルートを調べて表示する。
% traceroute www.jp.freebsd.org
traceroute to www.jp.freebsd.org (211.14.6.xxx), 64 hops max, 40 byte packets
 1  192.168.10.1 (192.168.10.1)  2.350 ms  1.478 ms  1.334 ms
 2  fnbnifxxx.asahi-net.or.jp (211.13.148.xxx)  10.609 ms  3.868 ms  4.364 ms
 3  fnbnip-gexxx.asahi-net.or.jp (211.13.148.xxx)  5.701 ms  4.496 ms  4.971 ms
 4  tkybi1-vxxx.asahi-net.or.jp (202.224.33.xxx)  10.987 ms  9.615 ms  9.447 ms
 5  kddnixxx.asahi-net.or.jp (202.224.32.xxx)  10.926 ms  9.671 ms  9.439 ms
 6  AS9607-xxx.ix.jpix.ad.jp (210.171.224.xxx)  10.889 ms  9.854 ms  10.633 ms
 7  ethernet1-xxx.core03.colo01.bbtower.ad.jp (211.14.3.xxx)  11.117 ms  10.251 ms  10.055 ms
 8  GigabitEthernet0-xxx.edge15.colo01.bbtower.ad.jp (203.141.63.xxx)  11.791 ms  10.740 ms  10.827 ms
 9  FreeBSD.demarc.colo01.bbtower.ad.jp (211.14.4.xxx)  11.273 ms  10.272 ms  10.532 ms
10  updraftxxx.jp.freebsd.org (211.14.6.xxx)  11.131 ms  9.600 ms  10.599 ms

traceroute の仕組み解説
ネットワーク上で送受信されるパケットのヘッダには、TTL というフィールドが存在する。TTL とは Time To Live の略で、そのパケットが「ネットワークで生存できる時間」を表している。TTL はパケットを生成したホストが決定する。

パケットがルータを 1つ通過するたびに TTL の値は 1 だけ引かれていき、TTL が 0 になったら、その時点でパケットを破棄し、生成元のホストに「こちらでパケットを破棄しました」という意味の ICMP TIME EXCEEDED というパケットを返す。

traceroute コマンドを実行すると、対象のホストに向けて UDP パケットを送信する。一番最初のパケットは、TTL に 1 をセットする。すると、隣接するルータから ICMP TIME EXCEEDED が届くことになる。

次に TTL を 2 にして UDP パケットを送信し、その次のルータから ICMP TIME EXCEEDED を受けとる。
ICMP TIME EXCEEDED には、どのルータでパケットが破棄されたかという IP アドレスが記録されているので、1つずつ TTL を増やしたパケットを送信すれば、結果としてパケットが通過した経路がわかる。

TTL をひとつずつあげていくと、いつかは UDP パケットが対象のホストに届く。traceroute が送信する UDP パケットはポート番号 33434〜33499 あたりであるが、このポートは大抵の場合は誰も使っていないため、対象ホストから ICMP Port Unreachable というパケットが返される。この ICMP が届けば対象ホストに到達したことがわかるわけだ。万が一 traceroute が使用するポート番号を対象ホストが本当に使用していたら、うまく動作しないと思われる。

TTL は規格上は文字通り「生存可能時間」を表すことになっている。1 つのゲートウェイの通過に 3 秒かかったら、そのゲートウェイでは TTL を -3 しなければならない。しかし現実には秒数に関係なく TTL は -1 される。

traceroute は同じ TTL で UDP データグラムを 3つ送信する。よって、上記の実行例のように
4 tkybi1-vxxx.asahi-net.or.jp (202.224.33.xxx) 10.987 ms 9.615 ms 9.447 ms
と 3パケット分の往復時間が記録されるわけである。

もし ICMP TIME EXCEEDED が返ってこなかった場合は、
6 AS9607-xxx.ix.jpix.ad.jp (210.171.224.xxx) 10.889 ms 9.854 ms 10.633 ms
7 * * *
8 GigabitEthernet0-xxx.edge15.colo01.bbtower.ad.jp (203.141.63.xxx) 11.791 ms 10.740 ms 10.827 ms
とアスタリスクが表示される (3回とも返ってこなかったのでアスタリスクが 3つある)。

失敗例
うまくいかない例も紹介しよう。以下は www.yahoo.co.jp に traceroute した例である。
% traceroute www.yahoo.co.jp
traceroute: Warning: www.yahoo.co.jp has multiple addresses; using 210.81.150.5
traceroute to www.yahoo.co.jp (210.81.150.5), 64 hops max, 40 byte packets
 1  192.168.10.1 (192.168.10.1)  4.380 ms  1.834 ms  1.765 ms
 2  fnbnifxxx.asahi-net.or.jp (211.13.148.xxx)  6.701 ms  5.574 ms  4.869 ms
 3  fnbnip-gexxx.asahi-net.or.jp (211.13.148.xxx)  8.540 ms  6.278 ms  6.345 ms
 4  tkybi1-vxxx.asahi-net.or.jp (202.224.33.xxx)  12.398 ms  12.175 ms  14.541 ms
 5  tkynixxx.asahi-net.or.jp (202.224.32.xxx)  12.803 ms  14.620 ms  10.159 ms
 6  asxxx.nspixp2.wide.ad.jp (202.249.2.xxx)  13.070 ms  10.219 ms  14.613 ms
 7  61.204.214.xxx.bb.t.pwd.ne.jp (61.204.214.xxx)  17.989 ms  11.716 ms  11.519 ms
 8  210.141.225.xxx (210.141.225.xxx)  103.054 ms  13.453 ms  11.172 ms
 9  0.so-xxx-0-0.GW2.TKO6.Alter.Net (210.80.4.xxx)  14.697 ms  11.934 ms  11.025 ms
10  yahoo-jp-gw.aspac.customer.alter.net (210.81.5.xxx)  12.262 ms  15.934 ms  19.889 ms
11  210.81.152.26 (210.81.152.26)  13.477 ms  11.983 ms  11.975 ms
12  * * *
13  * * *
14  * 210.81.150.5 (210.81.150.5)  14.156 ms !X *
15  * * *
16  * * 210.81.150.5 (210.81.150.5)  12.449 ms !X
17  * * *
(略。この間は「*」か210.81.150.5 からの !X のいずれか)
64  * * *
www.yahoo.co.jp に到達できないまま、最大ホップである 64 に到達したため、traceroute は終了してしまった。ホップ 14 や 16 で www.yahoo.co.jp からの応答があるのに traceroute はその時点で終了していないことに注意。ホップ 14 は、ひとつめの結果が「*」、2つめの結果が「210.81.150.5 14.156 ms !X」、3つめの結果が「*」となっている。traceroute は何かしらの異常があった場合、時間の後に「!注釈」というメッセージを表示する。主要な注釈を以下に示す。
! 応答の TTL が 1以下。TTL が不正な ICMP TIME EXCEEDED が返されたということ
!N ネットワーク到達不能 (Network Unreachable: ICMP type3 code0)
!H ホスト到達不能 (Host Unreachable: ICMP type3 code1)
!P プロトコル到達不能 (Protocol Unreachable: ICMP type3 code2)
!S ソースルーティング失敗 (Source Route Failed: ICMP type3 code5)
!F-[MTU値] フラグメンテーションが必要 (Fragmentation Needed and Don't Fragment was Set: ICMP type3 code4)
!X 管理上、通信が禁止されている (Communication Administratively Prohibited: ICMP type3 code13 (code9 かも))
!V ホスト順序違反 (Host Precedence Violation: ICMP type3 code14)
!C 順序カットオフ発生 (Precedence cutoff in effect: ICMP type3 code15)
![コード番号] ICMP type3 code[コード番号] により到達不能 (違うかも)
つまり www.yahoo.co.jp は ICMP type3 code13 を送り返すことで「その通信は管理上禁止している」と通知してきたわけだ。なぜ「*」だったり「!X」だったりするのかはわからない。

traceroute コマンドのオプション
-S パケットのロス率 (何%のパケットが到着しなかったか) を表示する
-w [秒数] UDP パケットの返信を待つ秒数。デフォルトは 5
-q [パケット数] ホップあたりに送信する UDP パケットの数。デフォルトは 3
-m [最大 TTL] 最大の TTL を指定する。デフォルトは 64。小さ過ぎると対象ホストに到達できない
-f [初期 TTL] 最初に送信する TTL を指定する。デフォルトは 1。例えば -f 2 と指定すると、隣接するルータをスキップすることになる
-I UDP でなく、Windows の tracert のように ICMP echo を送信する

Windows では似たようなコマンドが tracert という名前で用意されている。ただし Windows の tracert は UDP でなく ICMP echo を送信することに注意。
>> FreeBSDオンラインマニュアル(man) FreeBSD traceroute(8)