我试图基于示例nfqnl_test.c文件在C程序中使用iptables和netfilter更改数据包。在该文件中,它仅表明数据包可以与NF_QUEUE目标排队(使用-j开关)。我修改了实用程序以更改数据包,然后使用带有长度和数据包的nfq_set_verdict将其发送出去:
return nfq_set_verdict(QueueHandle, id, NF_ACCEPT, len, pktb_data(pkt));
如果我使用netcat之类的东西在同一台计算机上发送UDP数据包,则可以修改数据包并使用tcpdump验证它们是否被更改:
iptables -A OUTPUT -d <dest ip address> -p udp -j NFQUEUE --queue-num 0
但是,如果我做的是客户端向服务器发送UDP数据包,并在服务器接收到UDP数据包之前对其进行修改,那么我看不到任何证据表明该数据包已被修改。实际上,数据包仅在INPUT链中捕获,而从未在POSTROUTING链中发送出去。这是我尝试过的一种无效的组合:
iptables -t mangle -A INPUT -d <dest ip address> -p udp -j NFQUEUE --queue-num 1
iptables -t mangle -A POSTROUTING -d <dest ip address> -p udp -j NFQUEUE --queue-num 1
我还尝试了不同的表格,例如nat和raw,效果相同。有人有尝试这样做的经验吗?