ネットワークのトラブルシューティングをしていて、「実際にどんなデータが流れているのか見たい」と思ったことはありませんか?
「通信が遅い原因を調べたい」「不正なアクセスがないか確認したい」「アプリケーションが何をしているか知りたい」といった場面で役立つツールがあるんです。
実は、tcpdumpは、ネットワークを流れるパケット(データの塊)をリアルタイムでキャプチャして表示できる、LinuxやUnixで標準的に使われる強力なコマンドラインツールなんです。まるで、道路を走る車を監視カメラで観察するように、ネットワークのトラフィックを観察できるんですよ。
この記事では、tcpdumpの基本から実践的な使い方まで、ネットワーク初心者の方にも分かりやすく解説していきます。
豊富な具体例を見ながら、ネットワークトラフィックの可視化をマスターしていきましょう!
tcpdumpとは?その基本を知ろう

基本的な説明
tcpdumpは、ネットワークインターフェースを流れるパケット(通信データの単位)をキャプチャして表示するコマンドラインツールです。
1988年に開発された歴史あるツールで、現在でもLinux/Unix系システムで広く使われています。
tcpとdump:
- tcp:TCP/IPプロトコル(インターネットの通信規約)
- dump:ダンプ(データを出力する)
名前の通り、TCP/IP通信の内容を「ダンプ(出力)」するツールなんです。
何ができるの?
主な機能:
パケットキャプチャ
ネットワークを流れるすべてのパケットを記録できます。
リアルタイム表示
通信内容を即座に画面に表示します。
フィルタリング
特定の通信だけを抽出して表示できます。
ファイル保存
キャプチャしたデータを後で分析できるよう保存できます。
詳細な分析
パケットの中身を詳しく調べられます。
どんな時に使う?
トラブルシューティング:
- 接続できない原因の調査
- 通信速度が遅い理由の特定
- パケットロスの検出
セキュリティ監視:
- 不正アクセスの検出
- 攻撃パターンの分析
- ネットワークスキャンの監視
開発・デバッグ:
- APIの動作確認
- アプリケーションの通信内容確認
- プロトコルの実装検証
学習:
- ネットワークプロトコルの理解
- 通信の仕組みの学習
まさに、ネットワークの「X線装置」のようなツールなんですね。
インストール方法
Linux(Ubuntu/Debian)
インストール:
sudo apt update
sudo apt install tcpdump
バージョン確認:
tcpdump --version
ほとんどのLinuxディストリビューションには、最初からインストールされています。
Linux(CentOS/RHEL/Fedora)
sudo dnf install tcpdump
# または
sudo yum install tcpdump
macOS
macOSには標準でインストールされています。
バージョン確認:
tcpdump --version
Homebrewで最新版をインストール:
brew install tcpdump
権限について
tcpdumpは、ネットワークインターフェースに直接アクセスするため、通常はroot権限(sudo)が必要です。
# 権限エラーになる
tcpdump
# 正しい実行方法
sudo tcpdump
セキュリティ上、一般ユーザーでは実行できないようになっているんです。
基本的な使い方
最もシンプルな実行
すべてのパケットをキャプチャ:
sudo tcpdump
これだけで、ネットワークインターフェースを流れるすべてのパケットが表示されます。
出力例:
14:25:30.123456 IP 192.168.1.100.54321 > 93.184.216.34.80: Flags [S], seq 123456789, win 65535, length 0
14:25:30.234567 IP 93.184.216.34.80 > 192.168.1.100.54321: Flags [S.], seq 987654321, ack 123456790, win 65535, length 0
大量のデータが流れるので、最初は圧倒されるかもしれませんね。
基本的なオプション
インターフェースの指定:
sudo tcpdump -i eth0
キャプチャ数を制限:
sudo tcpdump -c 10
10個のパケットをキャプチャしたら終了します。
詳細表示:
sudo tcpdump -v
sudo tcpdump -vv # より詳細
sudo tcpdump -vvv # 最も詳細
タイムスタンプを読みやすく:
sudo tcpdump -tttt
数値表示(名前解決なし):
sudo tcpdump -n
IPアドレスやポート番号を名前に変換せず、数値のまま表示します。高速化にも有効です。
出力の読み方
基本的なフォーマット
tcpdumpの出力は、以下の形式で表示されます。
タイムスタンプ プロトコル 送信元 > 宛先: 詳細情報
具体例で理解する
TCP通信の例:
14:25:30.123456 IP 192.168.1.100.54321 > 93.184.216.34.80: Flags [S], seq 123456789, win 65535, length 0
各部分の意味:
14:25:30.123456
タイムスタンプ(時刻とマイクロ秒)
IP
プロトコル(この場合はIPv4)
192.168.1.100.54321
送信元IPアドレスとポート番号
>
データの方向(左から右へ)
93.184.216.34.80
宛先IPアドレスとポート番号(80番はHTTP)
Flags [S]
TCPフラグ(SはSYN、接続開始)
seq 123456789
シーケンス番号
win 65535
ウィンドウサイズ
length 0
データ長(この場合はヘッダのみ)
TCPフラグの意味
主なフラグ:
- [S]:SYN(接続開始)
- [S.]:SYN-ACK(接続応答)
- [.]:ACK(確認応答)
- [P]:PUSH(データ送信)
- [F]:FIN(接続終了)
- [R]:RST(接続リセット)
これらを見ると、TCP通信の流れが分かるんです。
実践的なフィルタリング
ホスト(IPアドレス)でフィルタ
特定のホストとの通信:
sudo tcpdump host 192.168.1.100
特定のホストからの通信:
sudo tcpdump src host 192.168.1.100
特定のホストへの通信:
sudo tcpdump dst host 192.168.1.100
ポート番号でフィルタ
HTTPトラフィック(ポート80):
sudo tcpdump port 80
HTTPS(ポート443):
sudo tcpdump port 443
SSH(ポート22):
sudo tcpdump port 22
複数のポート:
sudo tcpdump port 80 or port 443
ポート範囲:
sudo tcpdump portrange 8000-8080
プロトコルでフィルタ
TCP通信のみ:
sudo tcpdump tcp
UDP通信のみ:
sudo tcpdump udp
ICMP(pingなど):
sudo tcpdump icmp
ARP:
sudo tcpdump arp
ネットワークでフィルタ
特定のネットワーク:
sudo tcpdump net 192.168.1.0/24
送信元ネットワーク:
sudo tcpdump src net 192.168.1.0/24
宛先ネットワーク:
sudo tcpdump dst net 10.0.0.0/8
高度なフィルタリング

論理演算子の使用
AND(かつ):
sudo tcpdump host 192.168.1.100 and port 80
OR(または):
sudo tcpdump host 192.168.1.100 or host 192.168.1.101
NOT(以外):
sudo tcpdump not port 22
複雑な組み合わせ:
sudo tcpdump 'tcp and (port 80 or port 443) and not host 192.168.1.1'
シングルクォートで囲むと、シェルの解釈を避けられます。
TCPフラグでフィルタ
SYNパケットのみ(接続開始):
sudo tcpdump 'tcp[tcpflags] & tcp-syn != 0'
SYN-ACKパケット:
sudo tcpdump 'tcp[tcpflags] & (tcp-syn|tcp-ack) == (tcp-syn|tcp-ack)'
RSTパケット(接続リセット):
sudo tcpdump 'tcp[tcpflags] & tcp-rst != 0'
パケットサイズでフィルタ
特定のサイズ以上:
sudo tcpdump greater 1000
特定のサイズ以下:
sudo tcpdump less 100
大きなパケット(ファイル転送など)や小さなパケット(ACKなど)を選別できます。
ファイルへの保存と読み込み
パケットをファイルに保存
基本的な保存:
sudo tcpdump -w capture.pcap
.pcapは、パケットキャプチャの標準的な拡張子です。
キャプチャ数を制限して保存:
sudo tcpdump -c 100 -w capture.pcap
フィルタと組み合わせて保存:
sudo tcpdump -w http.pcap port 80
時刻とともに保存:
sudo tcpdump -w capture-$(date +%Y%m%d-%H%M%S).pcap
ファイル名に日時を含めると、後で整理しやすくなりますね。
ファイルサイズを制限
ファイルサイズで分割:
sudo tcpdump -w capture.pcap -C 100
100MBごとに新しいファイルに分割します。
ファイル数を制限:
sudo tcpdump -w capture.pcap -C 100 -W 5
5ファイルに達したら、古いファイルを上書きします(ローテーション)。
保存したファイルの読み込み
ファイルから読み込んで表示:
tcpdump -r capture.pcap
読み込みだけならsudoは不要です。
フィルタをかけて表示:
tcpdump -r capture.pcap port 80
詳細表示:
tcpdump -r capture.pcap -vv
特定のパケットを抽出:
tcpdump -r capture.pcap host 192.168.1.100 -w filtered.pcap
実用的な使用例
例1:Webサーバーのトラフィック監視
sudo tcpdump -i eth0 -nn 'port 80 or port 443' -c 100
解説:
-i eth0:eth0インターフェースを監視-nn:名前解決なし(高速化)port 80 or port 443:HTTPとHTTPS-c 100:100パケットで終了
例2:特定のホストとの通信を記録
sudo tcpdump -i any -w communication.pcap host 8.8.8.8
解説:
-i any:すべてのインターフェース-w communication.pcap:ファイルに保存host 8.8.8.8:Google DNSとの通信
例3:DNSクエリの監視
sudo tcpdump -i eth0 -n port 53
解説:
port 53:DNSのポート番号-n:IPアドレスをそのまま表示
どのドメイン名を解決しているか分かります。
例4:SSH接続の監視
sudo tcpdump -i eth0 -nn 'tcp port 22'
誰がSSHで接続してきているか監視できます。
例5:pingの確認
sudo tcpdump -i eth0 icmp
または、特定のホストへのping:
sudo tcpdump -i eth0 'icmp and host 8.8.8.8'
pingが届いているか、応答が返ってきているか確認できます。
例6:SYNスキャンの検出
sudo tcpdump -i eth0 'tcp[tcpflags] & tcp-syn != 0 and tcp[tcpflags] & tcp-ack == 0'
ポートスキャンなどの攻撃を検出できます。
例7:ARPスプーフィング検出
sudo tcpdump -i eth0 -e arp
-eオプションで、MACアドレスも表示されます。
同じIPアドレスに複数のMACアドレスがあれば、ARPスプーフィング攻撃の可能性があります。
パケット内容の詳細表示
ASCIIで内容を表示
sudo tcpdump -A port 80
HTTPリクエストやレスポンスの内容が読めます。
出力例:
GET / HTTP/1.1
Host: example.com
User-Agent: curl/7.68.0
平文の通信内容が見えるんです。
16進数とASCIIで表示
sudo tcpdump -XX port 80
パケット全体を16進数とASCIIの両方で表示します。
出力例:
0x0000: 4500 0034 1234 4000 4006 b1e6 c0a8 0164 E..4.4@.@......d
0x0010: 5db8 d822 ab12 0050 1234 5678 9abc def0 ]..".....P.4Vx..
バイナリプロトコルの解析に便利ですね。
ペイロード(データ部分)のみ表示
sudo tcpdump -X -s0 port 80
-s0は、パケット全体をキャプチャする指定です(デフォルトは先頭部分のみ)。
Wiresharkとの連携
Wiresharkとは
Wiresharkは、tcpdumpでキャプチャしたファイルをGUIで解析できる強力なツールです。
tcpdumpでキャプチャ→Wiresharkで詳細分析、という流れが一般的ですね。
tcpdumpからWiresharkへ
手順:
1. tcpdumpでキャプチャ:
sudo tcpdump -i eth0 -w capture.pcap -s0
2. ファイルをローカルにダウンロード:
scp user@server:/path/to/capture.pcap .
3. Wiresharkで開く:
wireshark capture.pcap
GUI環境がないサーバーでキャプチャして、手元のPCで解析できるんです。
リモートキャプチャ
SSH経由でリアルタイムにWiresharkで見る:
ssh user@server 'sudo tcpdump -i eth0 -U -w - port 80' | wireshark -k -i -
リモートサーバーのトラフィックを、ローカルのWiresharkでリアルタイム表示できます。
トラブルシューティングの実例
ケース1:接続できない
症状:
特定のサーバーに接続できない
調査コマンド:
sudo tcpdump -i eth0 -nn host 192.168.1.100
確認ポイント:
- SYNパケットは送信されているか?
- SYN-ACKは返ってきているか?
- RSTが返ってきていないか?
SYNしか見えない場合:
→ サーバーに到達していないか、ファイアウォールでブロックされている
RSTが返ってくる場合:
→ サーバーはそのポートでサービスを提供していない
ケース2:通信が遅い
大量のリトライを確認:
sudo tcpdump -i eth0 'tcp[tcpflags] & tcp-push != 0'
パケットロスが発生していると、再送が多発します。
パケットサイズを確認:
sudo tcpdump -i eth0 -vv
MTU(Maximum Transmission Unit)の問題で、パケットが分割されている可能性があります。
ケース3:不正アクセスの疑い
外部からの接続試行を監視:
sudo tcpdump -i eth0 -nn 'tcp[tcpflags] & tcp-syn != 0 and not src net 192.168.0.0/16'
内部ネットワーク以外からのSYNパケットを表示します。
ポートスキャンの検出:
sudo tcpdump -i eth0 'tcp[tcpflags] & tcp-syn != 0' | awk '{print $3}' | cut -d'.' -f1-4 | sort | uniq -c | sort -rn
同一IPアドレスからの大量のSYNパケットがあれば、スキャンの可能性が高いです。
セキュリティとプライバシーの注意点
法的・倫理的な注意
重要な原則:
自分が管理するネットワークのみ
他人のネットワークでのキャプチャは違法です。
業務目的に限定
個人情報や機密情報の収集には注意が必要です。
社内規定の確認
企業ネットワークでは、セキュリティポリシーを確認しましょう。
暗号化通信でも注意
HTTPSなどの暗号化通信でも、メタデータ(誰がどこと通信しているか)は見えます。
機密情報の取り扱い
パスワードが平文で流れる:
HTTP、FTP、Telnetなどは暗号化されていないので、パスワードが丸見えです。
キャプチャファイルの管理:
- パーミッションを厳格に設定(600など)
- 不要になったら速やかに削除
- 共有は暗号化して行う
個人情報の保護:
分析後は、個人を特定できる情報を削除しましょう。
パフォーマンスへの影響
リソース消費
tcpdumpは、ネットワークトラフィックをすべて処理するため、リソースを消費します。
CPUとメモリ:
- フィルタなしだと高負荷
- フィルタを使うと軽減される
ディスクI/O:
ファイルに保存する場合、ディスク書き込みが発生します。
パフォーマンス最適化
フィルタを活用:
# 悪い例:すべてキャプチャ
sudo tcpdump -w all.pcap
# 良い例:必要なものだけ
sudo tcpdump -w http.pcap port 80
名前解決を無効化:
sudo tcpdump -n
DNS逆引きをしないので、高速化されます。
バッファサイズの調整:
sudo tcpdump -B 4096 -w capture.pcap
バッファを大きくすると、パケットロスが減ります。
よくあるエラーと対処法
エラー1:Permission denied
症状:
tcpdump: eth0: You don't have permission to capture on that device
原因:
root権限がない
解決策:
sudo tcpdump
エラー2:no suitable device found
症状:
tcpdump: no suitable device found
原因:
インターフェース名が間違っている
解決策:
# インターフェース一覧を確認
ip link show
ifconfig -a
# 正しいインターフェース名で実行
sudo tcpdump -i eth0
エラー3:Dropped packets
症状:
10000 packets captured
1234 packets received by filter
567 packets dropped by kernel
原因:
処理が追いつかず、カーネルがパケットを破棄
解決策:
# バッファを増やす
sudo tcpdump -B 8192
# フィルタで絞り込む
sudo tcpdump port 80
# ファイルに保存して後で分析
sudo tcpdump -w capture.pcap
エラー4:Interface is down
症状:
tcpdump: SIOCGIFFLAGS: eth0: Device not found
原因:
インターフェースがダウンしている
解決策:
# インターフェースを起動
sudo ip link set eth0 up
# または
sudo ifconfig eth0 up
便利なオプション早見表
| オプション | 説明 | 例 |
|---|---|---|
-i | インターフェース指定 | -i eth0 |
-c | キャプチャ数制限 | -c 100 |
-w | ファイルに保存 | -w capture.pcap |
-r | ファイルから読み込み | -r capture.pcap |
-n | 名前解決なし | -n |
-nn | ポート番号も数値で | -nn |
-v | 詳細表示 | -vvv |
-A | ASCII表示 | -A |
-X | 16進数+ASCII | -X |
-s | スナップ長 | -s0(全体) |
-C | ファイル分割(MB) | -C 100 |
-W | ファイル数制限 | -W 5 |
-tttt | タイムスタンプ | -tttt |
-e | MACアドレス表示 | -e |
-q | 簡潔表示 | -q |
まとめ
tcpdumpは、ネットワークトラフィックを可視化して分析できる、強力なパケットキャプチャツールです。
この記事のポイント:
- tcpdumpはネットワークパケットをキャプチャするコマンドラインツール
- root権限(sudo)が必要
- フィルタで特定の通信だけを抽出できる
- ファイルに保存して後で分析可能
- Wiresharkと組み合わせると強力
- トラブルシューティングに非常に有効
- ホスト、ポート、プロトコルで柔軟にフィルタ
- ASCIIや16進数でパケット内容を表示
- セキュリティとプライバシーに注意が必要
- 法的・倫理的な配慮が重要
最初は出力が難しく感じるかもしれませんが、基本的なフィルタを使えるようになれば、ネットワークの問題解決が格段に速くなります。
tcpdumpは、ネットワークエンジニアにとって必須のスキルと言えるでしょう。
まずは簡単なフィルタから始めて、徐々に複雑な分析に挑戦してみてください。ネットワークの世界が「見える」ようになる感動を、ぜひ体験してくださいね!

コメント