tracerouteは、ICMPプロトコルまたはUDPプロトコルを使用して目的のホストまでの経路上のルータをトレースします。なお、Windowsの場合は類似のコマンドでtracertというのがあります。WindowsのtracertはICMPプロトコルを使用しますが、LinuxはUDPを使用しするなど、OSによってプロトコルに違いがある場合があります。そのため、WindowsとLinuxでは結果が異なったりします。
また、後述するように最近のLinuxに添付されているtracerouteはオプションによってICMPやTCPを切り替える機能も持っていますので知っておくと幸せになれることがあるかもしれません。
以下の記事はCentOS 6.4で確認してあります。
CentOS 6のminimal構成ではtracerouteはデフォルトでインストールされませんので、インストールが必要です。
$ sudo yum install traceroute
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: ftp.riken.jp
* epel: ftp.kddilabs.jp
* extras: ftp.riken.jp
* rpmforge: mirror.hmc.edu
* updates: centos.ustc.edu.cn
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package traceroute.x86_64 3:2.0.14-2.el6 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
===================================================================================
Package Arch Version Repository Size
===================================================================================
Installing:
traceroute x86_64 3:2.0.14-2.el6 base 51 k
Transaction Summary
===================================================================================
Install 1 Package(s)
Total download size: 51 k
Installed size: 80 k
Is this ok [y/N]: y
Downloading Packages:
traceroute-2.0.14-2.el6.x86_64.rpm | 51 kB 00:03
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
Installing : 3:traceroute-2.0.14-2.el6.x86_64 1/1
Verifying : 3:traceroute-2.0.14-2.el6.x86_64 1/1
Installed:
traceroute.x86_64 3:2.0.14-2.el6
Complete!
基本的な使い方ですが、tracerouteの実行に必須のオプションはターゲットとなるホストまたはIPアドレスです。
# traceroute google.co.jp
traceroute to google.co.jp (xxx.xxx.xxx.xxx), 30 hops max, 60 byte packets
1 192.168.245.2 (192.168.245.2) 0.397 ms 0.416 ms 0.266 ms
2 * * *
3 * * *
4 * * *
5 * * *
(省略)
25 * * *
26 * * *
27 * * *
28 * * *
29 * * *
30 * * *
Linux版のtracerouteに何もオプション与えなければ、アスタリスク(*)が表示されて経路情報が表示されません。ちなみにwindowsから実行するとこんな感じになります。
C:\>tracert google.co.jp
google.co.jp [xxx.xxx.xxx.xxx] へのルートをトレースしています
経由するホップ数は最大 30 です:
1 1 ms 1 ms 2 ms xxx.xxx.xxx.xxx(途中のルートは伏せています。)
2 11 ms 15 ms 11 ms xxx.xxx.xxx.xxx
3 12 ms 10 ms 11 ms xxx.xxx.xxx.xxx
4 13 ms 11 ms 11 ms xxx.xxx.xxx.xxx
5 12 ms 11 ms 12 ms xxx.xxx.xxx.xxx
6 13 ms 10 ms 11 ms xxx.xxx.xxx.xxx
7 12 ms 14 ms 16 ms xxx.xxx.xxx.xxx
8 11 ms 10 ms 11 ms xxx.xxx.xxx.xxx
9 12 ms 11 ms 11 ms xxx.xxx.xxx.xxx
10 12 ms 10 ms 12 ms xxx.xxx.xxx.xxx
11 12 ms 11 ms 11 ms xxx.xxx.xxx.xxx
トレースを完了しました。
Linuxで有効な経路情報を取得するためには、Windowsと同じくICMPパケットでtracerouteをする必要があります。ICMPパケットでtracerouteを行うためには、-Iオプションをつけます。-Iオプションを利用するにはroot権限が必要です。こうすることでWindows版と同様に下のような経路情報を取得することが出来ます。(途中のルートは伏せています。)
# traceroute google.co.jp -I
traceroute to google.co.jp (xxx.xxx.xxx.xxx), 30 hops max, 60 byte packets
1 xxx.xxx.xxx.xxx(途中のルートは伏せています。) 0.216 ms 0.155 ms 0.132 ms
2 xxx.xxx.xxx.xxx 3.272 ms 3.191 ms 3.240 ms
3 xxx.xxx.xxx.xxx 14.516 ms 14.432 ms 14.013 ms
4 xxx.xxx.xxx.xxx 12.921 ms 12.485 ms 11.850 ms
5 xxx.xxx.xxx.xxx 11.321 ms 10.989 ms
6 xxx.xxx.xxx.xxx 16.748 ms 13.777 ms 13.589 ms
7 xxx.xxx.xxx.xxx 11.122 ms 14.226 ms 14.062 ms
8 xxx.xxx.xxx.xxx 16.380 ms 15.119 ms 14.931 ms
9 xxx.xxx.xxx.xxx 49.735 ms 12.487 ms 12.325 ms
10 xxx.xxx.xxx.xxx 12.181 ms 14.035 ms 13.597 ms
11 xxx.xxx.xxx.xxx 13.171 ms 12.655 ms 12.479 ms
12 xxx.xxx.xxx.xxx 12.114 ms 13.051 ms 12.678 ms
代表的なオプションを以下に掲載します。この辺はディストリごとに異なっていることが多いので、man tracerouteで確認してください。 CentOSでは-Iや-Tオプションがありますが、ディストリビューションによってはないと思います。
オプション | 概要 |
---|---|
-I | UDPパケットではなく、ICMP Echo Requestを用いる(root権限が必要) |
-T | UDPパケットではなく、TCP SYN Packetを用いる(root権限が必要) |
-p | 使用するUDPパケットのポート番号を指定する(DPパケットを使用する場合のみ) |
-i | 指定されたインターフェイス(ネットワークカード名)を用いて実行する。 |
-s | 指定されたIPアドレスから実行する(Source Addressを指定する) |
-f | fで指定されたTTLからチェックする。つまりTTLの開始値を指定する。10と指定した場合は10ホップ以上離れたルータから表示しはじめます。 |
-m | mで指定されたTTLまでしかチェックしない。つまりTTLの最大値を指定する。20と指定した場合は20ホップ離れたルータまで表示します。デフォルトは30です。 |
-q | 1つのゲートウェイに対する試行回数を指定する。デフォルトは3です。 |
-t | パケットのTOS(Type Of Service:サービスタイプ)を指定された値に設定する |
-w | タイムアウト時間を秒で指定する。デフォルトは5秒です。 |
tracerouteはホップ数が多いと結構時間がかかるので計測時間節約の場合には、TTL(ホップ数)の開始値(-fオプション)、TTLの最大値(-mオプション)、試行回数(-qオプション)、タイムアウト(-wオプション)を指定することで短縮することができる。
# traceroute -I -f 3 google.co.jp
traceroute to google.co.jp (xxx.xxx.xxx.xxx), 30 hops max, 60 byte packets
3 xxx.xxx.xxx.xxx(途中のルートは伏せています。) 14.516 ms 14.432 ms 14.013 ms
4 xxx.xxx.xxx.xxx 12.921 ms 12.485 ms 11.850 ms
5 xxx.xxx.xxx.xxx 11.321 ms 10.989 ms
6 xxx.xxx.xxx.xxx 16.748 ms 13.777 ms 13.589 ms
7 xxx.xxx.xxx.xxx 11.122 ms 14.226 ms 14.062 ms
8 xxx.xxx.xxx.xxx 16.380 ms 15.119 ms 14.931 ms
9 xxx.xxx.xxx.xxx 49.735 ms 12.487 ms 12.325 ms
10 xxx.xxx.xxx.xxx 12.181 ms 14.035 ms 13.597 ms
11 xxx.xxx.xxx.xxx 13.171 ms 12.655 ms 12.479 ms
12 xxx.xxx.xxx.xxx 12.114 ms 13.051 ms 12.678 ms
# traceroute -I -m 10 google.co.jp
traceroute to google.co.jp (xxx.xxx.xxx.xxx), 10 hops max, 60 byte packets
1 xxx.xxx.xxx.xxx(途中のルートは伏せています。) 0.216 ms 0.155 ms 0.132 ms
2 xxx.xxx.xxx.xxx 3.272 ms 3.191 ms 3.240 ms
3 xxx.xxx.xxx.xxx 14.516 ms 14.432 ms 14.013 ms
4 xxx.xxx.xxx.xxx 12.921 ms 12.485 ms 11.850 ms
5 xxx.xxx.xxx.xxx 11.321 ms 10.989 ms
6 xxx.xxx.xxx.xxx 16.748 ms 13.777 ms 13.589 ms
7 xxx.xxx.xxx.xxx 11.122 ms 14.226 ms 14.062 ms
8 xxx.xxx.xxx.xxx 16.380 ms 15.119 ms 14.931 ms
9 xxx.xxx.xxx.xxx 49.735 ms 12.487 ms 12.325 ms
10 xxx.xxx.xxx.xxx 12.181 ms 14.035 ms 13.597 ms
他にも、環境によっては複数NICがあることがあると思いますので、-iや-sオプションでNICやIPアドレスを指定することもできますので、環境によっては試してみてください。