スニファを使用してパケットキャプチャを実行することは、複雑な問題を診断するための非常に強力な方法です。他のすべてが失敗した場合、ネットワークを介して送信されている生データを表示すると役立つことがよくあります。パケットは嘘をつかず、アプリケーショントラフィックを低レベルで分析すると、問題のより深い症状が明らかになる可能性があります(または、存在すら知らなかった問題が明らかになる可能性があります)。
この記事では、 CLIベースのtcpdump
ツールを使用するためのいくつかの基本事項について説明します。
スニファーの基本
まずはまず最初に:「パケットスニファー」とはどういう意味ですか?パケットスニファは、ネットワーク上のパケットをキャプチャできるようにするソフトウェアの一部です。 TcpdumpとWiresharkは、パケットスニファの例です。 TcpdumpはCLIパケットスニファを提供し、Wiresharkはパケットをスニッフィングおよび分析するための機能豊富なGUIを提供します。
デフォルトでは、tcpdump
は無差別モードで動作します。これは単に、ホストに到達するすべてのパケットが検査のためにtcpdump
に送信されることを意味します。この設定には、ブロードキャストトラフィックやマルチキャストトラフィックなど、キャプチャしている特定のホスト宛てではないトラフィックも含まれます。もちろん、tcpdump
は魔法のようなソフトウェアではありません。マシンの物理インターフェースの1つに何らかの形で到達したパケットのみをキャプチャできます。
インストールtcpdump
は単純です。 Red Hatシステムの標準パッケージリポジトリで利用可能であり、名前でインストールできます:
一般的なパケットスニッフィングシナリオ
マシンに着信するすべてのトラフィックをキャプチャすることは、概念的にはクールに聞こえるかもしれませんが、システム管理者として日常業務で実行する多くのアクティビティにとってはかなり低レベルに聞こえます。では、いつパケットキャプチャツールを使用しますか?ネットワークアプリケーションの問題のトラブルシューティングを行っているときに、通常はパケットスニファを使用し、他のすべてのオプションを使い果たしました。多くの場合、私はすでに基本的なネットワークトラブルシューティングを実行し、アプリケーションログファイルを確認しましたが、それでも問題の根底に到達することはできません。この時点で、パケットスニファを分割して、ネットワーク上で送信されている実際のデータを観察することは有益です。
パケットスニファのもう1つの優れた使用例は、教育的です。アプリケーション交換に関係するパケットを監視することは、基盤となるプロトコルの理解を深めるのに大いに役立ちます。たとえば、DNSがどのように機能するかを理解しようとするときに、再帰DNSクエリの完全なパケットフローを観察することは非常に貴重です。
基本的なパケットキャプチャの実行
学習するための最良の方法は飛び込むだけで、基本的なパケットキャプチャを始めましょう。まず、特別なオプションなしでtcpdump
を試してみましょう。パケットキャプチャを実行するには、スーパーユーザーである必要があることに注意してください(技術的には、特別な機能を備えた通常のアカウントから実行できますが、通常はrootとして実行する方が簡単です)。 Ctrl + Cを使用するか、SIGTERMをtcpdump
プロセスID(PID)に送信して、キャプチャを停止します。
デフォルトのtcpdump
To tcpdump
のデフォルト出力を参照し、次のコマンドを入力するだけです。
注:Ctrl + Cを押す前に大量の出力を飛ばすのではなく、次のように指定できます。 -c
フラグで表示するパケットの数。代わりに、上記のコマンドをtcpdump -c 6
にすると、同じ結果が得られます(6つのパケットがキャプチャされます)。
tcpdump
最初は少し気が遠くなるかもしれませんが、このツールを数回使用した後は、それを見ることに慣れます。フィールドを左から右に分解してみましょう。
特定のインターフェースのスニッフィング
前の例の出力の上部には、は(eth0)でキャプチャを開始し、キャプチャの下部には、キャプチャされたパケットに関する要約統計が含まれます。
tcpdump
は、キャプチャを実行するための特定のインターフェイスを指定します。デフォルトでは、tcpdump
は「アップ」である最も小さい番号のインターフェースを選択します。多くのサーバーには複数のインターフェースがあり、キャプチャに使用するインターフェースについて明示的にする必要があります。さらに、netfilter
インターフェイスなど、一部の「特別な」インターフェイスタイプがリストの一番上に表示される場合があります。この動作は混乱を招く可能性があるため、関心のあるインターフェースを指定することをお勧めします。
キャプチャに使用できるインターフェースを表示することから始めましょう。
自由に使用できるインターフェースで、-i
フラグを使用してリッスンするインターフェースを指定できるようになりました。インターフェイス名または--list-interfaces
コマンドの番号のいずれかを使用できることに注意してください。
上記のキャプチャを見ると、通過するパケットに関する基本情報が得られます。通信網。これらのパケットには、おそらくアップストリームスイッチからのスパニングツリープロトコル(STP)出力が含まれているようです。技術的には、これらはパケットではなく、レイヤー2フレームです。ただし、パケットキャプチャについて説明するときに、同じ意味で使用される用語が聞こえます。
詳細情報の取得
前の例の簡単なトラブルシューティング結果は、明らかな問題を特定するのに役立ちますが、必要な場合もあります。複雑な問題を実際に掘り下げるためのより多くの情報。キャプチャの詳細度を調整する方法を知ることは、パケットに含まれる実際のデータをより深く掘り下げることができるため、重要です。
tcpdump
は、コマンドに1〜3個の-v
フラグを追加することで制御されます。
冗長性の最大レベルを指定することで、パケット本体。上記では、ルートブリッジIDやルートパスコストなど、STPパケット内のデータに関する追加情報を確認できます。 STPに慣れていない場合でも、心配する必要はありません。ここで注意すべき重要な点は、詳細度を上げることで、ネットワークトラフィックに関する追加情報を取得できることです。
パケットの正確なバイト数を確認する
詳細度を上げると便利ですが、 「まだパケットの内容が表示されていません」。パケットに含まれる正確なバイトを本当に確認したい場合は、-x
フラグと-X
フラグを使用できます。 -x
フラグは、各パケットのデータを16進数で出力し、-X
フラグもデータをASCIIで出力します。 -x
を使用した出力は次のとおりです。
:
上記の例の16進データとASCIIデータに注意してください。この場合、に対してDNSAレコードクエリを実行していました。また、
-c
フラグを使用してキャプチャするパケットの数を指定し、port 53
のキャプチャフィルタを提供したことに注意してください。フィルタについては次の記事で説明します。
数字を付ける
tcpdump
を使用していると、気付くかもしれません。デフォルトの動作では、IPアドレスが完全修飾ドメイン名(FQDN)に自動的に解決されます。 Tcpdumpは、ポート番号(22など)をフレンドリ名(SSHなど)にも変換します。この動作は優れていますが、トラブルシューティングが不明瞭にならないように、数値データを確認したいことがよくあります。このデフォルトの動作は、-n
を渡してIPアドレスのルックアップを無効にするか、-nn
を渡してIPアドレスとポートのルックアップの両方を無効にすることで変更できます。
-nn
を使用した場合の結果は次のとおりです。
ダンプを保存する
ある時点で、必要になる場合があります。後で分析するため、またはWiresharkなどのグラフィカルツールを使用してより詳細に分析するために、パケットキャプチャを保存します。このタスクは、-w
フラグを使用して簡単に実行できます。これにより、パケットキャプチャファイルを書き込むことができます。
注:保存したファイルは、
と-r
フラグ、またはpcapファイル形式をサポートする別のアプリケーション。
上記のように、-w
フラグは、私たちが持っていくことができる便利なpcapファイルを生成しました。
まとめ
パケットキャプチャの実行は強力な手法です。ネットワークトラブルシューティングスキルインベントリで、特に問題が発生し、ネットワークの残りの部分に問題がないように見える場合。コマンドラインでtcpdump
を使用する方法を理解すると、ネットワークアプリケーションの問題を解決しようとするときのフラストレーションを何時間も節約でき、構文は慣れれば非常に直感的です。