0

主に、Netfilter キュー ペイロードのペイロードからソース アドレスと宛先ポートを取得しようとしています (ペイロードは nfq_get_payload 関数を使用して取得されます)。次の質問は同じことを尋ね、正しい答えを得ます。

iptables のキューにあるパケットから送信元と宛先のポート番号を抽出する方法

残念ながら、アドレスに 20 と 22 を追加すると、情報を読むのに適切な場所に移動できる理由についての説明はありません。これはデータの構造によるものだと思いますが (明らかに)、定義された構造があるとすれば、それは何ですか?

ドキュメントでは、データがどのようにフォーマットされるかを明示的に説明していません。「この関数によって取得されるデータのタイプは、nfq_set_mode() 関数で設定されたモードに依存する」ということだけですが、set_mode のドキュメントではデータについて何も言及されていません。タイプし、ソースはすぐに何も明らかにしません。

これは、私が見逃している、または理解していない一般的なネットワーク プログラミング構造体の非常に中心的なものに違いないと思います。

注: nfq_get_payload 関数: http://www.netfilter.org/projects/libnetfilter_queue/doxygen/group__Parsing.html#gaf79628558c94630e25dbfcbde09f2933

4

1 に答える 1

7

私はこれを理解することができたので、他の人が見つけられるようにここに残します。

ペイロードは iphdr 構造体で始まります。iphdr 構造体には、tcp などのプロトコル フィールドがあります。tcp の場合、iphdr 構造体の後のデータは tcphdr 構造体であり、udp の場合、そのための別の構造体 hdr があり、icmp などの場合などです。

ポートにアクセスするには、q_data が nfq_data 構造体へのポインターであると仮定します。

unsigned char *data;
nfq_get_payload(q_data, (unsigned char**)&data);
struct iphdr * ip_info = (struct iphdr *)data;
if(ip_info->protocol == IPPROTO_TCP) {
    struct tcphdr * tcp_info = (struct tcphdr*)(data + sizeof(*ip_info));
    unsigned short dest_port = ntohs(tcp_info->dest);
} else if(ip_info->protocol == IPPROTO_UDP) {
    //etc etc
}
于 2013-04-03T20:58:10.857 に答える