0

これが下手な質問ならごめんなさい。私はtcpdumpとpcapが初めてです。指定されたポートで TCP データをリッスンするアプリケーションを開発およびアプリケーションするために、pcap 静的ライブラリを使用しています。小さなプロトタイプを作成しましたが、ポート 80 (HTTP のデフォルト) 経由で送信された tcp パケットをスニッフィングするときにうまく機能します。ただし、ポート 5984 (これは CouchDB が使用するデフォルトのポートです) との間の HTTP パケットを表示したいと考えています。なんらかの理由で、アプリケーションがこのポートのパケットを認識/スニッフィング/表示しません。私はベテランのネットワーク開発者ではないので、おそらく基本的な何かが欠けています。

ここにアプリケーション全体を貼り付けたくはありませんが、問題を見つけるために必要なコードを追加できます。教えてください。

これは私の pcap フィルター式です:

 char filter_exp[] = "tcp port 5984";/* The filter expression */

フィルタは問題なくコンパイルされ、pcap セッションで設定されます。セッションは無差別モードで実行するように設定されています。

    //get a pcap session
    //args device, # of packets to capture, promisc mode, timeout, err buff
    handle = pcap_open_live(dev, BUFSIZ, 1, 1000, errbuf);
    if (handle == NULL) {
        fprintf(stderr, "Couldn't open device %s: %s\n", dev, errbuf);
        return(2);

     //compile our filter
    if (pcap_compile(handle, &fp, filter_exp, 0, net) == -1) {
        fprintf(stderr, "Couldn't parse filter %s: %s\n", filter_exp, pcap_geterr(handle));
        return(2);
    }
    //set the filter
    if (pcap_setfilter(handle, &fp) == -1) {
        fprintf(stderr, "Couldn't install filter %s: %s\n", filter_exp, pcap_geterr(handle));
        return(2);
    }
    
    //begin sniffing packets. cnt -1: keep sniffing until err occurs
    //last arg is optional. It can be used to pass additonal information to callback
    pcap_loop(handle, -1, got_packet, NULL);

「got_packet」は私のコールバック関数です。これは、同じフィルターを使用して何度も呼び出されますが、5984 の代わりにポート 80 が使用されます。

私が試したカールを使用して:$ curl http://localhost:5984/test

念のため、ループバックを使用してみました:$ curl http://127.0.0.1:5984/test

これらは両方とも、私の pcap アプリケーションでは気付かれません。ただし、フィルターをポート 80 でリッスンするように変更し、$ を実行するとcurl http://www.google.com

パケットが通過しているのがわかります。私は何を見落としているか、理解していませんか?

どうもありがとう!

-ニック

4

1 に答える 1

2

パケットが Mac から同じ Mac に送信される場合 - たとえば、「localhost」または 127.0.0.1 と通信している場合 (どちらも同じです - 「localhost」は 127.0.0.1 に解決されます)、キャプチャー onlo0ではなくオンen0またはen1。127.0.0.1 へのトラフィックは実際のネットワークでは送信されず、内部でマシンにループバックされるため、「ループバック」ネットワークと「ループバック」インターフェースを調べる必要があります。

(同様の回答が他の UN*Xes にも当てはまります。ただし、Linux では、ループバック インターフェイスはloではなくと呼ばれるだけlo0です。Windows には同等のものはなく、Solaris 10 以前などの UN*X の一部のバージョンでは、ループバック インターフェイスでキャプチャします)。

于 2013-06-15T23:38:26.843 に答える