【tcpdumpとは】コマンドの使い方とよく使うオプションを徹底解説!

tcpdumpとは、軽量かつ高速なパケットキャプチャを実現するオープンソースのネットワーク解析ツールです。

本記事では、tcpdumpコマンドの使い方からよく使われるオプションまで、今すぐ使えるノウハウを解説しています。

この記事を読んでわかること
  • tcpdumpとは
  • tcpdumpコマンドの使い方
  • よく使うオプション

tcpdumpを活用できれば、リアルタイムでパケットをキャプチャし、ネットワークの異常検知やサイバー攻撃の調査が可能になります。

目次

tdpdumpとは

tcpdumpとは、ネットワーク上を流れるパケットをリアルタイムにキャプチャし、解析するためのオープンソースのコマンドラインツールです。tcpdumpは多くのUnix系OSに標準で搭載されており、非常にシンプルで軽量なため、リソースに制約があるサーバ環境でも効率的に動作します。

サイバーセキュリティ分野においては、ネットワーク通信の監視やトラブルシューティング、攻撃の検知と分析において非常に重要な役割を担っています。

tcpdumpは非常に柔軟性が高く、特定のプロトコルやポート番号、IPアドレスに基づいたフィルタリング機能を持つため、必要なトラフィックだけを抽出して監視・分析することが可能です。さらに、取得したパケットデータはPCAPファイル形式として保存でき、後からWiresharkなどのツールを用いてより詳細な解析を行うこともできます。

対応OS

tcpdumpは、Unix系のOSを中心に幅広く対応しており、Linux、macOS、FreeBSD、NetBSD、OpenBSD、Solarisなどが挙げられます。

Linuxディストリビューションにおいては、デフォルトでインストールされていることも多く、ネットワーク管理者やセキュリティエンジニアにとっては馴染み深い存在と言えます。

主な特徴

軽量かつ高速

tcpdumpはCUI(Command-Line User Interface)ベースのツールです。GUIを持たないためシステムリソースの消費が非常に少なく、低スペックのサーバーや組み込み機器などリソースに制約のある環境でも使用できます。

柔軟なフィルタリング機能

多くのフィルタリングオプションと組み合わせることで、特定のプロトコル、特定のポートを使用する通信、あるいは特定のIPアドレス範囲からのデータパケットのみをキャプチャすることが可能です。これにより、必要な情報を効率的に抽出し、不要なデータを排除することができます。

  • 送信元・宛先IPアドレス、ポート番号、プロトコル(TCP、UDP、ICMPなど)を指定可能。
  • 論理演算子(and、or、not)を活用し、詳細な条件指定が可能。

特にセキュリティインシデントの調査においては、特定のプロトコルに絞った監視ができるため、悪意のある通信の検出や異常な挙動の分析に役立ちます。

リアルタイムでのパケット解析

tcpdumpは、キャプチャしたパケットを即座に解析し、その内容をリアルタイムで表示することができます。これにより、システム管理者やセキュリティエンジニアは、ネットワークの異常を速やかに検知し、迅速な対応が可能となります。

多様な出力フォーマットに対応

-v、-vv、-vvvオプションで、詳細レベルを変更し、より多くの情報を表示することができます。また、-X、-Aオプションを使用することで、パケットのペイロードを表示することもできます。

キャプチャしたデータをPCAPファイル形式で保存することができ、Wiresharkなどの他の解析ツールと連携して詳細な分析を行うことが可能です。これにより、リアルタイム解析だけでなく、事後分析にも適したツールとして活用できます。

インストールが簡単

ほとんどのLinuxディストリビューションでは標準リポジトリから利用可能で、パッケージ管理システムを使用して簡単にインストールできます。

例.AlmaLinux 9.5の場合

AlmaLinux 9.5では標準でインストールされているため、ユーザーが別途インストールする必要はありません。万が一、インストールされていない場合でも、標準リポジトリに含まれているため、dnfを使用してインストールできます。

# cat /etc/redhat-release
AlmaLinux release 9.5 (Teal Serval)

# tcpdump --version
tcpdump version 4.99.0
libpcap version 1.10.0 (with TPACKET_V3)
OpenSSL 3.2.2 4 Jun 2024

# dnf list tcpdump
メタデータの期限切れの最終確認: 0:15:13 前の 2025年03月14日 20時23分53秒 に実施しました。
インストール済みパッケージ
tcpdump.x86_64        14:4.99.0-9.el9        @AppStream

例.Ubuntu Server 24.04.1 LTSの場合

AlmaLinuxと同じく、Ubuntu 24でも標準でインストールされているため、ユーザーによる追加インストールは不要です。万が一、インストールされていない場合でも、標準リポジトリに含まれているため、aptコマンドでインストールできます。

$ cat /etc/os-release
PRETTY_NAME="Ubuntu 24.04.1 LTS"
NAME="Ubuntu"
VERSION_ID="24.04"
〜 省略 〜

$ tcpdump --version
tcpdump version 4.99.4
libpcap version 1.10.4 (with TPACKET_V3)
OpenSSL 3.0.13 30 Jan 2024

$ sudo apt list tcpdump
Listing... Done
tcpdump/noble,now 4.99.4-3ubuntu4 amd64 [installed,automatic]

ちなみに、maxOSにもデフォルトでインストールされています。

MacBook Air M1, 2020(Sequoia 15.3.1)の場合

% tcpdump --version
tcpdump version 4.99.1 -- Apple version 145
libpcap version 1.10.1
LibreSSL 3.3.6

オープンソース・無料

オープンソースであるため、透明性が高く、セキュリティや運用ニーズに応じて継続的な改善がなされています。

もちろん、無料!

WireSharkとの違い

tcpdumpと同様に、Wiresharkもパケットキャプチャを行うためのツールとして広く利用されています。

GUIを持つWiresharkに比べ、tcpdumpはCLIベース(コマンドラインインタフェース)のツールであり、軽量かつ高速に動作します。そのため、リソースが限られた環境や運用管理の現場でよく使用されています。

項目Wiresharktcpdump
主な用途GUIを活用した詳細なパケット解析CLIによる軽量なパケットキャプチャ
インタフェースGUIおよびCLICLIのみ
リソース消費高(GUI動作のため)低(軽量なCLIツール)
パフォーマンス大量のパケット処理では負荷がかかる高速なキャプチャが可能
解析能力フィルタリング、統計、可視化が充実基本的なパケット解析
リアルタイム解析可能(GUIで視覚的に表示)可能(CLI上でテキスト出力)
主な用途高度なネットワーク解析ネットワーク監視

この記事の検証環境

この記事では、Kali Linux 2025.1に標準インストールされているtcpdumpを使用して、検証を行っています。

$ cat /etc/os-release
PRETTY_NAME="Kali GNU/Linux Rolling"
NAME="Kali GNU/Linux"
VERSION_ID="2025.1"
VERSION="2025.1"
VERSION_CODENAME=kali-rolling
ID=kali
ID_LIKE=debian
HOME_URL="https://www.kali.org/"
SUPPORT_URL="https://forums.kali.org/"
BUG_REPORT_URL="https://bugs.kali.org/"
ANSI_COLOR="1;31"

$ tcpdump --version
tcpdump version 4.99.5
libpcap version 1.10.5 (with TPACKET_V3)
OpenSSL 3.4.1 11 Feb 2025
64-bit build, 64-bit time_t

基本的なコマンドの使い方

tcpdumpを使用するには、基本的に管理者権限が必要です。一般的なLinux環境では、sudoを付けてコマンドを実行することで、適切な権限での実行が可能になります。

最もシンプルなコマンド

$ sudo tcpdump
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), snapshot length 262144 bytes

コマンドラインでtcpdumpコマンドを実行すると、デフォルトのネットワークインタフェース上を流れる全てのパケットをキャプチャします。

一般ユーザーで実行すると、権限エラーになります。

$ tcpdump
tcpdump: eth0: You don't have permission to perform this capture on that device
(socket: Operation not permitted)

tcpdumpを停止

Ctrl + Cを押下すると、パケットキャプチャを終了します。

ネットワークインタフェースを指定

一般的には、ネットワークインタフェースを指定して使用します。そのため、まずは指定可能なインタフェースを確認します。

STEP

ネットワークインタフェースを確認

$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host noprefixroute
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 08:00:27:1b:7e:0f brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic eth0
       valid_lft 81303sec preferred_lft 81303sec
    inet6 fd00::a00:27ff:fe1b:7e0f/64 scope global dynamic mngtmpaddr proto kernel_ra
       valid_lft 86052sec preferred_lft 14052sec
    inet6 fe80::a00:27ff:fe1b:7e0f/64 scope link proto kernel_ll
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 08:00:27:7e:eb:60 brd ff:ff:ff:ff:ff:ff
    inet 192.168.21.11/24 brd 192.168.21.255 scope global eth1
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fe7e:eb60/64 scope link proto kernel_ll
       valid_lft forever preferred_lft forever
STEP

ルーティングテーブルの確認

$ ip r
default via 10.0.2.2 dev eth0
10.0.2.0/24 dev eth0 proto kernel scope link src 10.0.2.15
192.168.21.0/24 dev eth1 proto kernel scope link src 192.168.21.11
STEP

パケットキャプチャできるインタフェースを確認

$ tcpdump -D
1.eth0 [Up, Running, Connected]
2.eth1 [Up, Running, Connected]
3.any (Pseudo-device that captures on all interfaces) [Up, Running]
4.lo [Up, Running, Loopback]
5.bluetooth-monitor (Bluetooth Linux Monitor) [Wireless]
6.nflog (Linux netfilter log (NFLOG) interface) [none]
7.nfqueue (Linux netfilter queue (NFQUEUE) interface) [none]
8.dbus-system (D-Bus system bus) [none]
9.dbus-session (D-Bus session bus) [none]
STEP

キャプチャするインタフェースを指定(-i)

例えば、eth1インタフェースのパケットをキャプチャするには、-iオプションを付けて、以下のように指定します。

$ sudo tcpdump -i eth1
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), snapshot length 262144 bytes

よく使うオプション一覧

特定の通信のみキャプチャする

ホストを指定(host)

特定のホスト(例.192.168.21.103)の通信のみ取得するには、hostオプションを使用します。

$ sudo tcpdump -i eth1 host 192.168.21.103

上記の場合、送受信が対象となりますが、送信元または宛先を個別に指定することもできます。

送信元ホストを指定(src host)

$ sudo tcpdump -i eth1 src host 192.168.21.103

宛先ホストを指定(dst host)

$ sudo tcpdump -i eth1 dst host 192.168.21.103

ネットワークセグメントを指定(net)

ネットワークセグメントを指定してパケットキャプチャを行う場合、netオプションを使用します。

$ sudo tcpdump -i eth1 net 192.168.21.0/24

上記の場合、送受信が対象となりますが、送信元または宛先を個別に指定することもできます。

送信元セグメントを指定(src net)

$ sudo tcpdump -i eth1 src net 192.168.21.0/24

宛先セグメントを指定(dst net)

$ sudo tcpdump -i eth1 dst net 192.168.21.0/24

ポートを指定(port)

特定のポートに関連するトラフィックのみを取得する場合は、portオプションを用います。

$ sudo tcpdump -i eth1 port 22

上記の場合、送受信が対象となりますが、送信元または宛先を個別に指定することもできます。

送信元ポートを指定(src port)

$ sudo tcpdump -i eth1 src port 22

宛先ポートを指定(dst port)

$ sudo tcpdump -i eth1 dst port 22

プロトコルを指定

特定のプロトコルの通信のみをキャプチャすることもできます。

プロトコル説明
tcpTCP通信のみキャプチャ
udpUDP通信のみキャプチャ
icmpICMP(Pingなど)通信のみキャプチャ
arpARP(アドレス解決プロトコル)通信のみキャプチャ

例.TCPパケットをキャプチャ

$ sudo tcpdump -i eth1 tcp

出力形式を指定

日時形式(-t、-tt、-ttt、-tttt、-ttttt)

tcpdumpの-t系のオプションは、パケットのタイムスタンプの表示方法を制御します。

オプション説明
-tタイムスタンプを表示しない
-ttエポック時間(1970年1月1日00:00:00 UTCからの秒数)
-ttt直近のキャプチャからの経過時間
-tttt人間が読みやすい形式
-tttttキャプチャ開始からの経過時間

例えば、人間が目視で確認する場合は-ttttオプションを使用し、パケット間の時間差を正確に把握したい場合は-ttt-tttttを使用します。

各オプションの出力例

$ sudo tcpdump -i eth1
23:57:41.107032 IP 192.168.21.102 > 192.168.21.103: ICMP echo request, id 1562, seq 1, length 64
23:57:41.107383 IP 192.168.21.103 > 192.168.21.102: ICMP echo reply, id 1562, seq 1, length 64

$ sudo tcpdump -i eth1 -t
IP 192.168.21.102 > 192.168.21.103: ICMP echo request, id 1563, seq 1, length 64
IP 192.168.21.103 > 192.168.21.102: ICMP echo reply, id 1563, seq 1, length 64

$ sudo tcpdump -i eth1 -tt
1742137073.927247 IP 192.168.21.102 > 192.168.21.103: ICMP echo request, id 1564, seq 1, length 64
1742137073.927530 IP 192.168.21.103 > 192.168.21.102: ICMP echo reply, id 1564, seq 1, length 64

$ sudo tcpdump -i eth1 -ttt
 00:00:00.000000 IP 192.168.21.102 > 192.168.21.103: ICMP echo request, id 1565, seq 1, length 64
 00:00:00.000189 IP 192.168.21.103 > 192.168.21.102: ICMP echo reply, id 1565, seq 1, length 64

$ sudo tcpdump -i eth1 -tttt
2025-03-16 23:58:10.749081 IP 192.168.21.102 > 192.168.21.103: ICMP echo request, id 1566, seq 1, length 64
2025-03-16 23:58:10.749288 IP 192.168.21.103 > 192.168.21.102: ICMP echo reply, id 1566, seq 1, length 64

$ sudo tcpdump -i eth1 -ttttt
 00:00:00.000000 IP 192.168.21.102 > 192.168.21.103: ICMP echo request, id 1567, seq 1, length 64
 00:00:00.000207 IP 192.168.21.103 > 192.168.21.102: ICMP echo reply, id 1567, seq 1, length 64

出力するパケットヘッダーの粒度(-v、-vv、-vvv)

デフォルトの出力結果は簡潔ですが、より詳細な情報を取得するには -v-vv-vvvの各オプションを指定します。

オプション説明
-v通常より詳細な情報を出力
-vvさらに詳しい情報を出力
-vvv最も詳細な情報を出力

例.pingパケットを-vオプションで出力

$ sudo tcpdump -i eth1
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), snapshot length 262144 bytes
00:40:55.579387 IP 192.168.21.102 > 192.168.21.103: ICMP echo request, id 1617, seq 1, length 64
00:40:55.579634 IP 192.168.21.103 > 192.168.21.102: ICMP echo reply, id 1617, seq 1, length 64

$ sudo tcpdump -i eth1 -v
tcpdump: listening on eth1, link-type EN10MB (Ethernet), snapshot length 262144 bytes
00:41:30.834876 IP (tos 0x0, ttl 64, id 11020, offset 0, flags [DF], proto ICMP (1), length 84)
    192.168.21.102 > 192.168.21.103: ICMP echo request, id 1618, seq 1, length 64
00:41:30.835061 IP (tos 0x0, ttl 64, id 39228, offset 0, flags [none], proto ICMP (1), length 84)
    192.168.21.103 > 192.168.21.102: ICMP echo reply, id 1618, seq 1, length 64

出力内容を簡素化する(-q)

-qオプションを指定すると、パケットの詳細な情報を省略し、簡潔なフォーマットで出力します。

例.SSHパケットを-qオプションで出力

$ sudo tcpdump -i eth1
00:51:09.293899 IP 192.168.21.102.57706 > 192.168.21.103.ssh: Flags [S], seq 3375507496, win 64240, options [mss 1460,sackOK,TS val 496816156 ecr 0,nop,wscale 7], length 0
00:51:09.294211 IP 192.168.21.103.ssh > 192.168.21.102.57706: Flags [S.], seq 1171760103, ack 3375507497, win 31856, options [mss 1460,sackOK,TS val 2473947280 ecr 496816156,nop,wscale 7], length 0

$ sudo tcpdump -i eth1 -q
00:51:20.108325 IP 192.168.21.102.40386 > 192.168.21.103.ssh: tcp 0
00:51:20.108520 IP 192.168.21.103.ssh > 192.168.21.102.40386: tcp 0

ペイロードを出力(-X、-A)

-Xオプション-Aオプションを使用すると、パケットのペイロードを表示することができます。

オプション説明
-Xパケットのペイロードを16進数とASCIIで表示
-AパケットのペイロードをASCIIで表示

例.Telnetパケットを-Xオプション、-Aオプションで出力

$ sudo tcpdump -i eth1 -X
01:14:14.324912 IP 192.168.21.102.54300 > 192.168.21.103.telnet: Flags [S], seq 2477914158, win 64240, options [mss 1460,sackOK,TS val 498201182 ecr 0,nop,wscale 7], length 0
        0x0000:  4500 003c 35a8 4000 4006 58f6 c0a8 1566  E..<5.@.@.X....f
        0x0010:  c0a8 1567 d41c 0017 93b1 f82e 0000 0000  ...g............
        0x0020:  a002 faf0 30cd 0000 0204 05b4 0402 080a  ....0...........
        0x0030:  1db1 f25e 0000 0000 0103 0307            ...^........
01:14:14.325153 IP 192.168.21.103.telnet > 192.168.21.102.54300: Flags [S.], seq 3500026117, ack 2477914159, win 31856, options [mss 1460,sackOK,TS val 2475332312 ecr 498201182,nop,wscale 7], length 0
        0x0000:  4500 003c 0000 4000 4006 8e9e c0a8 1567  E..<..@.@......g
        0x0010:  c0a8 1566 0017 d41c d09e 2905 93b1 f82f  ...f......)..../
        0x0020:  a012 7c70 8f35 0000 0204 05b4 0402 080a  ..|p.5..........
        0x0030:  938a 92d8 1db1 f25e 0103 0307            .......^....

$ sudo tcpdump -i eth1 -A
01:15:03.755061 IP 192.168.21.102.56330 > 192.168.21.103.telnet: Flags [S], seq 725310050, win 64240, options [mss 1460,sackOK,TS val 498250613 ecr 0,nop,wscale 7], length 0
E..<g.@.@.'....f...g.
..+;Zb........n
.........
...u........
01:15:03.755330 IP 192.168.21.103.telnet > 192.168.21.102.56330: Flags [S.], seq 575058050, ack 725310051, win 31856, options [mss 1460,sackOK,TS val 2475381742 ecr 498250613,nop,wscale 7], length 0
E..<..@.@......g...f...
"F..+;Zc..|p27.........
..S....u....

Telnetは通信データが暗号化されないため、ログインIDやパスワードを含む機密情報が漏洩するリスクがあります。下記の記事では、tcpdumpを使ってTelnet通信を傍受する検証を行っています。ぜひご覧ください。

ファイル保存、読み込み(-w、-r)

ネットワーク解析では、パケットキャプチャの結果をファイルに保存し、後で詳細に分析するケースが多くあります。

ファイル保存(-w)

キャプチャしたパケットをファイルに保存して後で解析したい場合は、-wオプションを使用します。tcpdumpの出力を通常のテキスト形式ではなく、バイナリ形式でファイルに書き込むため、Wiresharkなどのツールを使って詳細に分析することができます。

$ sudo tcpdump -i eth1 -w capture.pcap

ファイル読み込み(-r)

保存したキャプチャデータは、-rオプションを使用して読み取ることができます。

$ sudo tcpdump -r capture.pcap

非プロミスキャス・モード(-p)

デフォルトでは、プロミスキャス・モードで動作しますが、-pオプションを指定することで、非プロミスキャス・モードで動作させることもできます。

-pオプション動作モード
指定しないプロミスキャス・モード(すべてのパケットが対象)
指定する非プロミスキャス・モード(自分宛てのパケットのみ対象)

例.非プロミスキャス・モードの場合

$ sudo tcpdump -i eth1 -p

プロミスキャス・モードと非プロミスキャス・モードの違い

プロミスキャス・モード

プロミスキャス・モードは、ネットワークインタフェースカード(NIC)が受信するすべてのパケットをキャプチャするモードです。通常、NICは自分のMACアドレス宛てのパケットしか受信しませんが、プロミスキャス・モードを有効にすると、ネットワーク上を流れるすべてのパケットを受信できます。

主な用途
  • パケットキャプチャ
    • ネットワーク監視ツール(例:Wireshark、tcpdump)でトラフィックを分析する際に使用される。
  • セキュリティ監視・侵入検知(IDS/IPS)
    • ネットワークの異常なトラフィックを検出するために、セキュリティアプライアンスで使用される。
  • ネットワークトラブルシューティング
    • ネットワークの遅延やエラーの原因を特定するために活用される。
非プロミスキャス・モード

非プロミスキャス・モードは、通常のネットワーク動作モードであり、自分宛てのパケットのみを受信します。ブロードキャスト(全端末宛て)やマルチキャスト(特定グループ宛て)のパケットも受信しますが、他のホスト宛てのパケットは無視します。

主な用途

通常のネットワーク通信に使用される標準的なモード

まとめると ↓

動作モード動作用途
プロミスキャス・モードすべてのパケットを受信パケットキャプチャ、IDS/IPS、ネットワーク解析
非プロミスキャス・モード自分宛てのパケットのみ受信通常のネットワーク通信

複数の条件の組み合わせ(and、or、not)

andornotといった論理演算子を使用して、より具体的な条件を設定することができます。

例.HTTPまたはHTTPSの通信で、特定のIPアドレスのみ

$ sudo tcpdump -i eth1 \(port 80 or port 443\) and host 192.168.21.103

例.特定のセグメント内の通信で、ICMPを除外

$ sudo tcpdump -i eth1 net 192.168.21.0/24 and not icmp

その他

指定したパケット数だけキャプチャする(-c)

大量のトラフィックを扱う場合、無制限にキャプチャするとストレージを圧迫します。-cオプションを使用すれば、取得するパケット数を制限できます。

$ sudo tcpdump -i eth1 -c 100

この場合、100パケットだけキャプチャした後、自動的にパケットキャプチャを終了します。

アドレスを名前解決しない(-n)

-nオプションを使うことで、DNS解決を無効化し、IPアドレスをそのまま表示します。

$ sudo tcpdump -i eth1 -n

取得するパケットのサイズを指定(-s)

キャプチャするパケットのサイズ(byte)は、-sオプションで指定します。

$ sudo tcpdump -i eth1 -s 256

-sオプションを指定しない、または-s 0を指定すると、フルサイズ(262,144バイト)のパケットがキャプチャできます。

デフォラボ

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
目次