2011-07-19 97 views
2

我正在嘗試在用戶空間中使用libnetfilter_queue中的代碼來修改在iptables中的NFQUEUE目標中排隊的數據包。不過,我對如何去做這件事並不知情。使用netfilter隊列修改數據包?

我已經設置它複製與NFQNL_COPY_PACKET的數據包,如果我要修改複製的數據包它會自動發送回功能nfq_set_verdict()的內核?

此外,我以前曾從一個pcap文件提取數據包,但我注意到,我從nfq_get_payload()獲得的數據似乎是非常不同的。有誰知道如何剖析數據?

回答

1

如果在nfq_set_verdict中將判定結果設置爲NF_REPEAT,那麼數據包(將被修改或不會)將再次進入iptables mangle OUTPUT鏈,nat OUTPUT chane,filter OUTPUT鏈等等(換句話說,它會像某些應用送的)

提取數據,在您的NFQUEUE處理程序回調使用此樣板:

int queueHandle_input (struct nfq_q_handle *qh, struct nfgenmsg *nfmsg, struct nfq_data *nfad, void *mdata){ 

struct iphdr *ip; 
int id; 
struct nfqnl_msg_packet_hdr *ph = nfq_get_msg_packet_hdr ((struct nfq_data *) nfad); 
if (ph) id = ntohl (ph->packet_id); 
nfq_get_payload ((struct nfq_data *) nfad, (char**)&ip); 

現在IP包含網絡字節順序IP報頭數據。