問題タブ [pcap]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
linux - libpcap setfilter() 関数とパケット損失
これは@stackoverflowでの最初の質問です。
私は一部の VoIP 運用サーバー用の監視ツール、特に Perl の pcap ライブラリを使用して特定のパターンに一致するすべてのトラフィック (VoIP 呼び出し) をキャプチャできるスニフ ツールを作成しています。
「udp」などの貧弱な選択的フィルターを使用して、アプリのコードですべてのフィルタリングを行うことはできません。これは、トラフィックが多すぎて、カーネルがパケット損失の報告に対処できないためです。
次に行うことは、キャプチャ中に可能な限り選択的なフィルターを繰り返し構築することです。最初に、(すべての) SIP シグナリング トラフィックと IP フラグメントのみをキャプチャします (パターン マッチは、どのような場合でもアプリケーション レベルで実行する必要があります)。次に、RTP に関する情報を SIP パケットに見つけたら、「or」句を追加します。特定の IP と PORT を含む実際のフィルター文字列を取得し、setfilter() でフィルターを再設定します。
したがって、基本的には次のようなものです。
初期フィルター : "(udp and port 5060) or (udp and ip[6:2] & 0x1fff != 0)" -> すべての SIP トラフィックと IP フラグメントをキャプチャします
更新されたフィルター: "(udp and port 5060) or (udp and ip[6:2] & 0x1fff != 0) or (host IP and port PORT)" -> 特定の IP、PORT の RTP もキャプチャします
更新されたフィルター: "(udp and port 5060) or (udp and ip[6:2] & 0x1fff != 0) or (host IP and port PORT) or (host IP2 and port PORT2)" -> 2 番目の RTP ストリームをキャプチャします同じように
等々。
監視目的でRTPストリームの「実際の」パケット損失を取得できるため、これは非常にうまく機能しますが、ツールの選択的フィルターバージョンが不十分な場合、いくつかのパケットがあったため、RTPパケット損失率は信頼できませんでしたカーネルによるパケット ドロップが原因で欠落しています。
しかし、このアプローチの欠点に取り掛かりましょう。
キャプチャ中に setfilter() を呼び出すと、関数 set_kernel_filter() のコード コメントで pcap-linux.c (libpcap バージョン 0.9 および 1.1 を確認) に記載されているように、libpcap が「フィルターの変更中に」受信したパケットをドロップするという事実が含まれます。
setfilter() を呼び出すと、一部のパケットが IP フラグメント化されて到着し、一部のフラグメントが失われます。これは、最後に libpcap 統計によって報告されません: トレースを掘り下げているのを見つけました。
これで、このアクションが libpcap によって行われる理由がわかりましたが、私の場合、パケットをドロップする必要はまったくありません (関係のないトラフィックを取得することは気にしません)。
libpcap のコードを変更していないこの問題を解決する方法について何か考えはありますか?
c - pcapを使用してPOSTリクエストをフィルタリングするには?
C で pcap ライブラリをいじっています。pcap_compile 呼び出しでフィルター式「ポート 80」を使用して http トラフィックをフィルター処理できますが、POST 要求を具体的にフィルター処理できるかどうか疑問に思っています。
http POST リクエストをフィルタリングするためのフィルター式を知っている人はいますか?
c - pcap なぜ常に 8 バイトのパケットなのか...なぜ?
pcap ライブラリを使用していますが、常に次の出力が得られる理由がわかりません。
サイズの新しいパケット: udata= 8 hdr=8 pkt=8
これはコードです:
そして私が使用する別のファイルで:
出力するのは正常ですか?
私のプログラムが時々うまくいかないことがあるので、そうではないと思います..
c - HTTP POST ..なぜ何も印刷しないのですか?
http トラフィックをチェックする pcap ライブラリを使用してスニファー プログラムを作成しています。GET メッセージまたはステータス コードを探している場合は成功しますが、投稿要求では機能しない理由がわかりません。私はwiresharkを使用しようとしましたが、POSTリクエストの場合、httpプロトコルに加えて、行ベースのテキストデータもあります: application/x-www-form-urlencoded "protocol". ペイロードのコンテンツを印刷しようとすると、結果が得られないか、奇妙な文字が表示されます..だから、問題はこの「行ベース..」のものではないかと考えていました..考えられる原因はありますか?
c - パケットの奇妙な文字
libpcap を使用して http パケットのスニファーを作成しています。http ペイロードのコンテンツを印刷すると、奇妙な文字が表示されることがあります。
*xNT:���3�@�"P#1u`��$%S{M��
また
�~�tsE��}>a�����}/���`�▒�A�y
答えてくれてありがとう。
ヘッダーがプレーンテキストの場合、問題は私のコードです。
とにかく、POST リクエストを base64 でコーディングできますか?
udp - WiresharkにUDP/IP /イーサネットヘッダーのないヘッダーのないpcapファイルを読み取らせるにはどうすればよいですか?
Wiresharkは、すべてのパケットにTCP / UDP /イーサネットヘッダーを必要としないフォーマットをサポートしていますか?
Wiresharkがサポートする他の(非pcap)フォーマットをいただければ幸いです。さらに調査するために、ヘッダーのないデータをwiresharkに取り込む必要があります。
c++ - pcap_set_rfmon が機能しない?
デバイスをモニター モードに設定しようとしていますが、「iwconfig wlan0 モード モニター」を実行してモニター モードにできることはわかっています。コードを実行すると、どこからでもパケットをキャプチャできます。
問題は、libpcap で (上記のコマンド ラインを入力せずに) デバイスを監視モードに設定できないことです。手動でアクセス ポイントに接続するまで、パケットをキャプチャできません。
これはコードの問題ですか、それとも pcap ライブラリの問題ですか?コマンド ラインを使用せずにデバイスを監視モードに設定した人はいますか?私は Realtek2500 を使用しています。
c++ - アクセス ポイントとそれに接続されているホストの MAC アドレスを取得するにはどうすればよいですか?
IEEE 802.11 フレームをキャプチャして MAC アドレスを表示するには、libpcap ライブラリを使用する必要があることを知っています。
pcap_loop のコールバック関数で、パケットから MAC アドレスを抽出するにはどうすればよいですか? 異なるタイプのパケットを区別するにはどうすればよいですか? グーグルで調べても、ほとんどの場合、有線インターフェイスからパケットを抽出する方法についてはあまり答えがありません。
networking - pcap関数:pcap_open()の質問
コンピューターでデバイスを正常に見つけて、pcap_open(...)を呼び出すと、コンピューターとの間でのみパケットが送受信されますか?ネットワーク上の他のコンピューティングはどうですか?まだ送信されていないパケットが表示されますか?
c - libpcapはAF_LINKからMACを取得しますsockaddr_dl(OSX)
私はCを使用してOSX上のすべてのインターフェイスのMACアドレスを取得しようとしています。Linuxを取得する一般的な方法はBSDでは機能しません-私が見たすべてのものから、インターフェイスを取得し、タイプのインターフェイスを探す必要がありますAF_LINK。私の問題は、LLADDR(sockaddr_dl)が大量のデータ(MACを含む)を提供し、データの形式がわからないことです。たとえば、次のコードが出力されます。
デバイス:en1リンクsdl_alen:101 mac:31:f8:1e:df:d6:22:1d:00:00:00:00:00:00:00:00:00:00:00:00:00:00 :00:b0:06:10:00:01:00:00:00:c0:02:10:00:01:00:00:00:00:00:00:00:00:00:00:00 :40:03:10:00:01:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:03:00:6c :6f:30:00:00:00:00:00:00:00:00:00:00:00:00:00:70:03:10:00:01:00:00:00:e0:02 :10:00:01:00:00:
私のMACは太字です。これはいつものフォーマットのようですが、LLADDR(sockaddr_dl)を何かにキャストできればもっと快適になります。net / if_dl.hでは、LLADDRは次のように定義されています。
これは、私が知る限り、結果はタイプ(void *)であると言っています-助けにはなりません。
のような他の投稿:
ioctl / SIOCGIFADDR/SIOCGIFCONFを使用してMacOSXでイーサネットインターフェイス情報を取得する方法を理解するのに問題がありますか?
彼らはそれを理解していると思っているようですが、コードを見ると、sdl_alenが6ではないために機能しないことがわかります。