はじめに
Linuxサーバを商用システムとして運用していると、
- ネットワークが遅い
- タイムアウトが発生する
- 接続できない事象が断続的に発生する
といった原因が分かりにくい障害に遭遇することがあります。
アプリケーションログやCPU・メモリなどのメトリクスを確認しても異常が見つからず、「ネットワークが怪しいが確証がない」という状況は珍しくありません。このようなケースで有効なのが tcpdump です。
インフラエンジニアとしては確実に使いこなせるようにしておく必要があるツールになりますので、概要から具体的な使い方を説明します。
tcpdumpで確認できること
tcpdumpは、Linuxサーバを通過する実際の通信パケットを直接確認できるツールであり、
「何が」「いつ」「どこまで」通信されているのかを事実ベースで把握できます。
ログやメトリクスでは、次のような点は把握できません。
- TCP接続が確立しているか(SYN/SYN-ACK/ACK)
- 再送が多発していないか
- サーバから応答が返っているのか
- 途中でRST(強制切断)が発生していないか
tcpdump を使うことで、
「通信していない」のか、「通信しているが遅い」のか、「途中で切られている」のか
を切り分けることが可能になります。
商用環境で tcpdump を使う際の前提知識
tcpdump は非常に便利なツールですが、商用(本番)環境では使い方を誤るとリスクも伴います。以下の点に注意したうえで使用するようにしてください。
- パフォーマンス影響
- 無条件で全通信を取得するとCPU使用率が上がる可能性あり
- ディスク枯渇
- 長時間・大量取得により pcap ファイル(ネットワーク上を流れるパケットをそのまま記録したバイナリ形式のファイル)が肥大化
- 情報漏洩リスク
- 認証情報や個人情報が含まれる可能性
そのため、商用環境では以下が大前提になります。
- 取得目的を明確にする
- 取得対象(IP・ポート)を最小限に絞る
- 取得時間を限定する
tcpdump は「とりあえず取る」ツールではなく、目的を持って最小限に使うことを意識してください。
tcpdump の基本的な使い方
それでは tcpdump コマンドの基本的な使い方をご紹介します。
基本構文
tcpdump [オプション] [フィルタ]tcpdump は「どこで(インタフェース)」+「どう表示するか(オプション)」+「何を取るか(フィルタ)」を組み合わせて使います。
最低限必要なオプション
インターフェース eth0 にて発生している純粋な通信のみに絞った形でパケットキャプチャを取得するコマンドをご紹介します。
tcpdump -i eth0 -n- -i : 取得するネットワークインタフェース
- -n : 名前解決を無効化(DNS逆引きを防ぎ、IPアドレスのままで情報取得が可能)
名前解決が入ると余計な通信や遅延の原因になりますので、基本的には -n オプションは必須と考えてよいです。
フィルタオプション
フィルタを書かない tcpdump は、ノイズが多すぎる、後の解析に手間がかかる、取得時の負荷が高いため、フィルタオプションを指定することを推奨します。
一例として、特定のホストからポート443に対する通信のみに絞った形で tcpdump を取得するコマンドをご紹介します。
tcpdump -i eth0 -n host 192.168.1.10 and port 443よく使う取得パターン
続いて、実務においてよく使う取得パターンの例をご紹介します。
特定ホストとの通信
tcpdump -i eth0 -n host 10.0.0.5- host:指定したIPアドレスのホストにかかるすべての入出力パケットを取得
特定ポートに対する通信
tcpdump -i eth0 -n port 443- port:特定のポート番号宛のパケットのみを取得
TCP通信のみ
tcpdump -i eth0 -n tcp- tcp:UDPやARPを除外し、TCP通信のみのパケットを取得。
商用環境向けの安全な取得方法
続いて、商用環境において tcpdump を安全に取得する方法をご紹介します。商用稼働中のサービスでは、パフォーマンスへの影響やディスク使用量の増加などを考慮する必要があります。サービス影響を最小限に抑えることを前提に、事前に検討すべきポイントを踏まえた取得方法を解説します。
ファイルに保存
商用環境では、tcpdump の出力を標準出力に流すのではなく、-w オプションでファイルに直接保存するのが基本となります。標準出力への出力は、パケットごとのフォーマット処理により CPU 負荷が高くなりやすく、またセッション切断時に取得データが失われるリスクがあります。ファイル保存であれば、負荷を最小限に抑えつつ、後からの再解析や監査対応にも適した形でパケットを保持できます。
以下にファイル出力のコマンド例を記載します。
tcpdump -i eth0 -n -w /tmp/capture.pcap- -w パス/ファイル名:所定のパス、ファイル名でパケット情報を出力
サイズ制限・ローテーション
通信パケットが多いシステムにおいて tcpdumpを取得すると、ファイルサイズが非常に大きくなることがありますので注意が必要です。ファイルサイズ制限およびローテーションのオプションを追加してパケットを取得することを推奨します。
以下に、100 MBごとにファイル分割し、最大で5ファイル保持するコマンド例を記載します。
tcpdump -i eth0 -n -w capture.pcap -C 100 -W 5- -C 100:100MBごとにファイル分割
- -W:最大5ファイルまで保持
Wiresharkによるネットワーク障害の解析方法
現場でネットワーク障害の解析をする際、tcpdumpの情報をそのまま解析するのは可読性の観点から手間がかかるので、Wiresharkを使って解析をするのが一般的です。下記の記事で障害解析方法をまとめているので、合わせて参考にしてください。
【初心者向け】Wiresharkによるパケット解析の基礎|見方・使い方をやさしく解説
まとめ
- tcpdump は 通信の事実を確認できる便利な切り分けツール
- 商用環境では「目的・範囲・時間」を明確にすることが最重要
- フィルタを書かずに取得するのは危険
- 解析は「正常な通信を知る」ことから始める
tcpdump を正しく使えるようになると、「ネットワークが怪しい」という曖昧な状態から一歩進んだ障害対応が可能になりますので、インフラエンジニアとして確実にスキル習得しておきましょう。

コメント