なぜそのパケットは届かないのか?tracerouteの「TTL」という名の深淵を覗く
ネットワークエンジニアとして数え切れないほどの深夜の障害対応をこなしてきましたが、いまだに現場で最も信頼を置いているのは、高価な監視ツールではなく、この地味な traceroute です。
「疎通が取れない」というアラートが飛んできたとき、多くのエンジニアはまず ping を打ちますが、それだけでは「どこで止まっているか」という一番重要な情報が欠落しています。そこで真価を発揮するのが traceroute です。今回は、このツールが内部でどのように「経路の闇」を照らし出しているのか、その根幹である TTL (Time to Live) の仕組みを掘り下げていきましょう。
—
TTL制御:パケットに与えられた「余命」の物語
traceroute は非常に巧妙な仕組みで成り立っています。IPヘッダーにある TTL フィールドを、いわばパケットの「寿命(残りホップ数)」として利用するのです。
基本原理:わざとエラーを誘発する
1. TTL=1で出発: まず、送信元は TTL を 1 に設定したパケットを送出します。
2. ルーターの反応: 最初のルーターに到達すると、ルーターは TTL をデクリメント(1減算)します。TTL が 0 になったため、ルーターは「寿命が尽きた」と判断し、パケットを破棄すると同時に、送信元に対して ICMP Time Exceeded (タイプ11) というエラー通知を返します。
3. 経路の特定: 送信元はこのエラー通知を受け取ることで、「1ホップ先のルーターのIPアドレス」を知ることができます。
4. インクリメント: 次に送信元は TTL を 2 にして送出します。すると、2番目のルーターで同様の処理が発生し、その場所が特定されます。
これを繰り返すことで、目的地までのルーターを一つずつ「あぶり出していく」わけです。
—
実践:現場で使えるデバッグのテクニック
現代のインフラ運用では、単純な traceroute だけでは不十分なことも多いです。特にセキュリティポリシーで ICMP が遮断されている環境や、ロードバランサーが介在するWeb APIのデバッグでは工夫が必要です。
1. TCP/UDPポートを指定する(実務Tips)
デフォルトの traceroute はICMPやUDPを使いますが、ファイアウォールでブロックされがちです。そんな時は、Web APIのポート(443など)を狙い撃ちします。
# TCP SYNパケットを送信して経路を追跡する(Linuxのtracerouteコマンド例)
# 443ポートを指定することで、実際のアプリ通信に近い経路が見えてくる
traceroute -T -p 443 example.com
2. Pythonでパケットを操る
もし、特定のホップまでしかパケットが届かないようなトリッキーな経路問題を調査する場合、scapy を使ったパケット生成が非常に強力です。
from scapy.all import *
# 宛先IPを指定
target_ip = "1.1.1.1"
# TTLを1から順にインクリメントしながらパケットを投げるシミュレーション
for i in range(1, 10):
pkt = IP(dst=target_ip, ttl=i) / TCP(dport=443, flags="S")
reply = sr1(pkt, timeout=2, verbose=0)
if reply is None:
print(f"TTL={i}: タイムアウト(パケットが消失)")
elif reply.type == 11: # ICMP Time Exceeded
print(f"TTL={i}: 経由ルーター -> {reply.src}")
else:
print(f"TTL={i}: 到達成功!")
break
—
気をつけてほしい「落とし穴」
ベテランのエンジニアほど、traceroute の結果を鵜呑みにしません。以下の点には常に注意を払ってください。
- ECMP(Equal-Cost Multi-Path)の罠: 現代のデータセンターでは、同じ宛先でもパケットごとに経路が変わることがあります。
tracerouteが表示する経路は「ある一瞬の、一つのパケットの経路」に過ぎません。複数の結果がバラつく場合は、ロードバランサーやマルチパスルーティングを疑いましょう。 - ICMP制限: 多くのルーターは、制御プレーンを守るために
ICMP Time Exceededの生成をレートリミットしています。* * *と表示されるからといって、必ずしもそこで通信が止まっているわけではありません。 - 非対称ルーティング: 行き(往路)の経路と帰り(復路)の経路が全く異なることは、インターネットの世界では日常茶飯事です。
tracerouteはあくまで「行きの経路」しか教えてくれないことを忘れないでください。
—
最後に:ツールを使いこなすということ
traceroute は単なるコマンドではありません。パケットが物理的な光ファイバーを駆け抜け、ルーターのASICでスイッチングされ、OSのスタックを叩く。その一連のドラマを想像しながら結果を見ることで、見えてくる世界が変わります。
「繋がらない」と嘆く前に、まずは TTL という小さな値に想いを馳せ、パケットがどのルーターで息を引き取っているのか、そのログを冷静に分析してみてください。その先に、必ず障害の突破口があります。
現場からは以上です。次回のインシデント対応でお会いしましょう。
コメント