使用netfilter_queue将数据包复制到用户层是可以的,修改数据包并注入内核失败

时间:2014-01-13 07:41:13

标签: linux networking tcp iptables

我的主机操作系统是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捕获数据包,我发现,我自己的数据无法设置为数据包。

1 个答案:

答案 0 :(得分: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获取数据指针,您将根据其ID号接受数据包,而不是传递修改后的有效负载

你应该尝试类似的东西:

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);

然后将传输您修改的有效负载