2013-04-03 72 views
0

首先,我試圖從Netfilter隊列有效載荷的有效載荷中獲取源地址和目標端口(使用nfq_get_payload函數檢索有效載荷)。下面的問題是問同樣的事情,得到一個正確的答案:nfq_get_payload如何構造其返回數據?

How to extract source and destination port number from packet in queue of iptables

不幸的是,沒有解釋爲什麼增加20和22的地址讓你在正確的位置讀取信息。我認爲這是因爲數據的結構(顯然),但是如果有定義的結構,它是什麼?

該文檔沒有明確地解釋數據是如何格式化的,只是'該函數檢索的數據類型取決於使用nfq_set_mode()函數設置的模式「,但是那麼set_mode的文檔不會提及有關數據類型的任何內容,並且源代碼不會立即顯示任何內容

我覺得這一定是我常見的網絡編程結構中非常重要的東西,我缺少或不理解。

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

回答

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 
} 
+0

不是應該: '結構iphdr * ip_info =(結構iphdr *)(數據+的sizeof(結構ethhdr));'? 爲什麼不跳過'struct ethhdr'以轉到'struct iphdr'? – elmazzun