tcpdump でネットワークトラフィックを解析する

Tips

はじめに

業務でアプリの開発をしていた際、アプリが通信する先の UTM(統合脅威管理)でアクセス過多が検知されました。 どのプロセスがどの IP に対してどれだけのリクエストを送っているか確認が必要となり、同僚に相談したところ tcpdump コマンドを教えてもらいました。 本記事はその備忘録として、基本的な使い方と実際の調査で役立ったフィルタリング方法をまとめます。

tcpdump とは

tcpdump は Linux で利用できる CLI のパケットキャプチャツールです。 ネットワークインターフェースを流れるパケットをリアルタイムで表示・記録できます。 GUI ツールの Wireshark と比較すると視覚的なわかりやすさでは劣りますが、SSH 接続のみのサーバー上でも動作するためサーバー上のトラブルシュートには特に重宝します。

インストール

コマンドが入っていない場合は以下でインストールします。

sudo apt update
sudo apt install tcpdump

基本的な使い方

パケットをキャプチャ

sudo tcpdump

何もオプションを指定しない場合、デフォルトのネットワークインターフェースのパケットをリアルタイムで表示します。 出力は以下のような形式です。

14:32:01.123456 IP 192.168.1.10.54321 > 93.184.216.34.443: Flags [S], seq 0, win 64240, length 0

各フィールドの意味は以下の通りです。

フィールド 内容
14:32:01.123456 タイムスタンプ(時:分:秒.マイクロ秒)
IP プロトコル(IPv4)
192.168.1.10.54321 送信元 IP とポート
> 93.184.216.34.443 宛先 IP とポート
Flags [S] TCP フラグ(S = SYN、P = PUSH、F = FIN など)
length 0 ペイロードのサイズ(バイト)

大量のパケットが流れる環境では画面がすぐに埋まるため、後述のフィルタリングを組み合わせて使うのが実用的です。

インターフェースを指定

sudo tcpdump -i eth0

-i オプションでキャプチャするインターフェースを指定します。 -i any を指定するとすべてのインターフェースをキャプチャできます。 利用可能なインターフェースを確認するには ip a または tcpdump -D を使います。

表示件数を制限

sudo tcpdump -c 100

-c オプションで取得するパケット数の上限を指定できます。 大量に流れる環境では必ず指定しておくと、意図せずターミナルが流れ続けるのを防げます。

特定の IP を指定してキャプチャ

今回の調査で実際に使ったのがこの方法です。 UTM がアラートを上げた宛先 IP に絞ってキャプチャすることで、どのタイミングでどれだけのリクエストが飛んでいるかを把握できました。

送受信どちらかに特定の IP が含まれるパケットを表示

sudo tcpdump -n host 192.168.1.100

-n オプションは DNS 逆引きを無効化するもので、IP アドレスをそのまま表示させるために使用しています。 逆引きが走るとキャプチャのタイミングがずれたり、出力が読みにくくなるため、調査では基本的に -n を付けることをおすすめします。 host キーワードに続けて IP アドレスを指定すると、その IP との通信だけをフィルタリングできます。

送信元 IP を指定する

sudo tcpdump -n src host 192.168.1.100

src host とすることで、その IP からの送信パケットのみに絞り込めます。

宛先 IP を指定する

sudo tcpdump -n dst host 192.168.1.100

dst host とすることで、その IP 宛てのパケットのみに絞り込めます。

ポートも絞り込む

sudo tcpdump -n host 192.168.1.100 and port 443

and で条件を組み合わせられます。HTTPS トラフィックに限定したい場合や、Docker でコンテナのポートを指定している場合などに便利です。

ファイルへの保存と読み込み

調査結果を後から分析したい場合や、Wireshark で GUI 表示したい場合はファイルに保存します。

sudo tcpdump -n host 192.168.1.100 -w capture.pcap

保存した pcap ファイルを再度 tcpdump で読み込む場合は以下のコマンドを使います。

tcpdump -r capture.pcap

pcap ファイルは Wireshark にドラッグ&ドロップするだけで開けるため、詳細な分析には Wireshark と組み合わせると効率的です。

まとめ

今回使用した主なオプションをまとめます。

オプション 説明
-i <インターフェース> キャプチャするインターフェースを指定
-c <数> キャプチャするパケット数の上限を指定
-n DNS 逆引きを無効化
host <IP> 特定の IP との通信に絞る
src host <IP> 送信元 IP で絞る
dst host <IP> 宛先 IP で絞る
port <番号> ポート番号で絞る
-w <ファイル> pcap 形式で保存
-r <ファイル> pcap ファイルを読み込む

実際に使ってみると、フィルタリングを組み合わせることで調査対象を素早く絞り込めるのが tcpdump の強みだと感じました。 Wireshark ほどの分析機能はないものの、SSH 接続しかできない本番サーバーのトラブルシュートに使える点が特に重宝します。 より詳細なオプションは man tcpdump で確認できます。

コメント

タイトルとURLをコピーしました