目的のホストまでIPパケットがどのような経路で転送されていくかを確認したい場合や、通信経路に問題がないかどうかを調べたい場合は、「traceroute」コマンドが役立ちます。tracerouteはTCP/IPネットワークのトラブルシューティングにおける基本ツールの一つです。
本連載では、ネットワーク管理の基本コマンドを順を追って紹介していきます。基本書式と用法、主要なオプション、用例サンプルを示しますので、manやhelp代わりに通読し、各コマンドでできることを順次おさらいしてみてください。今回はIPネットワークの経路情報を確認する際に利用する基本コマンド「traceroute」を見ていきます。
なお、本連載では、執筆時点の最新版Red Hat Enterprise Linux(RHEL)およびCentOS環境で動作を確認しています。また、今回の用法事例はIPv4(Internet Protocol version 4)ネットワークを前提にしています。コマンドのサンプルなどで一部環境に依存した出力例となる場合がありますので、その際には適宜ご自身の環境に合わせて読み替えてください。また、本稿に出現するネットワーク通信特有の用語については「用語解説」の項目を設けて別途補足しています。本文と併せて理解に役立ててください。
tracerouteコマンドは、IPパケット(以降、「パケット」と記載した場合は基本的にIPパケットのことを指します)が通るリモートホストまでの経路を追跡し、その情報を出力します。パケットがどのような経路でリモートホストに到達するか、経路上のどこで障害が発生している可能性があるのかなどを調査できます。例えば、指定ホストからpingコマンドの応答が戻ってこない場合などで、経路の設定が正しく行われているかどうかを確認する際などに利用できます。
tracerouteコマンドでは、パケットのヘッダー部分に記録される「TTL(Time To Live)」という8ビットの情報を利用します。パケットにTTLが定義されている理由は、設定の誤りや存在しないホストに対するパケット送信が行われた場合に、行き場を失ったパケットがネットワーク上にあふれないようにするためです。
TTLは「生存時間」と訳されることもありますが、ここでいう生存時間とは、コンピューター間の通信においてパケットが有効な時間(ホップ数)を指します。例えば、「TTL=0」に設定されている通信であれば、同一ホスト内でのみ有効であり、どのルーターからも他のホストに転送(ホップ)されずに破棄されます。TTLの値は、転送されるごとに一つずつ減っていき、「TTL=0」になった時点でルーターはパケットを破棄し、そのことを通知するメッセージを送信元に返します。tracerouteは、この仕組みを応用したコマンドです。
tracerouteでは、目的のホストに対してTTLを一つずつ増やしたパケットを送信して経路情報を取得します。IPルーターは、受け取ったパケットが「TTL=0」になると送信元に対しパケットを破棄したことを通知します。この仕組みを使うとパケットの経路と通信に要した時間を測定できます。この一連の処理を目的のホストに到達するまで繰り返すことで、経路上の全てのルーターから応答を得られるというのが、tracerouteコマンドの仕組みです。
tracerouteコマンドでは、パケットがルーターやゲートウェイを通過すると、そのホスト名をFQDN形式で出力します。ホスト名がDNS(Domain Name System)サーバーの逆引きで取得できない場合には、IPアドレスのまま表示されます。
tracerouteコマンドは、パケットを送信してからパケット破棄の通知が返ってくるまでの時間を計測できるので、経路に存在する各ルーター(ゲートウェイ)と対象ホスト間の「RTT(Round Trip Time、往復通信時間)」を測定する目的にも利用されます。この時間を見ることで、2台のホスト間のどこでトラフィックが低下しているかを調査する助けにもなります。なお、Windows OSでは同様の機能が「tracert」コマンドとして用意されています。
tracerouteコマンドの主なオプション(引数)とそれぞれの意味は以下の通りです。
オプション | 意味 |
---|---|
-4 | 経路探索に使うアドレスをIPv4にする |
-6 | 経路探索に使うアドレスをIPv6(Internet Protocol virsion 6)にする |
-F | 送信するパケットを分割しない |
-I | デフォルトのUDPパケットの代わりにICMP ECHOを利用する |
-T | デフォルトのUDPパケットの代わりにTCP SYNを利用する |
-f TTL値 | TTLの値を指定する |
-g GATEWAY | ゲートウェイを指定する |
-i INTERFACE | 使用するネットワークインターフェースを指定する |
-m TTL値 | TTLの最大値を1〜255の範囲で指定する(デフォルトは30回) |
-n | ホスト名の名前解決を行わない(IPアドレスのみ表示) |
-p PORT_NO | UDPパケットのポート番号を指定する(デフォルトは33434番) |
-q | ゲートウェイに対する試行回数を指定する(デフォルトは3回) |
-s | 指定されたIPアドレスから実行する |
-w TIME | タイムアウトの時間を指定する(デフォルトは5秒) |
-z | パケットを送出する間隔を指定する(単位:ミリ秒) |
あるホストまでの経路を表示する場合、引数にそのドメイン名またはIPアドレスを指定してtracerouteコマンドを実行します。すると、経路上にどのようなルーター(ゲートウェイ)が位置しているかが結果として出力されます。
測定は、初期設定では三回実行されます。
下の実行結果を見ると分かるように各行で、FQDN(IPアドレス)、一回目の実行結果、二回目の実行結果、三回目の実行結果が出力されています。下の実行結果1行目の場合は、一回目が1.495ミリ秒、二回目が3.449ミリ秒、三回目が3.346ミリ秒であることが分かります。この出力結果は、送信元の環境から数えて1ホップ目から順に並んでいます。
表示された行(ホップ)のうち、明らかに他に比べ時間がかかっているものがある場合は、ルーターなどのゲートウェイにある機器が何らかの理由で処理に時間を要していると読み取れます。
$ traceroute atmarkit.co.jp traceroute to atmarkit.co.jp (202.218.219.147), 30 hops max, 60 byte packets 1 mydomain.com (192.168.12.1) 1.495 ms 3.449 ms 3.346 ms 2 provider1.dokoka.ne.jp (200.203.118.74) 7.780 ms 7.688 ms 8.663 ms 3 provider2.dokoka.ne.jp (200.203.118.65) 8.588 ms 9.720 ms 9.631 ms 4 provider3.dokoka.ne.jp (201.152.216.13) 11.014 ms 11.974 ms 11.887 ms 5 providergw.dokoka.ne.jp (215.169.163.41) 11.748 ms 11.632 ms 15.246 ms (以下略)
リモートホストを指定して呼び出すコマンドを実行した際に「Name or service not known」とエラーが返ってくる場合は、ホスト名の入力に誤りがあるかDNSサーバーによる名前解決に失敗していると考えられます。
目的のホストまでの経路の中に、(セキュリティ対策などの事情で)あえて反応を返さないよう設定されたルーターやゲートウェイがあることもあります。この場合は「Request timed out」という結果が出力されます。経路が断絶していたり、ルーターのルーティングテーブルに設定ミスがあったりした場合は「Destination host unreachable」という結果が出力されます。
こうした場合でも、以下のように「-n」オプションを指定して実行することで、名前解決を行わず、IPアドレスで結果を出力できるので、DNSサーバーと通信できない環境でも経路情報を確認できます。
$ traceroute -n atmarkit.co.jp traceroute to atmarkit.co.jp (202.218.219.147), 30 hops max, 60 byte packets 1 192.168.12.1 2.117 ms 2.006 ms 1.909 ms 2 200.203.118.74 8.293 ms 8.208 ms 8.092 ms 3 200.203.118.65 10.089 ms 10.002 ms 9.887 ms 4 201.152.216.13 11.646 ms 11.595 ms 11.522 ms 5 215.169.163.41 11.486 ms 11.409 ms 11.357 ms (以下略)
本稿で言及したコマンドに関連するネットワーク用語は次の通りです。必要に応じて参考資料も確認して理解を深めましょう。
IP(Internet Protocol)通信で用いられるパケットのこと。パケットデータには、TTLの情報を含め、複数のヘッダー情報が含まれています。詳しくは、連載「IPパケットの構造とIPフラグメンテーション」を参照ください。
コンピューター間のネットワーク通信において、自身の端末から見た、接続先のコンピューターのことをリモートホストと呼びます。例えば手元のPuTTY端末などからサーバーにログインして操作する場合、手元の端末から見てログインしたサーバーはリモートホストと呼ぶことができます。
IP(Internet Protocol)通信のルーティング処理を行う装置、またはソフトウエアのことを指します。
「完全修飾ドメイン名」とも呼びます。インターネット上の「住所」であるドメインを、省略なく記述したものです。「atmarkit.co.jp」のように、「.jp」までを含みます。
名前解決サーバーのこと。IPアドレスとドメイン名をひも付けて管理するサーバーです。Linux環境ではBINDというDNSサーバーが用いられる場合がほとんどです。他の実装として、BSDライセンスで公開されているUnbound/NSDなどもあります。本稿では、IPアドレスからFQDNを求めて出力する際の名前解決を行う「逆引き」で問い合わせをしています。
データを送信し、戻ってくるまでの時間を指します。伝送遅延が大きい場合にはRTTも大きくなります。
ICMPはインターネット技術の標準化団体「IETF(The Internet Engineering Task Force)」が「RFC 792」で定義する「Internet Control Message Protocol(インターネット制御通知プロトコル)」のことを指します。IPやARPなどのプロトコルと同じOSI参照モデルにおけるネットワーク層のプロトコルですが、TCP/IP通信の制御をになうため、トランスポート層のような振る舞いをします。過去に紹介したpingコマンドはこのICMPの通信を利用しています。
UDP(User Datagram Protocol)のデータのひとまとまりを指します。UDPはTCP同じトランスポート層のプロトコルですが、TCPと異なり、エラー時の再送処理や送出パケットの順序整列などの処理がないため、軽量で高速な伝送が可能です。詳しくは、ネットワーク用語辞典「UDP」を参照ください。
TCP/IP通信で接続する(コネクションを張る)際に行われる「3ウェイハンドシェイク」処理などで用いられる通信。
コンピューター間の通信で、ルーターを介するなどしてホスト間の転送が行われる場合、一つの転送を一ホップのように表現します。本稿で言及したTTLは、一ホップごとに「-1」がカウントされます。
ネットワーク機器が保有する経路(転送)情報の対応表を指します。詳しくは関連記事「イーサネットとルーティング」を参照ください。
Copyright © ITmedia, Inc. All Rights Reserved.