2014-01-13 55 views
0

我的主機os是ubuntu12.04,我的iptables版本是v1.4.12,libmnl-1.0.3,libnetfilter_queue-1.0.2 ,libnfnetlink-1.0.1。 首先,我執行iptable commans「iptables -A -p tcp --dport 80 -J NFQUEUE」將ip包導入到NFQUEUE,然後使用libnetfilter_queue將數據包複製到用戶層,然後我修改數據包的有效負載,重建ip校驗和和tcp校驗和。最後,我調用nfq_set_verdict(qh,id,NF_ACCEPT,0,NULL)將數據包注入內核。但它不起作用。我使用wireshare來捕獲數據包,我發現,我自己的數據不能設置爲數據包。使用netfilter_queue複製數據包到用戶層是好的,修改數據包並注入內核失敗

回答

0

這是因爲正在使用的判決功能的:

nfq_set_verdict(qh, id, NF_ACCEPT, 0, NULL) 

的簽名是:

nfq_set_verdict(struct nfq_q_handle *qh, u_int32_t id, u_int32_t verdict, u_int32_t mark, int set_mark, u_int32_t data_len, const unsigned char *data)

使用0長度和NULL用於數據指針,您接受基於分組在他的身份證號碼,沒有通過您的修改後的有效載荷

你應該嘗試與s omething這樣的:

char *pktData; 
u_int32_t len=0; 

len = nfq_get_payload(nfa, &pktData); 

    // modify payload 

return nfq_set_verdict(qh, id, NF_ACCEPT, len, pktData); 

那麼你修改的有效載荷將被髮送