GNU/Linux >> Linux の 問題 >  >> Linux

LinuxでのTcpdumpコマンド

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サイトにアクセスしてください。

ご質問やご意見がございましたら、お気軽にコメントをお寄せください。


Linux
  1. Linuxmvコマンド

  2. Linuxduコマンド

  3. Linuxipコマンド

  1. Linuxでtcpdumpコマンドを使用してパケットをキャプチャおよび分析する方法

  2. Linuxifconfigコマンド

  3. Linuxcdコマンド

  1. Linuxタイムコマンド

  2. LinuxでのPingコマンド

  3. Linuxウォッチコマンド