traceroute / tracertの挙動を調べたら感動した話
はじめに
ネットワークエンジニアなら一度はお世話になったことのある「tracert / traceroute」
要は特定のホスト、IPアドレスまでの経路を調べる、と言うものです。ただこれの仕組みを良く理解しないまま自分は使っており、実際にその挙動を調べたら非常に良くできていたのでシェアします。
traceroute / tracertって何?
そもそも「tracert / traceroute」って何って話なんですが、これはICMP ( pingコマンドが有名 ) プロトコルを使って特定のIP/ホストまでの経路を調べるコマンドです。
tracertは昔Linuxで文字数の制限があったとかで tracertという名前になり、Windowsでは tracerouteと名前がリネームされたとかどうとか。
またここで出てくる pingは、特定のIPアドレス / ホストに送ると「応答あり、到達不能、タイムアウト」のようなステータスが返ってきます。
pingにはTTLがある
ちなみに ping では TTL(Time To Live) という概念が存在します。これは最終地点までにどれだけの中継地点を経由できるか、を設定できます。これにより例えば経由地点が無限にあり、ネットワークリソースが無限ループして使われないようにするための予防策として使われてます。
このTTLをハックするとpingで経路がわかります。
説明を省略するために以下のようなネットワーク図を紹介します。
- 自分のパソコン (IP: 192.168.1.5)
- 自分のネットワークの出口 (IP: 192.168.1.1)
- 別のネットワーク機器 (IP: 172.168.1.3)
- 最終ネットワーク機器 (IP: 172.168.1.16)
この場合に ping 172.168.1.16
を実行すると、最終ネットワーク機器から自分のパソコンへ「応答あり、到達不能、タイムアウト」のいずれかの結果が1度返ってきます。ここでは必ず応答があるものとして「応答あり」としましょう。
この場合、1-4までは3つの機器を経由する必要があるのでTTL=3であれば十分に到達します。これをTTL=1とするとどうなるでしょうか。
macの場合: ping -m 1 172.168.1.16
として TTL=1 ( -m 1 ) とするとどうなるでしょうか。TTL=1とすると到達できる距離は 2. 自分のネットワークの出口 (IP: 192.168.1.1)
と言うことになります。ただ ping の 172.168.1.16には到達してないことから、2. 自分のネットワークの出口
のマシンから「タイムアウト ( Time-to-live exceeded)」のメッセージが届くのです。
じゃあこれを ping -m 2 172.168.1.16
で送ると今度は3. 別のネットワーク機器から 「タイムアウト ( Time-to-live exceeded)」が届き、ping -m 3 172.168.1.16
でようやく4のマシンから「応答あり」が届くようになります。
これを何度も繰り返すことで最終到達地点までの経路を可視化することが可能になります、
traceroute / tracertには2つのバージョンがある
traceroute / tracertのコマンドでは、Windows系では ICMPプロトコルを利用し、Linux/Unix (macはこれ)はUDPパケットを使い、このTTLを1から順番に大きくしていって経路を確認しています。
UDPの場合は、タイムアウト (Time-to-live exceeded) が連続して続いた後に最終地点に辿り着くと「到達不能 - Destination unreachable (Port unreachable)」が返ってきます。これは適当に指定したUDPポートがそもそも解放されてないので使えませんよ、とマシン側が教えてくれてる結果で、このことからそのマシンのIPは存在し、到達したと判定しているようです。
おまけ
以下の Youtube動画は非常にわかりやすく視覚的にわかる内容です。