Linuxでtracerouteコマンドを使用する方法

  • tracerouteコマンドは、ネットワークパケットの移動の遅い部分を特定し、ネットワーク接続の遅延をトラブルシューティングするのに役立ちます。
  • TracerouteはTCP/IPプロトコルスイートを使用し、パケットがルーターを介して送信元から宛先に移動するまでの時間を判断するためにパケットを送信します。
  • traceroute(IPまたはURL)を実行して、パケットがサーバーに到達するまでの経路と、各中間ホップ間の時間を判断します。

Linuxのtracerouteコマンドを使用すると、ネットワークパケットの移動の遅い部分を特定し、ネットワーク接続の遅延をトラブルシューティングできます。その方法をご紹介します。

tracerouteの仕組み

tracerouteの仕組みを理解すると、結果を理解することがはるかに容易になります。ネットワークパケットが宛先に到達するまでに通過する経路が複雑であるほど、遅延が発生する可能性のある場所を特定することが困難になります。

小規模組織のローカルエリアネットワーク(LAN)は比較的単純である可能性があります。おそらく少なくとも1台のサーバーと1つまたは2つのルーターがあるでしょう。さまざまな場所またはインターネットを介して通信する広域エリアネットワーク(WAN)では、複雑さが増します。ネットワークパケットは、ルーターやゲートウェイなどの多くのハードウェアに遭遇し(転送され、ルーティングされます)。

データパケットのメタデータのヘッダーには、その長さ、送信元、送信先、使用しているプロトコルなどが記載されています。プロトコルの仕様はヘッダーを定義します。プロトコルを識別できれば、ヘッダー内の各フィールドの開始と終了を特定し、メタデータを読み取ることができます。

tracerouteはTCP/IPプロトコルスイートを使用し、ユーザーデータグラムプロトコルパケットを送信します。ヘッダーには、8ビットの整数値を含む存続時間(TTL)フィールドが含まれています。名前が示すものとは異なり、期間ではなくカウントを表します。

パケットはルーターを介して送信元から宛先に移動します。パケットがルーターに到着するたびに、TTLカウンターが減ります。TTL値が1に達すると、パケットを受信したルーターは値を減らし、ゼロになったことに気付きます。パケットは「タイムアウト」したため、破棄され、移動の次のホップに転送されません。

ルーターは、パケットのタイムアウトを知らせるために、インターネットメッセージ制御プロトコル(ICMP)のタイムアウトメッセージをパケットの送信元に送信します。タイムアウトメッセージには、元のヘッダーと元のデータパケットの最初の64ビットデータが含まれています。これは、Request for Comments 792の6ページ目に定義されています。

したがって、tracerouteがパケットを送信しますが、TTL値を1に設定すると、パケットは破棄される前に最初のルーターまでしか到達しません。ルーターからICMPタイムアウトメッセージを受信し、往復にかかった時間を記録できます。

次に、TTLを2に設定して演習を繰り返すと、2ホップ後に失敗します。tracerouteはTTLを3に増やし、再度試行します。このプロセスは、宛先に到達するか、最大ホップ数(デフォルトでは30)がテストされるまで繰り返されます。

正常に動作しないルーターがある

一部のルーターにはバグがあります。それらは、破棄してICMPタイムアウトメッセージを発生させるのではなく、TTLがゼロのパケットを転送しようとします。

シスコによると、一部のインターネットサービスプロバイダー(ISP)は、ルーターが中継するICMPメッセージの数をレート制限しています。

一部のデバイスはICMPパケットをまったく送信しないように構成されています。これは、デバイスが、スマーフ攻撃などの分散型サービス拒否に参加することを無意識のうちに強制されないようにするためです。

tracerouteの応答のデフォルトのタイムアウトは5秒です。5秒以内に応答を受信しない場合、試行は中止されます。つまり、非常に遅いルーターからの応答は無視されます。

tracerouteのインストール

tracerouteはFedora 31にすでにインストールされていましたが、Manjaro 18.1とUbuntu 18.04にインストールする必要があります。Manjaroにtracerouteをインストールするには、次のコマンドを使用します。

sudo pacman -Sy traceroute

Ubuntuにtracerouteをインストールするには、次のコマンドを使用します。

sudo apt install traceroute

Linuxでtracerouteを使用する

上で説明したように、tracerouteの目的は、コンピューターから宛先までの各ホップのルーターから応答を引き出すことです。口が堅く何も漏らさないものもあれば、ためらいなくすべてを漏らすものもあるでしょう。

例として、有名なブラーニーストーンがあるアイルランドのブラーニー城のWebサイトにtracerouteを実行します。伝説によると、ブラーニーストーンにキスをすると「おしゃべりの才能」に恵まれると言われています。途中で遭遇するルーターが適切におしゃべりであることを願っています。

次のコマンドを入力します。

traceroute www.blarneycastle.ie

最初の行には、以下の情報が示されています。

  • 宛先とそのIPアドレス。
  • tracerouteがギブアップするまでに試行するホップ数。
  • 送信するUDPパケットのサイズ。

その他すべての行には、1つのホップに関する情報が含まれています。ただし、詳細を掘り下げる前に、コンピューターとブラーニー城のWebサイトの間に11のホップがあることがわかります。ホップ11は、宛先に到達したことも示しています。

各ホップ行の形式は次のとおりです。

  • デバイスの名前、またはデバイスが自身を識別しない場合はIPアドレス。
  • IPアドレス。
  • 3つのテストのそれぞれで往復にかかった時間。ここにアスタリスクがある場合、そのテストに対する応答がなかったことを意味します。デバイスがまったく応答しない場合は、3つのアスタリスクが表示され、デバイス名またはIPアドレスは表示されません。

以下で得た内容を確認しましょう。

  • ホップ1:最初の寄港地(しゃれではありません)は、ローカルネットワーク上のDrayTek Vigorルーターです。これがUDPパケットがローカルネットワークを離れてインターネットに接続する方法です。
  • ホップ2:このデバイスは応答しませんでした。おそらくICMPパケットを送信しないように構成されていたのでしょう。または、応答したものの遅すぎて、tracerouteがタイムアウトした可能性があります。
  • ホップ3:デバイスは応答しましたが、名前を取得できず、IPアドレスのみを取得できました。この行にはアスタリスクがあることに注意してください。つまり、3つの要求すべてに応答が得られなかったことを意味します。これはパケット損失を示している可能性があります。
  • ホップ4と5:さらに匿名のホップ。
  • ホップ6:リモートデバイスが3つのUDP要求のそれぞれを処理したため、ここに多くのテキストがあります。各デバイスの(かなり長い)名前とIPアドレスが印刷されました。これは、大量のトラフィックを処理するためのハードウェアが多数ある「リッチな」ネットワークに遭遇した場合に発生する可能性があります。このホップは、英国最大のISPの1つにあります。したがって、同じリモートハードウェアが3つの接続要求を処理した場合、それは小さな奇跡でしょう。
  • ホップ7:これは、UDPパケットがISPのネットワークを離れたときに通過したホップです。
  • ホップ8:ここでも、デバイス名は取得できませんが、IPアドレスは取得できます。3つのテストすべてが正常に返されました。
  • ホップ9と10:さらに2つの匿名ホップ。
  • ホップ11:ブラーニー城のWebサイトに到着しました。城はアイルランドのコークにありますが、IPアドレスのジオロケーションによると、Webサイトはロンドンにあります。

したがって、それはまちまちでした。一部のデバイスは正常に機能し、一部のデバイスは応答しましたが名前を教えてくれず、他のデバイスは完全に匿名のままでした。

しかし、私たちは目的地に到着し、それが11ホップ離れていることがわかり、旅の往復時間は13.773ミリ秒と14.715ミリ秒でした。

デバイス名の非表示

ご覧のとおり、デバイス名を含めると、表示が乱雑になる場合があります。データを見やすくするために、-n(マッピングなし)オプションを使用できます。

この例でこれを行うには、次のように入力します。

traceroute -n blarneycastle.ie

これにより、ボトルネックを示す可能性のある往復タイミングの大きな数字を選びやすくなります。

ホップ3は少し疑わしくなり始めています。前回は2回しか応答せず、今回は1回しか応答しませんでした。このシナリオでは、もちろん、それは私たちの制御が及ばないことです。

ただし、会社のネットワークを調査していた場合は、そのノードをもう少し深く掘り下げる価値があります。

tracerouteタイムアウト値の設定

おそらくデフォルトのタイムアウト期間(5秒)を延長すると、より多くの応答が得られるでしょう。これを行うには、-w(待機時間)オプションを使用して7秒に変更します。(これは浮動小数点数であることに注意してください。)

次のコマンドを入力します。

traceroute -w 7.0 blarneycastle.ie

大差はありませんでしたので、応答はタイムアウトしている可能性が高いです。匿名のホップは意図的に秘密にされている可能性があります。

テスト数の設定

デフォルトでは、tracerouteは各ホップに3つのUDPパケットを送信します。-q(クエリ数)オプションを使用して、これを調整できます。

tracerouteテストを高速化するには、次のように入力して、送信するUDPプローブパケットの数を1つに減らします。

traceroute -q 1 blarneycastle.ie

これにより、各ホップに1つのプローブが送信されます。

初期TTL値の設定

TTLの初期値を1以外の値に設定し、一部のホップをスキップすることができます。通常、TTL値は、最初のテストセットでは1、次のテストセットでは2、というように設定されます。これを5に設定すると、最初のテストではホップ5に到達し、ホップ1から4をスキップしようとします。

このコンピューターからブラーニー城のWebサイトが11ホップ離れていることがわかっているので、次のコマンドを入力してホップ11に直接移動します。

traceroute -f 11 blarneycastle.ie

これにより、宛先への接続の状態に関する、簡潔で要領を得たレポートが得られます。

思いやりを持つ

tracerouteは、ネットワークルーティングの調査、接続速度の確認、ボトルネックの特定に最適なツールです。Windowsには、同様に機能するtracertコマンドもあります。

ただし、UDPパケットの洪水で未知のデバイスを攻撃したくないので、スクリプトや無人ジョブにtracerouteを含めることに注意してください。

tracerouteがネットワークに与える負荷は、ネットワークのパフォーマンスに悪影響を与える可能性があります。今すぐ解決する必要がある状況でない限り、通常の営業時間外に使用することをお勧めします。