Skip to main content

Tcpdump:例、オプションなど

tcpdump - Traffic Capture & Analysis (六月 2026)

tcpdump - Traffic Capture & Analysis (六月 2026)
Anonim

Tcpdumpは、ネットワークアダプタを通過するTCP / IPパケットを収集するさまざまなLinuxオペレーティングシステム(OS)で使用されるコマンドです。パケットスニッファツールと同様に、tcpdumpはネットワークトラフィックを分析するだけでなく、ファイルに保存することもできます。

デフォルトでは、オペレーティングシステムによって提供されるいくつかのコマンドとは異なり、tcpdumpはインストールされていないため使用できません。 tcpdumpをインストールするには、 apt-get install tcpdump または yum install tcpdumpあなたのOSによって異なります。

Tcpdumpのしくみ

Tcpdumpは、ブール値と一致するネットワークインターフェイス上のパケットのヘッダーを出力します 表現 。また、-w フラグは、後で分析するためにパケットデータをファイルに保存するか、または-r これにより、ネットワークインタフェースからパケットを読み取るのではなく、保存されたパケットファイルから読み取ることができます。すべての場合、一致するパケットのみ 表現 によって処理されます tcpdump .

Tcpdump 実行しない場合は、-c SIGINTシグナルによって中断されるまでパケットのキャプチャを続行します(たとえば、割り込み文字を入力するなどして生成されます)。 Ctrl + C)またはSIGTERM信号(通常は殺します(1)コマンド)。と一緒に走れば-c それがSIGINTまたはSIGTERMシグナルによって中断されるか、または指定された数のパケットが処理されるまで、パケットをキャプチャします。

上記のスイッチについては、この記事の後半で詳しく説明します。

いつ tcpdump パケットのキャプチャが終了すると、次の数がレポートされます。

  • パケットがフィルタで受信されました。
    • これの意味は、実行しているOSによって異なります tcpdump 場合によってはOSが設定されているかどうかによって異なります。フィルタがコマンドラインで指定された場合、OSによっては、フィルタ式と一致するかどうかにかかわらずパケットがカウントされますが、フィルタ式によって一致したパケットのみがカウントされ、 tcpdump。
  • パケット "はカーネルによって削除されました。"
    • これは、バッファスペースの不足のためにドロップされたパケットの数であり、OSのパケットキャプチャメカニズムによって tcpdump OSがその情報をアプリケーションに報告する場合は実行中です。そうでない場合、0として報告されます。

ほとんどのBSD(Berkeley Software Distributions)などのSIGINFOシグナルをサポートするプラットフォームでは、SIGINFOシグナルを受け取ったときにそれらのカウントを報告します(たとえば、 "status"文字を入力するなどして生成されます)。 Ctrl + T)、パケットをキャプチャし続けます。

Tcpdumpの互換性

tcpdumpコマンドでネットワークインタフェースからパケットを読み取るには、特別な権限が必要です( 読書 保存されたパケットファイルにはそのような特権は必要ありません)。

  • SunOS 3.xまたは4.xとNITまたはBPF:あなたには読み取りアクセス権が必要です / dev / nit または dev / bpf * .
  • DLPIを使用するSolaris:ネットワーク擬似デバイスへの読み取り/書き込みアクセス権が必要です。 / dev / le 。しかし、Solarisの少なくとも一部のバージョンでは、これでは十分ではありません tcpdump 無差別モードで捕捉する。これらのバージョンのSolarisでは、rootでなければなりません。 tcpdump プロミスキャスモードで取得するには、setuidをrootにインストールする必要があります。プロミスキャスモードでキャプチャしないと、多くの(おそらくすべての)インターフェイスで、発信パケットは表示されないので、プロミスキャスモードでは行われないキャプチャはあまり役に立ちません。
  • DLPIを使用したHP-UX:あなたはrootまたは tcpdump setuidをrootにインストールする必要があります。
  • スヌープ付きIRIX:あなたはrootまたは tcpdump setuidをrootにインストールする必要があります。
  • Linux:あなたはrootまたは tcpdump setuidをrootにインストールする必要があります。
  • UltrixおよびDigital UNIX / Tru64 UNIX:任意のユーザが tcpdump 。ただし、スーパーユーザがそのインターフェイスでプロミスキャスモード操作をイネーブルにしない限り、ユーザは(スーパーユーザでなくても)プロミスキャスモードでインターフェイス上でキャプチャできません。 pfconfig スーパーユーザがそのインタフェース上でcopy-all-modeオペレーションを有効にしない限り、ユーザは(スーパーユーザでなくても)インタフェース上のマシンが受信した、またはマシンが送信したユニキャストトラフィックをキャプチャできません pfconfig 、 そう 有用 インターフェイス上のパケットキャプチャでは、プロミスキャスモードまたはコピーオールモード操作、または両方の操作モードをそのインターフェイスで有効にする必要があります。
  • BSD:あなたには読み取りアクセス権が必要です / dev / bpf * .

Tcpdumpコマンドの構文

すべてのコンピュータコマンドと同様に、tcpdumpコマンドは、構文が正しい場合にのみ正しく動作します。

tcpdump -adeflnNOpqRStuvxX -c カウント

-C ファイルサイズ -F ファイル

-私 インタフェース -m モジュール -r ファイル

-s スナプレン -T タイプ -U ユーザー -w ファイル

-E アルゴ:秘密 表現

Tcpdumpコマンドオプション

これらは、tcpdumpコマンドで使用できるすべてのオプションです。

  • -a:ネットワークアドレスとブロードキャストアドレスを名前に変換しようとしています。
  • -c:受信後に終了する カウント パケット。
  • -C:生のパケットを保存ファイルに書き込む前に、ファイルが現在 ファイルサイズ もしそうなら、現在のセーブファイルを閉じて新しいセーブファイルを開きます。最初のsavefileの後のSavefileは、-w それ以降の数字は2で始まり、上向きになります。単位は ファイルサイズ 何百万バイト(1,000,000バイトではなく、1,048,576バイト)です。
  • -d:コンパイルされたパケットマッチングコードを人間が読める形式で標準出力にダンプして停止します。
  • -dd:パケットマッチングコードをC プログラム断片。
  • -ddd:パケットマッチングコードを10進数でダンプします(カウントの前に)。
  • -e:各ダンプ行にリンクレベルのヘッダーを表示します。
  • -E: つかいます アルゴ:秘密 IPsec ESPパケットを復号化する。アルゴリズムはdes-cbc, 3des-cbc, フライフィッシュ - cbc, rc3-cbc, キャスト128-cbc、または無し。デフォルトはdes-cbc。パケットを解読する機能は、 tcpdump 暗号化を有効にしてコンパイルされました。 秘密の ESP秘密鍵のASCIIテキスト。現時点では、任意のバイナリ値をとることはできません。このオプションはRFC2406 ESPであり、RFC1827 ESPではありません。このオプションはデバッグ目的にのみ使用され、本当に「秘密」キーでこのオプションを使用することはお勧めしません。 IPsecの秘密鍵をコマンドラインに表示することで、他の人に見せることができます。 ps (1)および他の機会。
  • -f:象徴的ではなく数値的に "外国"のインターネットアドレスを表示します(このオプションは、サンのypサーバーで重大な脳損傷を回避するためのものです。通常、非ローカルインターネット番号の翻訳は永久に停止します)。
  • -F: つかいます ファイル フィルター式の入力として使用します。コマンドラインで与えられた追加の式は無視されます。
  • -私:聞く インタフェース 。指定されていない場合、 tcpdump システムインターフェイスリストから番号の付いた構成済みインターフェイスを検索します(ループバックは除く)。一番早い試合を選ぶことで絆が崩れます。 2.2以降のカーネルを持つLinuxシステムでは、 インタフェース すべてのインタフェースからのパケットをキャプチャするには、 "any"の引数を使用できます。 "any"デバイスでのキャプチャは、プロミスキャスモードでは実行されません。
  • -l:stdout行をバッファします。キャプチャ中にデータを表示する場合に便利です。たとえば、「tcpdump -l | tee dat」または「tcpdump -l> dat&tail -f dat」です。
  • -m:ファイルからSMI MIBモジュール定義をロードする モジュール 。このオプションを使用すると、いくつかのMIBモジュールを tcpdump .
  • -n:ホストアドレスを名前に変換しません。これは、DNSルックアップを避けるために使用できます。
  • -nn:プロトコルやポート番号などを名前に変換しないでください。
  • -N:ホスト名のドメイン名修飾を表示しません。たとえば、このフラグを指定すると、 tcpdump "nic.ddn.mil"の代わりに "nic"を表示します。
  • -O:パケットマッチングコードオプティマイザを実行しないでください。これは、オプティマイザのバグが疑われる場合にのみ有効です。
  • -p: しないでください インターフェイスをプロミスキャスモードにします。他の何らかの理由で、インターフェイスがプロミスキャスモードになっている可能性があります。したがって '-p'は 'ether host {local-hw-addr}やetherブロードキャスト'の略語として使用できません。
  • -q:クイック(静か)出力。より少ないプロトコル情報を出力し、出力ラインを短くします。
  • -R:ESP / AHパケットがRFC1825からRFC1829の古い仕様に基づいていると仮定します。指定されている場合、 tcpdump 再生防止フィールドは印刷されません。 ESP / AH仕様にはプロトコルバージョンフィールドがないため、 tcpdump ESP / AHプロトコルのバージョンを推測することはできません。
  • -r:からのパケットの読み取り ファイル (これは-wオプションで作成されたものです)。標準入力は次の場合に使用されます ファイル " - "です。
  • -S相対的ではなく絶対的なTCPシーケンス番号を出力します。
  • -s:スネル スナプレン デフォルトの68ではなく、各パケットからのデータのバイト数。 SunOSのNITの場合、最小値は実際には96です.64バイトはIP、ICMP、TCP、UDPには適していますが、ネームサーバとNFSパケットからプロトコル情報を切り捨てることがあります(下記参照)。スナップショットが限られているために切り捨てられたパケットは、出力に "| 元祖 ''、ここで 元祖 切り捨てが発生したプロトコル・レベルの名前です。スナップショットを大きくすると、パケットの処理に要する時間が長くなり、効果的にパケットのバッファリング量が減少します。これにより、パケットが失われる可能性があります。あなたは制限するべきです スナプレン 興味のあるプロトコル情報をキャプチャする最小の番号に設定します。 スナプレン 0はパケット全体を捕捉するのに必要な長さを使用することを意味します。
  • -T: " 表現 "指定されたものと解釈される タイプ 。現在知られているタイプはcnfp (Cisco NetFlowプロトコル)、rpc (リモートプロシージャコール)、rtp (リアルタイムアプリケーションプロトコル)、rtcp (リアルタイムアプリケーション制御プロトコル)、SNMP (簡易ネットワーク管理プロトコル)、バット (ビジュアルオーディオツール)、およびwb (ホワイトボード配布)。
  • -t: しないでください 各ダンプ行にタイムスタンプを出力します。
  • -tt:各ダンプ行に書式なしのタイムスタンプを出力します。
  • -U:root権限を削除し、ユーザーIDを変更します。 ユーザー グループIDを ユーザー .
  • 注意:Red Hat Linuxは、何も指定されていなければ自動的にユーザ "pcap"に権限を落とします。
  • -ttt:各ダンプ行の現在の行と前の行の間にデルタ(マイクロ秒単位)を表示します。
  • -tttt:各ダンプ行の日付によって進められるデフォルト書式のタイムスタンプを出力します。
  • -u:暗号化されていないNFSハンドルを出力します。
  • -v:(やや詳細)冗長出力。たとえば、IPパケット内の生存時間、識別、全長、およびオプションが印刷されます。また、IPおよびICMPヘッダーチェックサムの検証など、パケットの完全性チェックを追加で可能にします。
  • -vv:さらに冗長な出力。たとえば、追加のフィールドはNFS応答パケットから出力され、SMBパケットは完全にデコードされます。
  • -vvv:さらに冗長な出力。たとえば、telnetSBSE オプションは完全に印刷されます。と -バツ telnetオプションも16進数で表示されます。
  • -w:生のパケットを ファイル それらを解析して印刷するのではなく、後で-rオプションを付けて印刷することもできます。標準出力は次の場合に使用されます。 ファイル " - "です。
  • -バツ:各パケット(リンクレベルヘッダーを引いたもの)を16進数で表示します。パケット全体または スナプレン バイトが印刷されます。これはリンク層パケット全体であるので、パッド層(例えば、イーサネット(登録商標))のリンク層については、上位層パケットが必要なパディングよりも短い場合には、パディングバイトも印刷される。
  • -バツ:16進数を印刷するときにasciiも印刷します。したがって、-バツ また、パケットは16進数/ ASCII形式で出力されます。これは新しいプロトコルを分析するのに非常に便利です。たとえ-バツ も設定されていない場合、一部のパケットの一部が16進数/ ASCII形式で出力されることがあります。
  • 表現 :どのパケットをダンプするかを選択します。ない場合 表現 が与えられると、ネット上のすべてのパケットがダンプされます。それ以外の場合は、 表現 「真」であることは投棄される。ザ 表現 1つまたは複数の プリミティブ。 プリミティブは通常、 id (名前または番号)に1つ以上の修飾子が付いています。修飾子には3種類あります。
  • タイプ :修飾子は、IDの名前または番号がどのようなものを指しているかを示します。可能なタイプはホスト, ネット、およびたとえば、 'host foo'、 'net 128.3'、 'port 20'などです。型修飾子がない場合は、ホスト 仮定される。
  • 指 :修飾子は、特定の転送方向を指定します。 id 。可能な方向は:src, DST, srcまたはdst そしてsrcと DST (例えば、 'src foo'、 'dst net 128.3'、 'src or dst port ftp-data')。 dir修飾子がない場合、srcまたはdst 仮定される。 「ヌル」リンク層(すなわち、スリップなどのポイントツーポイントプロトコル)の場合、 インバウンド そして アウトバウンド 修飾子を使用して、希望する方向を指定することができます。
  • 元祖 :修飾子は特定のプロトコルに一致を制限します。可能なプロトスは: エーテル, fddi, tr, ip, ip6, アルプス, ラルフ, デネット, tcp、およびudpたとえば、 'ether src foo'、 'arp net 128.3'、 'tcp port 21'などです。プロト修飾子がない場合は、その型と一致するすべてのプロトコルが仮定されます。 'net bar'は '(ip or arp or rarp)net bar'と 'port 53'を意味し、 'src foo'は '(ip or arp or rarp)src foo' '(tcpまたはudp)ポート53'を意味します。
    • 'fddi'は実際に 'ether'のエイリアスです。パーサーは「指定されたネットワークインターフェイスで使用されているデータリンクレベル」と同じ意味を扱います。FDDIヘッダーにはイーサネットのような送信元と宛先のアドレスが含まれています。 FDDIヘッダーには他のフィールドも含まれていますが、フィルター式で明示的に名前を付けることはできません。
    • 同様に、 'tr'は 'ether'のエイリアスです。 FDDIヘッダーに関する前の段落のステートメントもトークンリングヘッダーに適用されます。

上記に加えて、パターンに従わない特別な「プリミティブ」キーワードがあります:ゲートウェイ, 放送, もっと少なく, 大きい、および 算術 表現。これらのすべてについて以下で説明します。

より複雑なフィルタ式は、単語を使用して構築されますそして, または、およびない たとえば、 "ホストfooでポートftpではなくポートftp-dataではない"などのプリミティブを組み合わせることができます。入力を節約するために、同一の修飾語リストを省略することができる(例えば、 "tcp dst port ftpまたはftp-data or domain"は "tcp dst port ftpまたはtcp dst port ftp-dataまたはtcp dst port domain"と全く同じである)。

これらは、tcpdumpコマンドで許可されるプリミティブです。

  • dstホスト ホスト
    • パケットのIPv4 / v6宛先フィールドが ホスト これはアドレスまたは名前のいずれかです。
  • srcホスト ホスト
    • パケットのIPv4 / v6送信元フィールドが ホスト .
  • ホスト ホスト
    • パケットのIPv4 / v6ソースまたは宛先のいずれかが ホスト 。上記のホスト式のいずれにも、キーワードを先頭に付けることができます。ip, アルプス, ラルフ、またはip6、のように ipホスト ホスト (これは エーテルプロト ip ホスト ホスト)。
    • もし ホスト 複数のIPアドレスを持つ名前である場合、各アドレスが一致するかどうかがチェックされます。
  • エーテルdst 幽霊
    • イーサネット宛先アドレスが 幽霊 . エイスト / etc / ethersの名前でも、数値でも構いません(see section エーテル (数値形式の場合は3N)。
  • エーテルsrc 幽霊
    • イーサネット送信元アドレスが 幽霊 .
  • エーテルホスト 幽霊
    • イーサネットの送信元アドレスまたは宛先アドレスのいずれかが真 幽霊 .
  • ゲートウェイ ホスト
    • パケットが使用されている場合はtrue ホスト ゲートウェイとして(すなわち、イーサネットソースまたは宛先アドレスは ホスト IPソースもIP宛先も ホスト ).
    • ホスト 名前でなければならず、マシンのホスト名からIPアドレスへの解決メカニズム(ホスト名ファイル、DNS、NISなど)とマシンのホスト名からイーサネットアドレス解決メカニズム(/ etc /エーテルなど)。
    • 同等の式は次のとおりです。 エーテルホスト 幽霊 今やホスト ホスト これは、名前または番号のいずれかと一緒に使用できます ホスト/エホースト )この構文は、IPv6対応の設定では現時点では機能しません。
  • dst net ネット
    • パケットのIPv4 / v6宛先アドレスにネットワーク番号が ネット . ネット / etc / networksの名前かネットワーク番号です(see section ネットワーク(4) 詳細については)。
  • src net ネット
    • パケットのIPv4 / v6送信元アドレスが ネット .
  • ネット ネット
    • パケットのIPv4 / v6ソースまたは宛先アドレスのいずれかにネットワーク番号が ネット .
  • ネット ネット マスク ネットマスク
    • IPアドレスが一致する場合はTrue ネット 特定の ネットマスク 。資格を得ることができるsrc またはDST。この構文はIPv6では有効ではないことに注意してください ネット .
  • ネット ネット / len
    • IPv4 / v6のアドレスが一致する場合はTrue ネット ネットマスクで len ビット幅。資格を得ることができるsrc またはDST.
  • dstポート
    • パケットがip / tcp、ip / udp、ip6 / tcp、またはip6 / udpで、宛先ポート値が 港 。ザ 港 / etc / servicesで使用される番号または名前にすることができます( tcp (4P)および udp (4P))。名前を使用する場合は、ポート番号とプロトコルの両方がチェックされます。番号またはあいまいな名前が使用されている場合、ポート番号のみがチェックされます(たとえば、dstポート513 tcp / loginトラフィックとudp / whoトラフィックの両方を出力します。ポートドメイン tcp / domainとudp / domainの両方のトラフィックを表示します)。
  • srcポート
    • パケットの送信元ポート値が 港 .
    • パケットの送信元ポートまたは宛先ポートのいずれかが 港 。上記のいずれのポート式にも、キーワードの前に付けることができます。tcp またはudp、のように tcp src port 港 これは、送信元ポートが 港 .
  • もっと少なく 長さ
    • パケットの長さが以下の場合はtrue 長さ 。これは len <= 長さ .
  • 大きい 長さ
    • パケットが長さ以上の場合はtrue 長さ 。これは len> = 長さ .
  • ip proto プロトコル
    • パケットがIPパケットの場合はtrue( ip (4P))のプロトコルタイプ プロトコル . プロトコル 名前の番号または1つにすることができます icmp , icmp6 , igmp , igrp , ピム , ああ , esp , vrrp , udp 、または tcp 。なお、識別子 tcp , udp 、および icmp もキーワードであり、バックスラッシュ()を使用してエスケープする必要があります。これはCシェルでです。このプリミティブはプロトコルヘッダーチェーンを追跡しないことに注意してください。
  • ip6 proto プロトコル
    • パケットがプロトコルタイプのIPv6パケットであれば真 プロトコル 。このプリミティブはプロトコルヘッダーチェーンを追跡しないことに注意してください。
  • ip6 protochain プロトコル
    • パケットがIPv6パケットであり、タイプのあるプロトコルヘッダを含む場合は真 プロトコル そのプロトコルヘッダチェーン内にある。例えば、 ipv6 protochain 6 任意のIPv6パケットをプロトコルヘッダーチェーン内のTCPプロトコルヘッダーと照合します。パケットは、IPv6ヘッダとTCPヘッダとの間に、例えば、認証ヘッダ、ルーティングヘッダ、またはホップバイホップオプションヘッダを含むことができる。このプリミティブによって生成されたBPFコードは複雑で、BPFオプティマイザコードでは最適化できません。 tcpdump これはやや遅くなる可能性があります。
  • ip protochain プロトコル
    • に相当ip6 protochain プロトコル これはIPv4のためのものです。
  • エーテル放送
    • パケットがイーサネットブロードキャストパケットであれば真。ザ エーテル キーワードはオプションです。
  • ipブロードキャスト
    • パケットがIPブロードキャストパケットの場合はtrueです。これは、オールゼロとすべてのブロードキャストの両方の規則をチェックし、ローカルサブネットマスクをルックアップします。
  • エーテルマルチキャスト
    • パケットがイーサネットマルチキャストパケットであれば真。ザ エーテル キーワードはオプションです。これは、ether 0&1!= 0'.
  • ipマルチキャスト
    • パケットがIPマルチキャストパケットであれば真。
  • ip6マルチキャスト
    • パケットがIPv6マルチキャストパケットであれば真。
  • エーテルプロト プロトコル
    • パケットがether型の場合はtrue プロトコル . プロトコル 名前の番号または1つにすることができます ip , ip6 , アルプス , ラルフ , アトーク , あかん , デネット , スカ , ラット , mopdl , moprc , アイソ , stp , ipx 、または ネットブイ 。これらの識別子はキーワードでもあり、バックスラッシュ()でエスケープする必要があります。
    • FDDIの場合(例えば、fddiプロトコルarp')とトークンリング(例えば'trプロトコルのARP')、これらのプロトコルのほとんどでは、プロトコルIDは802.2論理リンク制御(LLC)ヘッダーから得られます。このヘッダーは通常、FDDIまたはトークンリングヘッダーの上にレイヤーされます。
    • FDDIまたはトークンリングでほとんどのプロトコル識別子をフィルタリングする場合、 tcpdump カプセル化されたイーサネットのために組織単位識別子(OUI)が0x000000であるいわゆるSNAP形式のLLCヘッダーのプロトコルIDフィールドのみをチェックします。パケットが0x000000のOUIでSNAP形式であるかどうかをチェックしません。
    • 例外は次のとおりです。 アイソ LLCヘッダーのDSAP(Destination Service Access Point)フィールドとSSAP(Source Service Access Point)フィールドをチェックし、 stp そして ネットブイ LLCヘッダーのDSAPをチェックします。 アトーク そこでは、0x080007のOUIとAppletalk etypeを持つSNAP形式のパケットをチェックします。
    • イーサネットの場合、 tcpdump それらのプロトコルの大部分についてイーサネットタイプフィールドをチェックします。例外は次のとおりです。 アイソ , 汁 、および ネットブイ FDDIとトークンリングの場合と同様に、802.3フレームをチェックし、LLCヘッダーをチェックします。 アトーク イーサネットフレーム内のAppletalk etypeと、FDDIおよびトークンリング用のSNAP形式パケットの両方をチェックします。 あかん OUIが0x000000のイーサネットフレームまたは802.2 SNAPフレームのAppletalk ARP etypeをチェックします。そして ipx イーサネットフレーム内のIPX etype、LLCヘッダー内のIPX DSAP、IPXのLLCヘッダーカプセル化がない802.3、およびSNAPフレーム内のIPX etypeをチェックします。
  • デネットsrc ホスト
    • DECNET送信元アドレスが ホスト DECNETホスト名のサポートは、DECNETを実行するように構成されているUltrixシステムでのみ使用可能です。 10.123の形式のアドレスまたはDECNETホスト名。
  • デネットネット ホスト
    • DECNET宛先アドレスが ホスト .
  • デネットホスト ホスト
    • DECNETの送信元アドレスまたは宛先アドレスのどちらかが真 ホスト .
  • ip, ip6, アルプス, ラルフ, アトーク, あかん, デネット, アイソ, stp, ipx, ネットブイ
    • 略語 エーテルプロト p どこで p 上記のプロトコルの1つです。
  • ラット, moprc, mopdl
    • 略語 エーテルプロト p どこで p 上記のプロトコルの1つです。ご了承ください tcpdump 現在これらのプロトコルの解析方法は知られていません。
  • VLAN vlan_id
    • パケットがIEEE 802.1Q VLANパケットであれば真。もし vlan_id パケットが指定されていれば真 vlan_id 。最初のVLAN 出会ったキーワード 表現 残りの部分の復号オフセットを変更する 表現 パケットがVLANパケットであることを前提にしています。
  • tcp, udp, icmp
    • 略語 ip proto p またはip6 proto p どこで p 上記のプロトコルの1つです。
  • イソプロプロト プロトコル
    • パケットがプロトコルタイプのOSIパケットであれば真 プロトコル . プロトコル 名前の番号または1つにすることができます clnp , エイズ 、または アイシス .
  • clnp, エイズ, アイシス
    • 略語 イソプロプロト p どこで p 上記のプロトコルの1つです。ご了承ください tcpdump これらのプロトコルを解析する不完全な仕事をします。
  • expr relop expr
    • 関係が成立する場合はtrue、 リロップ >、<、> =、<=、=、!=、および expr は、整数定数(標準C構文で表される)、通常の2項演算子+、 - 、*、/、&、|、長さ演算子、および特殊パケット・データ・アクセッサで構成される算術式です。パケット内のデータにアクセスするには、次の構文を使用します。 proto expr:size .

プロト の一つでありますエーテル, fddi, tr, ppp, スリップ, リンク, ip, アルプス, ラルフ, tcp, udp, icmp、または ip6、索引操作のためのプロトコル層を示します(エーテル, fddi, tr, ppp, スリップ、およびリンク すべてリンク層を参照してください)。ご了承ください tcp、udp 、その他の上位層のプロトコルタイプはIPv6ではなくIPv4にのみ適用されます(これは将来修正される予定です)。示されたプロトコル層に対するバイトオフセットは、 expr . サイズ オプションであり、関心のあるフィールドのバイト数を示す。 1つ、2つ、または4つのいずれかになり、デフォルトは1になります。キーワードによって示される長さ演算子len、パケットの長さを与える。

例えば、 'ether 0&1!= 0'はすべてのマルチキャストトラフィックをキャッチします。表現 'ip 0&0xf!= 5'オプションですべてのIPパケットをキャッチします。表現 'ip 6:2&0x1fff = 0フラグメント化されていないデータグラムと断片化されたデータグラムのフラグメントゼロだけを捕捉します。このチェックは暗黙のうちにtcp そしてudp インデックス操作。例えば、 tcp 0 常にTCPの最初のバイトを意味します ヘッダ 、介在するフラグメントの最初のバイトを決して意味しません。

いくつかのオフセットおよびフィールド値は、数値としてではなく名前として表される場合があります。以下のプロトコルヘッダフィールドのオフセットが利用可能です: icmptype (ICMPタイプフィールド)、icmpcode (ICMPコードフィールド)、およびtcpflags (TCPフラグフィールド)。

次のICMPタイプフィールド値を使用できます。icmp-echoreply, icmp-unreach, icmp-sourcequench, icmp-redirect, icmp-echo, icmp-routeradvert, icmp-routersolicit, icmp-timxceed, icmp-paramprob, icmp-tstamp, icmp-tstampreply, icmp-ireq, icmp-ireqreply, icmp-maskreq, icmp-maskreply.

次のTCPフラグフィールド値を使用できます。tcp-fin, tcp-syn, tcp-rst, tcp-push, tcp-push, tcp-ack, tcp-urg.

プリミティブは、次のいずれかを使用して組み合わせることができます。

  • カッコで囲まれたプリミティブと演算子のグループ(括弧はシェルにとって特別であり、エスケープする必要があります)
  • 否定( '!'または'ない')
  • 連結( '&&'または'そして')
  • 交替( '||'または'または')

否定は最も高い優先順位を持つ。交替と連結は同じ優先順位を持ち、左から右に関連付けられます。明示的にそして 並置ではなくトークンが連結のために必要です。

キーワードなしで識別子が与えられた場合、最も新しいキーワードが仮定されます。例えば、 ホスト対エースではない 短くて ホストとホストのエースではない。しかし、これを ない(ホスト対エース).

式の引数を渡すことができます tcpdump 単一の引数または複数の引数のいずれかとして、どちらか便利な方を選択します。一般に、式にシェルのメタキャラクタが含まれている場合は、引用符で囲まれた単一の引数として渡す方が簡単です。複数の引数は、解析される前にスペースで連結されます。

Tcpdumpの例

tcpdumpホストのダウントウ

上記のtcpdumpコマンドは、到着または出発するすべてのパケットを印刷するために使用されます 日没。

tcpdumpホストheliosと(ホットまたはエース)

このtcpdumpの例では、 ヘリオス と ホット または エース。

tcpdump ip host aceとheliosではない

このtcpdumpコマンドを使用すると、 エース および他のホスト ヘリオス。

tcpdump net ucb-ether

上の例では、tcpdumpはBerkeleyのローカルホストとホスト間のすべてのトラフィックを出力します。

tcpdump 'ゲートウェイsnupと(ポートftpまたはftp-data)'

この次のtcpdumpコマンドの例は、インターネットゲートウェイ経由ですべてのFTPトラフィックを出力するために使用されます スナップ 。シェルが括弧を誤って解釈しないように、式を引用することに注意してください。

tcpdump ipとネットではない localnet

上記のtcpdumpの例では、ローカルホストからのものでも、ローカルホストからのものでもないトラフィックを出力します。

tcpdump 'tcp tcpflags&(tcp-syn | tcp-fin)!= 0ではなく、srcとdst net localnet '

上記のtcpdumpの例では、このコマンドは、非ローカルホストを含​​む各TCP会話の開始パケットと終了パケット(SYNとFINパケット)を出力するために使用されます。

tcpdump 'ゲートウェイsnupおよびip 2:2> 576'

上記のコマンドは、ゲートウェイ経由で送信された576バイトを超えるIPパケットを出力します スヌープ。

tcpdump 'ether 0&1 = 0、ip 16> = 224'

上記のtcpdumpコマンドは、IPブロードキャストまたはマルチキャストパケットを出力します。 ない イーサネットブロードキャストまたはマルチキャスト経由で送信されます。

tcpdump 'icmp icmptype!= icmp-echoとicmp icmptype!= icmp-echoreply'

この最後のtcpdumpの例では、コマンドはエコー要求または応答ではない(つまりpingパケットではない)すべてのICMPパケットを出力します。

Tcpdumpの出力形式

の出力 tcpdump プロトコルに依存します。以下に、ほとんどの形式の簡単な説明と例を示します。

リンクレベルヘッダー。 '-e'オプションを指定すると、リンクレベルヘッダが出力されます。イーサネットネットワークでは、送信元アドレスと宛先アドレス、プロトコル、およびパケット長が印刷されます。

FDDIネットワークでは、 '-e'オプションは、 tcpdump 「フレーム制御」フィールド、送信元アドレスと宛先アドレス、およびパケット長を印刷します。 (IPデータグラムを含むパケットなどの)通常のパケットは、0と7の間のプライオリティ値を持つ 'async'パケットです。例えば、 `` frame control ''フィールドはパケットの残りの部分を解釈します。async4'そのようなパケットは、802.2論理リンク制御(LLC)パケットを含むと仮定される。もしあれば、LLCヘッダーが印刷されます。 ない ISOデータグラムまたはいわゆるSNAPパケットである。

トークンリングネットワークでは、 '-e'オプションは、 tcpdump 「アクセス制御」および「フレーム制御」フィールド、送信元および宛先アドレス、およびパケット長を印刷する。 FDDIネットワークの場合と同様に、パケットはLLCパケットを含むと仮定される。 '-e'オプションが指定されているかどうかにかかわらず、ソースルーティング情報はソースルートパケット用に出力されます。

(N.B.:以下の説明は、RFC-1144に記載されているSLIP圧縮アルゴリズムに精通していることを前提としています)。

SLIPリンクでは、方向インジケータ(インバウンドの場合は「I」、アウトバウンドの場合は「O」)、パケットタイプ、および圧縮情報が印刷されます。パケットタイプが最初に印刷されます。 3つのタイプは ip , utcp 、および ctcp 。次のリンク情報は印刷されません ip パケット。 TCPパケットの場合は、接続識別子がタイプに従って出力されます。パケットが圧縮されている場合、そのエンコードされたヘッダーが出力されます。特殊なケースは、* S + n そして* SA + n 、どこで n シーケンス番号(またはシーケンス番号とack)が変更された量です。特殊なケースでない場合は、0回以上の変更が出力されます。変更は、U(緊急ポインタ)、W(ウィンドウ)、A(ack)、S(シーケンス番号)、およびI(パケットID)の後にデルタ(+ nまたは-n)、または新しい値(= n)である。最後に、パケット内のデータ量と圧縮ヘッダ長が出力されます。

たとえば、次の行は、暗黙の接続識別子を持つ発信圧縮パケットを示しています。 ackは6、シーケンス番号は49、パケットIDは6で変更されました。 3バイトのデータと6バイトの圧縮ヘッダがあります。

O ctcp * A + 6 S + 49 I + 6 3(6)

Arp / rarpパケット。 Arp / rarp出力には、要求のタイプとその引数が表示されます。形式は自明であることを意図しています。ここでは、ホストからの 'rlogin'の開始から取った短いサンプルを示します rtsg 主催する csam :

arp who-csam tell rtsgarp reply csam is-at CSAM

最初の行は、rtsgがインターネットホストcsamのイーサネットアドレスを要求するARPパケットを送信したことを示しています。 Csamはそのイーサネットアドレスで応答します(この例では、イーサネットアドレスは小文字の大文字と小文字のインターネットアドレスです)。

私たちがやったなら、これはあまり冗長に見えません tcpdump -n :

arp who-has 128.3.254.6 tell 128.3.254.68arp reply 128.3.254.6 is at 02:07:01:00:01:c4

私たちがやったなら tcpdump -e 最初のパケットがブロードキャストされ、2番目のパケットがポイントツーポイントであるという事実が見えるでしょう:

RTSGブロードキャスト0806 64:arp who-has csam tell rtsgCSAM RTSG 0806 64:arp reply csam is-at CSAM

最初のパケットの場合、イーサネットソースアドレスはRTSG、宛先はイーサネットブロードキャストアドレス、タイプフィールドは16進数0806(ETHER_ARPタイプ)、合計長は64バイトです。

TCPパケット (N.B.:以下の説明では、RFC-793に記述されているTCPプロトコルに精通していることを前提としています。プロトコルに精通していない場合は、この説明もtcpdumpも大変役に立ちません) 。 tcpプロトコル行の一般的な形式は次のとおりです。

src> dst:flags data-seqno ackウィンドウ緊急オプション

Src そして DST 送信元および宛先のIPアドレスとポートです。 フラグ S(SYN)、F(FIN)、P(PUSH)またはR(RST)または単一の '。 (フラグなし)。 データ配列 このパケット内のデータによってカバーされるシーケンス空間の部分を記述する(以下の例を参照)。 Ack この接続で他の方向に期待される次のデータのシーケンス番号です。 窓 このコネクションのもう一方の方向に利用可能な受信バッファ空間のバイト数です。 Urg パケットに「緊急」なデータがあることを示します。 オプション 山括弧で囲まれたtcpオプションです(例: ).

Src、dst、 そして フラグ 常に存在する。その他のフィールドは、パケットのTCPプロトコルヘッダーの内容に依存し、適切な場合にのみ出力されます。

ここには、ホストからのrloginの開始部分があります rtsg 主催する csam .

rtsg.1023> csam.login:S 768512:768512(0)win 4096 csam.login> rtsg.1023:S 947648:947648(0)ack 768513 win 4096 rtsg.1023> csam.login:。アック1勝4096rtsg.1023> csam.login:P 1:2(1)ack 1 win 4096csam.login> rtsg.1023:。アック2勝4096rtsg.1023> csam.login:P 2:21(19)ack 1 win 4096csam.login> rtsg.1023:P 1:2(1)ack 21 win 4077csam.login> rtsg.1023:P 2:3(1)ack 21 win 4077 urg 1csam.login> rtsg.1023:P 3:4(1)ack 21 win 4077 urg 1

最初の行は、rtsgのtcpポート1023がパケットをポートに送信したことを示しています ログイン on csam。ザS は、 SYN フラグが設定されました。パケットシーケンス番号は768512であり、データは含まれていませんでした。 (表記は 'first:last(nbytes)'です。これは 'シーケンス番号 最初 〜まで 最終 それは nバイト ユーザーデータのバイト ')。ピギーバックackはありませんでした。利用可能な受信ウィンドウは4096バイトでした。最大セグメントサイズオプションは1024バイトのmssを要求していました。

Csamは、rtsgのSYNにピギーバックされたackを含む以外は同様のパケットで応答します。 RtsgはcsamのSYNを受け取ります。 '。'フラグが設定されていないことを意味します。パケットにはデータが含まれていないため、データシーケンス番号はありません。 ackシーケンス番号は小さい整数(1)であることに注意してください。初めて tcpdump tcp '会話'を見ると、パケットからシーケンス番号が出力されます。会話の後続パケットでは、現在のパケットのシーケンス番号とこの初期シーケンス番号との間の差異が印刷される。これは、最初のバイトの後のシーケンス番号が、会話のデータストリーム内の相対的なバイト位置として解釈されることができることを意味する(最初のデータバイトは各方向が「1」である)。 '-S'はこの機能を無効にし、元のシーケンス番号を出力します。

6行目で、rtsgはcsamに19バイトのデータ(会話のrtsg - > csam側の2〜20バイト)を送信します。 PUSHフラグがパケットに設定されます。 7行目ではcsamはrtsgから送られてきたバイト21までのデータを受信したと言っています。このデータの大半はcsamの受信ウィンドウが19バイト小さくなっているためソケットバッファに格納されているようです。 Csamはこのパケットの1バイトのデータをrtsgに送信します。 8行目と9行目では、csamが2バイトの緊急プッシュデータをrtsgに送信します。

スナップショットが十分に小さく tcpdump 完全なTCPヘッダーを取得していない場合は、可能な限り多くのヘッダーを解釈し、「| tcp ''を使用して、残りを解釈できなかったことを示します。ヘッダーに偽のオプションが含まれている場合(長さが小さすぎるか、ヘッダーの終わりを超えているもの) tcpdump それを「 悪い選択 ''(どこから始めるかは分からないので)これ以上のオプションは解釈しません。ヘッダーの長さがオプションが存在するがIPデータグラムの長さがオプションが実際にそこに存在するのに十分な長さでないことを示している場合、 tcpdump それを「 悪いhdrの長さ ''.

特定のフラグの組み合わせでパケットをキャプチャする。 TCPヘッダーの制御ビットセクションには8ビットあります。

CWR | ECE | URG | ACK | PSH | RST | SYN |フィン

TCP接続の確立に使用されるパケットを監視したいと仮定しましょう。 TCPは、新しい接続を初期化するときに3方向ハンドシェイクプロトコルを使用することを思い出してください。 TCP制御ビットに関する接続シーケンスは以下の通りである。

  1. 発信者はSYNを送信します。
  2. 受信者はSYN、ACKで応答します。
  3. 発信者はACKを送信します。

今度は、SYNビットのみが設定されたパケットをキャプチャすることに興味があります(ステップ1)。我々はステップ2(SYN-ACK)からのパケット、単純な初期SYNだけを望んでいないことに注意してください。私たちが必要とするのは、 tcpdump .

オプションのないTCPヘッダーの構造を思い出してください:

0 15 31-----------------------------------------------------------------| | |-----------------------------------------------------------------| |-----------------------------------------------------------------| |-----------------------------------------------------------------| HL | rsvd | C | E | U | A | P | R | S | F | |ウィンドウサイズ|-----------------------------------------------------------------| TCPチェックサム|緊急ポインタ|-----------------------------------------------------------------

オプションが存在しない限り、TCPヘッダーは通常20オクテットのデータを保持します。グラフの1行目はオクテット0〜3を、2行目はオクテット4〜7を示します。

0でカウントすることを開始すると、関連するTCP制御ビットはオクテット13に含まれます。

0 7| 15| 23| 31----------------|---------------|---------------|----------------| HL | rsvd | C | E | U | A | P | R | S | F | |ウィンドウサイズ|----------------|---------------|---------------|----------------| | | 13オクテット| | |

オクテット番号を詳しく見てみましょう。 13:

| | |---------------| | C | E | U | A | P | R | S | F | |---------------| |7 5 3 0|

これらは私たちが興味を持っているTCP制御ビットです。このオクテットのビットは、右から左に0から7まで番号が付けられているため、PSHビットはビット番号3で、URGビットは5番です。

SYNが設定されたパケットだけをキャプチャすることを思い出してください。 TCPデータグラムが到着し、SYNビットがヘッダに設定されている場合、オクテット13がどうなるかを見てみましょう:

| C | E | U | A | P | R | S | F | |---------------| |0 0 0 0 0 0 1 0| |---------------| |7 6 5 4 3 2 1 0|

制御ビットセクションを見ると、ビット番号1(SYN)だけが設定されていることがわかります。

オクテット番号13がネットワークバイトオーダーの8ビット符号なし整数であると仮定すると、このオクテットのバイナリ値は次のようになります。

00000010

その小数の表現は次のとおりです。

7 6 5 4 3 2 1 00*2 + 0*2 + 0*2 + 0*2 + 0*2 + 0*2 + 1*2 + 0*2 = 2

SYNが設定されていれば、TCPヘッダの13番目のオクテットの値は、ネットワークバイトオーダーで8ビットの符号なし整数として解釈されるとき、正確に2でなければならないことがわかっているので、ほぼ完了しました。

この関係は、次のように表すことができます。

tcp 13 == 2

この式を次のフィルタとして使用できます。 tcpdump SYNだけをセットしたパケットを見るためには:

tcpdump -i xl0 tcp 13 == 2

式は、「TCPデータグラムの13番目のオクテットに10進値2を持たせる」と言っています。これはまさに私たちが望むものです。

ここで、SYNパケットをキャプチャする必要があると仮定しますが、ACKや他のTCP制御ビットが同時に設定されているかどうかは気にしません。 SYN-ACKセットを持つTCPデータグラムが到着すると、オクテット13に何が起こるかを見てください:

| C | E | U | A | P | R | S | F | |---------------| |0 0 0 1 0 0 1 0| |---------------| |7 6 5 4 3 2 1 0|

ビット1と4は現在、13番目のオクテットに設定されています。オクテット13のバイナリ値は次のとおりです。

00010010

これは10進数に変換されます。

7 6 5 4 3 2 1 00*2 + 0*2 + 0*2 + 1*2 + 0*2 + 0*2 + 1*2 + 0*2 = 18

私たちは 'tcp 13 == 18'を tcpdump これは、SYN-ACKが設定されているパケットのみを選択し、SYNのみを設定したパケットは選択しないためです。 SYNが設定されている限り、ACKやその他の制御ビットが設定されているかどうかは気にしません。

私たちの目標を達成するためには、オクテット13のバイナリ値をSYNビットを保存するために他の値と論理的にANDする必要があります。どのような場合でもSYNを設定することが望ましいので、13番目のオクテットの値とSYNのバイナリ値を論理的にANDします。

00010010 SYN-ACK 00000010 SYN AND 00000010(SYNが必要です)と00000010(SYNが必要です) -------- -------- = 00000010 = 00000010

このAND演算はACKか別のTCP制御ビットが設定されているかどうかにかかわらず同じ結果を提供することがわかります。この演算の結果と同様に、AND値の小数表現は2(2進数00000010)です。したがって、SYNが設定されたパケットの場合、次の関係が成り立つ必要があります。

((オクテット13の値AND(2))==(2)

これは、 tcpdump フィルタ式

tcpdump -i xl0 'tcp 13&2 == 2'

式の中に一重引用符またはバックスラッシュを使用して、AND( '&')特殊文字をシェルから隠す必要があることに注意してください。

UDPパケット。 UDPフォーマットは、このrwhoパケットによって示されています。

actinide.who>放送。誰:udp 84

これは、ポート 誰 ホスト上 アクチニド udpデータグラムをポートに送信しました 誰 ホスト上 放送 、インターネットブロードキャストアドレス。パケットには84バイトのユーザーデータが含まれていました。

一部のUDPサービスは、ソースまたは宛先ポート番号から認識され、上位レベルのプロトコル情報、特にNFSへのドメインネームサービス要求(RFC-1034/1035)およびSun RPC呼び出し(RFC-1050)が認識されます。

UDPネームサーバ要求 (N.B.:以下の説明では、RFC-1035に記載されているドメインサービスプロトコルに精通していることを前提としています。

ネームサーバ要求は次のようにフォーマットされます。

src> dst:id op?フラグqtype qクラス名(len) h2opolo.1538> helios.domain:3+ A? ucbvax.berkeley.edu。 (37)

ホスト h2ポリ ドメインサーバーに ヘリオス その名前に関連付けられたアドレスレコー