tcpdump
は、システムとの間で送受信されるネットワークトラフィックをキャプチャおよび検査するために使用できるコマンドラインユーティリティです。これは、ネットワークの問題のトラブルシューティングとセキュリティテストのためにネットワーク管理者の間で最も一般的に使用されるツールです。
その名前にもかかわらず、 tcpdump
、UDP、ARP、ICMPなどの非TCPトラフィックをキャプチャすることもできます。キャプチャされたパケットは、ファイルまたは標準出力に書き込むことができます。 tcpdump
の最も強力な機能の1つ コマンドは、フィルターを使用して、分析したいデータのみをキャプチャする機能です。
この記事では、 tcpdump
の使用方法の基本について説明します。 Linuxのコマンド。
tcpdump
のインストール #
tcpdump
ほとんどのLinuxディストリビューションとmacOSにデフォルトでインストールされます。 tcpdump
かどうかを確認するには コマンドはシステムタイプで使用できます:
tcpdump --version
出力は次のようになります。
tcpdump version 4.9.2
libpcap version 1.8.1
OpenSSL 1.1.1b 26 Feb 2019
tcpdump
の場合 システムにが存在しない場合、上記のコマンドは「tcpdump:コマンドが見つかりません」と出力します。 tcpdump
を簡単にインストールできます ディストリビューションのパッケージマネージャーを使用します。
tcpdump
のインストール UbuntuとDebianで#
sudo apt update && sudo apt install tcpdump
tcpdump
のインストール CentOSとFedoraで#
sudo yum install tcpdump
tcpdump
のインストール Arch Linuxの場合#
sudo pacman -S tcpdump
tcpdump
を使用したパケットのキャプチャ #
tcpdump
の一般的な構文 コマンドは次のとおりです:
tcpdump [options] [expression]
- コマンド
options
コマンドの動作を制御できます。 - フィルター
expression
キャプチャされるパケットを定義します。
rootまたはsudo
を持つユーザーのみ 特権はtcpdump
を実行できます 。非特権ユーザーとしてコマンドを実行しようとすると、「そのデバイスでキャプチャする権限がありません」というエラーが表示されます。
最も単純な使用例は、 tcpdump
を呼び出すことです。 オプションとフィルターなし:
sudo tcpdump
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens3, link-type EN10MB (Ethernet), capture size 262144 bytes
15:47:24.248737 IP linuxize-host.ssh > desktop-machine.39196: Flags [P.], seq 201747193:201747301, ack 1226568763, win 402, options [nop,nop,TS val 1051794587 ecr 2679218230], length 108
15:47:24.248785 IP linuxize-host.ssh > desktop-machine.39196: Flags [P.], seq 108:144, ack 1, win 402, options [nop,nop,TS val 1051794587 ecr 2679218230], length 36
15:47:24.248828 IP linuxize-host.ssh > desktop-machine.39196: Flags [P.], seq 144:252, ack 1, win 402, options [nop,nop,TS val 1051794587 ecr 2679218230], length 108
... Long output suppressed
23116 packets captured
23300 packets received by filter
184 packets dropped by kernel
tcpdump
割り込み信号を受信するまで、パケットをキャプチャして標準出力に書き込み続けます。 Ctrl + C
を使用します 割り込み信号を送信してコマンドを停止するためのキーの組み合わせ。
より詳細な出力を得るには、 -v
を渡します オプション、または -vv
さらに詳細な出力の場合:
sudo tcpdump -vv
-c
を使用して、キャプチャするパケットの数を指定できます。 オプション。たとえば、10個のパケットのみをキャプチャするには、次のように入力します。
sudo tcpdump -c 10
パケットをキャプチャした後、 tcpdump
停止します。
インターフェイスが指定されていない場合、 tcpdump
最初のインターフェースを使用して、そのインターフェースを通過するすべてのパケットを検出してダンプします。
-D
を使用する tcpdumpがパケットを収集できるすべての利用可能なネットワークインターフェースのリストを印刷するオプション:
sudo tcpdump -D
このコマンドは、インターフェイスごとに、インターフェイス名、簡単な説明、および関連するインデックス(番号)を出力します。
1.ens3 [Up, Running]
2.any (Pseudo-device that captures on all interfaces) [Up, Running]
3.lo [Up, Running, Loopback]
上記の出力は、 ens3
であることを示しています tcpdump
によって最初に検出されたインターフェースです コマンドにインターフェースが提供されていない場合に使用されます。 2番目のインターフェースany
は、すべてのアクティブなインターフェイスをキャプチャできる特別なデバイスです。
トラフィックをキャプチャするインターフェイスを指定するには、 -i
を指定してコマンドを呼び出します。 オプションの後にインターフェイス名または関連するインデックスが続きます。たとえば、すべてのインターフェイスからすべてのパケットをキャプチャするには、 any
を指定します。 インターフェイス:
sudo tcpdump -i any
デフォルトでは、 tcpdump
IPアドレスに対して逆引きDNS解決を実行し、ポート番号を名前に変換します。 -n
を使用します 翻訳を無効にするオプション:
sudo tcpdump -n
DNSルックアップをスキップすると、DNSトラフィックの生成が回避され、出力が読みやすくなります。 tcpdump
を呼び出すときは常に、このオプションを使用することをお勧めします 。
画面に出力を表示する代わりに、リダイレクト演算子>
を使用してファイルにリダイレクトできます。 および>>
:
sudo tcpdump -n -i any > file.out
tee
を使用して、ファイルに保存しながらデータを監視することもできます コマンド:
sudo tcpdump -n -l | tee file.out
-l </ code> 上記のコマンドのオプションは、
tcpdump
に通知します 出力行をバッファリングします。このオプションを使用しない場合、新しい行が生成されたときに出力が画面に書き込まれません。
tcpdump
を理解する 出力#
tcpdump
キャプチャされた各パケットの情報を新しい行に出力します。各行には、プロトコルに応じて、タイムスタンプとそのパケットに関する情報が含まれています。
TCPプロトコルラインの一般的な形式は次のとおりです。
[Timestamp] [Protocol] [Src IP].[Src Port] > [Dst IP].[Dst Port]: [Flags], [Seq], [Ack], [Win Size], [Options], [Data Length]
フィールドごとに行き、次の行を説明しましょう:
15:47:24.248737 IP 192.168.1.185.22 > 192.168.1.150.37445: Flags [P.], seq 201747193:201747301, ack 1226568763, win 402, options [nop,nop,TS val 1051794587 ecr 2679218230], length 108
-
15:47:24.248737
-キャプチャされたパケットのタイムスタンプは現地時間であり、次の形式を使用します:hours:minutes:seconds.frac
、ここでfrac
真夜中から数分の1秒です。 -
IP
-パケットプロトコル。この場合、IPはインターネットプロトコルバージョン4(IPv4)を意味します。 -
192.168.1.185.22
-ドットで区切られた送信元IPアドレスとポート(。
。 -
192.168.1.150.37445
-ドットで区切られた宛先IPアドレスとポート(。
。 -
フラグ[P。]
-TCPフラグフィールド。この例では、[P。]
プッシュ確認パケットを意味します。これは、前のパケットを確認してデータを送信するために使用されます。その他の一般的なフラグフィールド値は次のとおりです。- [。]-ACK(確認)
- [S]-SYN(接続の開始)
- [P]-PSH(プッシュデータ)
- [F]-FIN(接続の終了)
- [R]-RST(接続のリセット)
- [S。]-SYN-ACK(SynAcKパケット)
-
seq 201747193:201747301
-シーケンス番号はfirst:last
にあります 表記。パケットに含まれるデータの数を示します。これらの数値が絶対であるデータストリームの最初のパケットを除いて、後続のすべてのパケットは相対バイト位置として使用されます。この例では、番号は201747193:201747301
です。 、このパケットにはデータストリームのバイト201747193から201747301が含まれていることを意味します。-S
を使用する 絶対シーケンス番号を出力するオプション。 -
ack 1226568763
確認応答番号は、この接続のもう一方の端で予期される次のデータのシーケンス番号です。 -
win 402
-ウィンドウ番号は、受信バッファで使用可能なバイト数です。 -
options [nop、nop、TS val 1051794587 ecr 2679218230]
-TCPオプション。nop
、または「操作なし」は、TCPヘッダーを4バイトの倍数にするために使用されるパディングです。TS val
はTCPタイムスタンプであり、ecr
エコー応答を表します。 TCPオプションの詳細については、IANAのドキュメントをご覧ください。 -
長さ108
-ペイロードデータの長さ
tcpdump
フィルタ#
tcpdump
の場合 フィルタなしで呼び出されると、すべてのトラフィックがキャプチャされ、大量の出力が生成されるため、対象のパケットを見つけて分析することが非常に困難になります。
フィルタは、 tcpdump
の最も強力な機能の1つです。 指図。これらは、式に一致するパケットのみをキャプチャできるためです。たとえば、ウェブサーバーに関連する問題のトラブルシューティングを行う場合、フィルタを使用してHTTPトラフィックのみを取得できます。
tcpdump
Berkeley Packet Filter(BPF)構文を使用して、プロトコル、送信元と宛先のIPアドレス、ポートなどのさまざまな加工パラメータを使用して、キャプチャされたパケットをフィルタリングします。
この記事では、最も一般的なフィルターのいくつかを見ていきます。使用可能なすべてのフィルターのリストについては、pcap-filtermanpageを確認してください。
キャプチャを特定のプロトコルに制限するには、プロトコルをフィルターとして指定します。たとえば、UDPトラフィックのみをキャプチャするには、次のコマンドを実行します。
sudo tcpdump -n udp
プロトコルを定義する別の方法は、 proto
を使用することです。 修飾子の後にプロトコル番号が続きます。次のコマンドは、プロトコル番号17をフィルタリングし、上記と同じ結果を生成します。
sudo tcpdump -n proto 17
番号の詳細については、IPプロトコル番号リストを確認してください。
特定のホストに関連するパケットのみをキャプチャするには、 host
を使用します 修飾子:
sudo tcpdump -n host 192.168.1.185
ホストはIPアドレスまたは名前のいずれかです。
net
を使用して、出力を特定のIP範囲にフィルタリングすることもできます。 修飾子。たとえば、 10.10.0.0/16
に関連するパケットのみをダンプするには 使用するもの:
sudo tcpdump -n net 10.10
キャプチャを特定のポートとの間のパケットのみに制限するには、 port
を使用します 修飾子。以下のコマンドは、次のコマンドを使用してSSH(ポート22)サービスに関連するパケットをキャプチャします。
sudo tcpdump -n port 23
portrange
修飾子を使用すると、さまざまなポートのトラフィックをキャプチャできます。
sudo tcpdump -n portrange 110-150
are src
を使用して、送信元または宛先のポートまたはホストに基づいてパケットをフィルタリングすることもできます。 、 dst
、srcおよびdst
、およびsrcまたはdst
修飾子。
次のコマンドは、IP192.168.1.185のホストからの着信パケットをキャプチャします。
sudo tcpdump -n src host 192.168.1.185
任意の送信元からポート80に送信されるトラフィックを見つけるには、次を使用します。
sudo tcpdump -n dst port 80
複雑なフィルター#
フィルタは、と
を使用して組み合わせることができます ( &&
)、または
( ||コード> )、および
not
(!コード> )演算子。
たとえば、送信元IPアドレス192.168.1.185からのすべてのHTTPトラフィックをキャプチャするには、次のコマンドを使用します。
sudo tcpdump -n src 192.168.1.185 and tcp port 80
括弧を使用して、より複雑なフィルターをグループ化して作成することもできます。
sudo tcpdump -n 'host 192.168.1.185 and (tcp port 80 or tcp port 443)'
特殊文字を使用する際の解析エラーを回避するには、フィルターを一重引用符で囲みます。
送信元IPアドレス192.168.1.185からSSHを除くすべてのトラフィックをキャプチャする別のコマンド例を次に示します。
sudo tcpdump -n src 192.168.1.185 and not dst port 22
デフォルトでは、 tcpdump
、パケットヘッダーのみをキャプチャします。ただし、パケットの内容を検査する必要がある場合があります。
tcpdump
パケットの内容をASCIIおよびHEXで印刷できます。
-A
オプションはtcpdump
に指示します 各パケットをASCIIおよび-x
で印刷します HEXの場合:
sudo tcpdump -n -A
パケットの内容をHEXとASCIIの両方で表示するには、 -X
を使用します オプション:
sudo tcpdump -n -X
ファイルへのキャプチャの読み取りと書き込み#
tcpdump
のもう1つの便利な機能 パケットをファイルに書き込むことです。これは、多数のパケットをキャプチャする場合や、後で分析するためにパケットをキャプチャする場合に便利です。
ファイルへの書き込みを開始するには、 -w
を使用します オプションの後に出力キャプチャファイルが続きます:
sudo tcpdump -n -w data.pcap
上記のこのコマンドは、キャプチャを data.pcap
という名前のファイルに保存します 。ファイルには任意の名前を付けることができますが、 .pcap
を使用するのが一般的な規則です。 拡張機能(パケットキャプチャ)。
-w
の場合 オプションを使用すると、出力は画面に表示されません。 tcpdump
生のパケットを書き込み、通常のテキストエディタでは読み取れないバイナリファイルを作成します。
ファイルの内容を検査するには、 tcpdump
を呼び出します。 -r
を使用 オプション:
sudo tcpdump -r data.pcap
tcpdump
を実行する場合 バックグラウンドで、アンパサンド記号(&
)を追加します )コマンドの最後に。
キャプチャファイルは、Wiresharkなどの他のパケットアナライザツールを使用して検査することもできます。
長期間にわたってパケットをキャプチャする場合、ファイルローテーションを有効にできます。 tcpdump
新しいファイルを作成し、指定した時間間隔または固定サイズでダンプファイルをローテーションできます。次のコマンドは、 file.pcap0
という名前の200MBのファイルを最大10個作成します。 、 file.pcap1
、など:古いファイルを上書きする前。
sudo tcpdump -n -W 10 -C 200 -w /tmp/file.pcap
10個のファイルが生成されると、古いファイルは上書きされます。
tcpdump
のみを実行する必要があることに注意してください 問題のトラブルシューティング中のみ。
tcpdump
を開始する場合 特定の時間に、cronジョブを使用できます。 tcpdump
一定時間後に終了するオプションはありません。 timeout
を使用できます tcpdump
を停止するコマンド その後しばらくして。たとえば、5分後に終了するには、次を使用します。
sudo timeout 300 tcpdump -n -w data.pcap
結論#
tcpdump
は、ネットワーク関連の問題を分析およびトラブルシューティングするためのコマンドラインツールです。
この記事では、 tcpdump
の基本を紹介しました 使用法と構文。詳細なドキュメントについては、tcpdumpのWebサイトにアクセスしてください。
ご質問やご意見がございましたら、お気軽にコメントをお寄せください。