tcpdumpコマンドとは?ネットワーク通信を可視化する強力なパケットキャプチャツール完全ガイド

プログラミング・IT

ネットワークのトラブルシューティングをしていて、「実際にどんなデータが流れているのか見たい」と思ったことはありませんか?

「通信が遅い原因を調べたい」「不正なアクセスがないか確認したい」「アプリケーションが何をしているか知りたい」といった場面で役立つツールがあるんです。

実は、tcpdumpは、ネットワークを流れるパケット(データの塊)をリアルタイムでキャプチャして表示できる、LinuxやUnixで標準的に使われる強力なコマンドラインツールなんです。まるで、道路を走る車を監視カメラで観察するように、ネットワークのトラフィックを観察できるんですよ。

この記事では、tcpdumpの基本から実践的な使い方まで、ネットワーク初心者の方にも分かりやすく解説していきます。

豊富な具体例を見ながら、ネットワークトラフィックの可視化をマスターしていきましょう!


スポンサーリンク
  1. tcpdumpとは?その基本を知ろう
    1. 基本的な説明
    2. 何ができるの?
    3. どんな時に使う?
  2. インストール方法
    1. Linux(Ubuntu/Debian)
    2. Linux(CentOS/RHEL/Fedora)
    3. macOS
    4. 権限について
  3. 基本的な使い方
    1. 最もシンプルな実行
    2. 基本的なオプション
  4. 出力の読み方
    1. 基本的なフォーマット
    2. 具体例で理解する
    3. TCPフラグの意味
  5. 実践的なフィルタリング
    1. ホスト(IPアドレス)でフィルタ
    2. ポート番号でフィルタ
    3. プロトコルでフィルタ
    4. ネットワークでフィルタ
  6. 高度なフィルタリング
    1. 論理演算子の使用
    2. TCPフラグでフィルタ
    3. パケットサイズでフィルタ
  7. ファイルへの保存と読み込み
    1. パケットをファイルに保存
    2. ファイルサイズを制限
    3. 保存したファイルの読み込み
  8. 実用的な使用例
    1. 例1:Webサーバーのトラフィック監視
    2. 例2:特定のホストとの通信を記録
    3. 例3:DNSクエリの監視
    4. 例4:SSH接続の監視
    5. 例5:pingの確認
    6. 例6:SYNスキャンの検出
    7. 例7:ARPスプーフィング検出
  9. パケット内容の詳細表示
    1. ASCIIで内容を表示
    2. 16進数とASCIIで表示
    3. ペイロード(データ部分)のみ表示
  10. Wiresharkとの連携
    1. Wiresharkとは
    2. tcpdumpからWiresharkへ
    3. リモートキャプチャ
  11. トラブルシューティングの実例
    1. ケース1:接続できない
    2. ケース2:通信が遅い
    3. ケース3:不正アクセスの疑い
  12. セキュリティとプライバシーの注意点
    1. 法的・倫理的な注意
    2. 機密情報の取り扱い
  13. パフォーマンスへの影響
    1. リソース消費
    2. パフォーマンス最適化
  14. よくあるエラーと対処法
    1. エラー1:Permission denied
    2. エラー2:no suitable device found
    3. エラー3:Dropped packets
    4. エラー4:Interface is down
  15. 便利なオプション早見表
  16. まとめ

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
-AASCII表示-A
-X16進数+ASCII-X
-sスナップ長-s0(全体)
-Cファイル分割(MB)-C 100
-Wファイル数制限-W 5
-ttttタイムスタンプ-tttt
-eMACアドレス表示-e
-q簡潔表示-q

まとめ

tcpdumpは、ネットワークトラフィックを可視化して分析できる、強力なパケットキャプチャツールです。

この記事のポイント:

  • tcpdumpはネットワークパケットをキャプチャするコマンドラインツール
  • root権限(sudo)が必要
  • フィルタで特定の通信だけを抽出できる
  • ファイルに保存して後で分析可能
  • Wiresharkと組み合わせると強力
  • トラブルシューティングに非常に有効
  • ホスト、ポート、プロトコルで柔軟にフィルタ
  • ASCIIや16進数でパケット内容を表示
  • セキュリティとプライバシーに注意が必要
  • 法的・倫理的な配慮が重要

最初は出力が難しく感じるかもしれませんが、基本的なフィルタを使えるようになれば、ネットワークの問題解決が格段に速くなります。

tcpdumpは、ネットワークエンジニアにとって必須のスキルと言えるでしょう。

まずは簡単なフィルタから始めて、徐々に複雑な分析に挑戦してみてください。ネットワークの世界が「見える」ようになる感動を、ぜひ体験してくださいね!

コメント

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