web-dev-qa-db-ja.com

tcpdump:「キャプチャされたパケット」と「フィルターによって受信されたパケット」

呼び出すスクリプトがあります

tcpdump -v src Host <IP address> and port <port number> >>out.txt 2>>err.txt -w capture.cap

スクリプトの他の部分がバックグラウンドで一部のトラフィックを開始する間、複数のIP-sで。パケットが戻ってくるかどうかを確認し、パッケージを受け取った場合のみ手動で調べます。 tcpdumpのエラー出力は、最初はこれで問題ないように見えました。

問題は、主題が示唆するように、「キャプチャされたパケット」と「フィルターによって受信されたパケット」の違いは何ですか?パケットを記録しなかったキャプチャがありますが、「0パケットがキャプチャされ、2パケットがフィルタによって受信されました」という出力が矛盾しているように聞こえます。最初は「フィルターで受信された0パケット」を探していましたが、パケットが受信されなかった場合は、常にエラー出力に書き込まれるわけではありません。では、これらの数字は何を示しているのでしょうか?

応答パケットが受信されなかった場合にそれらのケースをフィルタリングしたい場合、何を探すべきかを知る必要があります。

11
Alex Biro

私はこれが問題にいくつかの光を投げかけると思います。 manpage から:

Tcpdumpがパケットのキャプチャを完了すると、次の数を報告します。

キャプチャされたパケット(これは、tcpdumpが受信して処理したパケットの数です);

filterによって受信されたパケット(これの意味は、tcpdumpを実行しているOS、および場合によってはOSの構成方法によって異なります。コマンドラインでフィルターが指定された場合、一部のOSでは、フィルター式で一致したかどうかに関係なくパケットをカウントし、フィルター式で一致した場合でも、tcpdumpがまだパケットを読み取って処理したかどうかに関係なくパケットをカウントしますOSは、tcpdumpがまだそれらを読み取って処理したかどうかに関係なく、フィルター式によって一致したパケットのみをカウントし、他のOSでは、フィルター式によって一致し、tcpdumpによって処理されたパケットのみをカウントします);

カーネルによってドロップされたパケット(これは、OSのパケットキャプチャメカニズムによって、バッファスペースの不足のためにドロップされたパケットの数です。 OSがその情報をアプリケーションに報告する場合、どのtcpdumpが実行されているか、そうでない場合、0として報告されます。

そして、 2009年のメーリングリストエントリ の説明があります。

"filters received by filter"番号は、pcap_stats()の呼び出しからのps_recv番号です。 [〜#〜] bpf [〜#〜] の場合、これはbs_recvからのBIOCGSTATS ioctl番号です。その数には、BPFに渡されたすべてのパケットが含まれます。これらのパケットは、まだlibpcapによって読み取られていない(したがってtcpdumpに渡されていない)バッファーにあるか、またはlibpcapによって読み取られたがtcpdumpにまだ渡されていないバッファーにある可能性があるため、パケットをカウントできます。 「キャプチャされた」とは報告されません。

たぶんプロセスが速すぎて殺されますか? Nパケットがキャプチャされたときにtcpdumpを終了するように指示する-c Nフラグもあります。

あなたの問題はかなり専門的であるように見えるので、 libpcapを直接使用 または 数百の言語バインディングの1つを介して することもできます。

あなたの質問に、あなたが得るすべてはcapture.capファイルのcapturedパッケージであるので、あなたはそれが空ではない実行を見て、これらを調べることができます、すなわち、ええと、行を数えますか?

tcpdump -r capture.cap | wc -l

Libpcapを使用してキャプチャファイルのエントリ数を返すより良い方法があると思います...

12
sr_