traceroute / mtr 入門 - 経路をたどって遅延区間を特定する
この記事で解決できること
tracerouteで 宛先までの経路(どのルータを通るか) を可視化できるmtrで 各ホップのパケットロスと遅延を継続測定 し、どの区間が原因かを切り分けられる- 出力の
* * *や「途中ホップのロス」を 誤読せず正しく解釈 できる
結論(読みの型)
- 経路と到達点を一度だけ見たい →
traceroute - どの区間でロス・遅延が起きているかを見たい →
mtr - 中間ホップだけのロスは無視してよい(ICMP レート制限)。最終ホップまで伝播するロスが本物
前提(対象環境)
- OS: Ubuntu / 一般的な Linux
traceroute/mtrは別パッケージ。未導入ならsudo apt install traceroute mtr-tiny
traceroute は何をしているのか?
結論: TTL を 1 から順に増やしてパケットを送り、各ルータが返す ICMP Time Exceeded から経路を 1 ホップずつ復元している。
IP パケットには TTL(Time To Live) という「あと何台のルータを通過できるか」のカウンタがある。ルータは転送のたびに TTL を 1 減らし、0 になったパケットは破棄して送信元へ ICMP Time Exceeded を返す。
traceroute はこれを逆手に取る。
- TTL=1 のパケットを送る → 1 台目のルータで TTL が 0 になり、そのルータが応答 → 1 ホップ目が判明
- TTL=2 を送る → 2 台目が応答 → 2 ホップ目が判明
- 宛先に届くまで TTL を増やし続ける
各ホップで既定 3 回プローブを送るため、出力には 3 つの往復時間(RTT)が並ぶ。
$ traceroute example.com
traceroute to example.com (93.184.216.34), 30 hops max, 60 byte packets 1 _gateway (192.168.1.1) 0.512 ms 0.498 ms 0.471 ms 2 10.0.0.1 (10.0.0.1) 4.231 ms 4.118 ms 4.090 ms 3 * * * 4 93.184.216.34 (93.184.216.34) 12.043 ms 11.998 ms 12.110 ms
traceroute の * * * は障害なのか?
結論: 多くの場合は障害ではない。途中ルータが ICMP/UDP 応答を返さない設定なだけで、その先まで到達できていれば経路は正常。
* * * は「3 回のプローブすべてに応答がなかった」という意味で、原因は主に次のいずれか。
- そのルータが TTL 超過への応答を抑制している(ファイアウォール / ポリシー)
- UDP プローブを遮断している(Linux traceroute の既定は UDP)
- 応答のレート制限にかかった
判定基準: * * * の 後のホップが応答していれば経路は通っている。最終ホップ(宛先)まで * が続く場合だけ、その区間より先の到達性を疑う。
UDP が遮断されている疑いがあるなら、プローブ方式を変える。
# ICMP Echo(ping と同じパケット種別)で試す $ sudo traceroute -I example.com # TCP SYN を 443 番に送る(HTTPS が通る経路なら最も実態に近い) $ sudo traceroute -T -p 443 example.com
-I(ICMP)/ -T(TCP)は raw socket を使うため root 権限が必要(sudo)。既定の UDP モードは一般ユーザーでも実行できる。
traceroute のよく使うオプションは?
結論: 実務でまず覚えるのは
-n(DNS 解決を省いて高速化)、-T -p(TCP で確認)、-m(最大ホップ数)の 3 つ。
| オプション | 意味 |
|---|---|
-n |
IP を名前解決しない(速い・逆引き不要) |
-I |
ICMP Echo でプローブ |
-T |
TCP SYN でプローブ(-p でポート指定) |
-p PORT |
宛先ポート(-T と併用、例 443) |
-m N |
最大ホップ数(既定 30) |
-q N |
1 ホップあたりのプローブ数(既定 3) |
-w SEC |
応答待ちタイムアウト秒 |
# 数値表示・最大 20 ホップ・各ホップ 1 プローブで素早く $ traceroute -n -m 20 -q 1 example.com
DNS の逆引きで待たされて遅く感じるときは、まず -n を付ける。
mtr は traceroute と何が違うのか?
結論: traceroute が「経路の一回スナップショット」なのに対し、mtr は経路上の全ホップへ ping を撃ち続け、ロス率と遅延統計をリアルタイム更新する。
ネットワークの不調は瞬間的に出たり消えたりする。traceroute の一度きりの結果では「たまたま」を拾えない。mtr は traceroute(経路探索)と ping(継続測定)を合体させ、各ホップを連続監視する。
$ mtr example.com
Packets Pings Host Loss% Snt Last Avg Best Wrst StDev 1. _gateway 0.0% 20 0.5 0.6 0.4 1.2 0.2 2. 10.0.0.1 0.0% 20 4.2 4.3 4.0 6.1 0.5 3. 203.0.113.1 10.0% 20 18.0 19.4 17.2 41.0 5.1 4. 93.184.216.34 0.0% 20 12.0 12.1 11.9 12.4 0.1
各列の意味は次のとおり。
- Loss%: そのホップで応答が返らなかった割合
- Snt: 送ったプローブ数
- Last / Avg / Best / Wrst: 直近 / 平均 / 最小 / 最大の RTT(ms)
- StDev: RTT のばらつき(大きいほど不安定)
mtr のロスはどう読むのか?
結論: 中間ホップだけにロスが出て最終ホップで 0% に戻るなら、それは ICMP レート制限による偽のロス。最終ホップまで続くロスだけが本物の障害。
これが mtr 最大の落とし穴であり、最重要ポイント。上の出力例ではホップ 3 が 10.0% のロスを示すが、最終ホップ 4 は 0.0% に戻っている。
ルータは「自分宛ての TTL 超過応答」を低優先度で処理・抑制することがある。つまりホップ 3 の 10.0% は「ホップ 3 のルータが応答を間引いただけ」で、通信そのものは素通りしている。
判定ルール
- 中間ホップのロス → 最終ホップに伝播していなければ無視(ICMP レート制限の偽陽性)
- 最終ホップ(宛先)のロス → 本物のパケットロス。その手前で初めてロスが立ち上がる区間が原因箇所
つまり「ロスがどのホップから始まり、最後まで続くか」を見る。途中で消えるロスは捨てる。
遅延区間はどう特定するのか?
結論: Avg が大きく跳ね上がり、その値が以降のホップでも維持されていれば、跳ねた区間が遅延の発生源。一瞬跳ねて戻るのは応答処理の遅れで実害なし。
遅延もロスと同じ読み方をする。
- あるホップで Avg が急増し、それ以降のホップでも高いまま → その区間(直前ホップ→当該ホップ間)が真の遅延源
- あるホップだけ Wrst だけが突出して Avg は低い → そのルータが応答を後回しにしただけ。実通信の遅延ではない
# レポートモード: 10 サイクル送って結果を確定出力(ログ共有・チケット添付向け) $ mtr -rwzbc 10 example.com
オプションの意味:
-r/--report: 対話画面ではなく集計結果を 1 回出力-w: ワイド表示(ホスト名を省略しない)-z: 各ホップの AS 番号を表示(どの事業者の網かが分かる)-b: ホスト名と IP の両方を表示-c N: 送信サイクル数(既定 10)-n: 名前解決しない(速い)
障害報告を ISP やインフラ担当に送るときは mtr -rwzbc 100 宛先 のように サイクル数を増やした report 出力を添えると、ロス率の信頼性が上がり話が早い。
traceroute と mtr の使い分けまとめ
結論: 経路を一度確認するだけなら traceroute、どの区間でロス・遅延が起きているかを継続的に切り分けるなら mtr。報告には mtr のレポート出力を添える。
| 状況 | 使うもの |
|---|---|
| 宛先までの経路を一度だけ見たい | traceroute -n |
UDP が遮断され * * * が続く |
traceroute -T -p 443 |
| どの区間でロス・遅延か継続測定したい | mtr 宛先 |
| 障害報告として結果を共有したい | mtr -rwzbc 100 宛先 |
やりがちな誤読
- 中間ホップの
* * *を「障害」と即断する - 中間ホップのロスを真に受ける(最終ホップで 0% に戻る偽陽性)
- 一度の traceroute だけで「問題なし」と結論づける