我的主机操作系统是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捕获数据包,我发现,我自己的数据无法设置为数据包。
答案 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);
然后将传输您修改的有效负载