iptables netfilter复制数据包

时间:2014-04-16 19:06:58

标签: networking iptables packet netfilter

我想知道是否有办法使用iptables / netfilter复制数据包,更改它并将 两者 传递给应用程序。

基本上,我想从流中捕获数据包并将其重定向到某个队列,然后我想复制它,为它发出判决(我知道如何在C中执行此部分),然后我需要更改复制版本中的某些内容,AND也会发出该“已修改”数据包的判定。

基本上我希望应用程序接收 未修改版本和修改版本。

这可能吗? 提前感谢您的帮助。

1 个答案:

答案 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;
}