0

ここのコードに従い、IP アドレスの出力に関する問題を修正しました。私のマシンからキャプチャされたファイルを読み取るときに完全に機能し、結果は tcpdump と同じです。しかし、別の pcap ファイル (大規模なネットワークの境界ルーターからキャプチャされたもの) を読み取ると、まったく異なる IP アドレスが返されます。これらの pcap には、イーサネット フレームに VLAN が含まれていることがわかりました。パケットに vlan ヘッダーが含まれているかどうかを検出するにはどうすればよいですか?

4

1 に答える 1

0

物理層プロトコル (最近ではイーサネットである可能性が最も高い) を調べて、イーサネットの種類 (イーサネット ヘッダーの 13 番目と 14 番目のバイト) を特定する必要があります。可能なイーサネットの種類のリストの例は、こちらで確認できます。

タイプが 0x0800 (IPv4) の場合、すべてが期待どおりに機能するはずです。

ただし、ethertype が 0x8100 (802.1Q) の場合、VLAN ヘッダー (17 番目と 18 番目のバイト) から実際のペイロード タイプを抽出する必要があります。

これは、イーサネットの先頭を指すベースアドレスから始まる上位レイヤーをバイパスするための非常に大雑把なコードです

char *get_ip_hdr(char *base) {

    // If frame is not ethernet retun NULL

    uint16_t ether_type = ntohs(*(uint16_t *) (base + 12));
    if (ether_type == 0x0800 ) {
        return base + 14;
    } else if (ether_type == 0x8100 ) {
        // VLAN tag
        ether_type = ntohs(*(uint16_t *) (base + 16));
        if (ether_type == 0x800)  {
            return base + 18;
        }
    }

    return NULL
}

二重の VLAN タグ付け注意し、必要な同様の手順を実行してそれをスキップしてください。

于 2016-09-29T16:22:06.310 に答える