我想知道是否有办法使用iptables / netfilter复制数据包,更改它并将 两者 传递给应用程序。
基本上,我想从流中捕获数据包并将其重定向到某个队列,然后我想复制它,为它发出判决(我知道如何在C中执行此部分),然后我需要更改复制版本中的某些内容,AND也会发出该“已修改”数据包的判定。
基本上我希望应用程序接收 未修改版本和修改版本。
这可能吗? 提前感谢您的帮助。
答案 0 :(得分:1)
您的任务可以通过libipq库实现。下面的教程就像专注于复制&修改用户空间中的数据包。
http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.205.2605&rep=rep1&type=pdf
你需要知道C来处理它。或者" Scapy" - 可以使用基于python的数据包操作工具。
#include <linux/netfilter.h>
#include <libipq.h>
/*
* Used to open packet ; Insert a iptables rule to get packet here
* iptables -I 1 [INPUT|OUTPUT|FORWARD] <packet header match> -j QUEUE
*/
#include <linux/netfilter.h>
#include <libipq.h>
#include <stdio.h>
#define BUFSIZE 2048
static void die(struct ipq_handle *h)
{
ipq_destroy_handle(h);
exit(1);
}
int main(int argc, char **argv)
{
int status;
unsigned char buf[BUFSIZE];
struct ipq_handle *h;
h = ipq_create_handle(0, NFPROTO_IPV4);
if (!h)
die(h);
status = ipq_set_mode(h, IPQ_COPY_PACKET, BUFSIZE);
if (status < 0)
die(h);
do{
status = ipq_read(h, buf, BUFSIZE, 0);
if (status < 0)
die(h);
if (ipq_message_type(buf) == IPQM_PACKET){
ipq_packet_msg_t *m = ipq_get_packet(buf);
status = ipq_set_verdict(h, m->packet_id, NF_ACCEPT, 0, NULL);
}
} while (1);
ipq_destroy_handle(h);
return 0;
}