0

谁能告诉我如何使用 Netfilter 钩子通过 linux 模块修改数据包数据?

谢谢!

4

2 回答 2

2

不必编写自己的 netfilter 模块。您可以使用 iptables 中的 QUEUE 目标从用户空间访问它,并编写一个处理队列的守护进程。

这方面的例子相对较少,但确实存在一些。它通常用于过滤,但您也可以(我相信)重新注入修改过的数据包(至少在 iptables 的 mangle 表中)。

于 2012-04-29T15:27:18.050 回答
1

试试下面的程序

编写 IPTABLES 规则以将数据包传递给用户空间数据包

# iptables -A INPUT -p TCP -j QUEUE

编译并执行为

$ gcc test.c -lipq
$ sudo ./a.out

源代码

#include <netinet/in.h> 
#include <linux/netfilter.h> 
#include <libipq.h> 
#include <stdio.h> 
#include <stdlib.h>


#define BUFSIZE 2048
static void die(struct ipq_handle *h)
{
    ipq_perror("passer");
    ipq_destroy_handle(h);
    exit(1);
}
int main(int argc, char **argv)
{
    int status, i=0;
    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{
        i++;
        status = ipq_read(h, buf, BUFSIZE, 0);

        if (status < 0) die(h);

        switch (ipq_message_type(buf)) {
            case NLMSG_ERROR:
                fprintf(stderr, "Received error message %d\n",
                ipq_get_msgerr(buf));
                break;
            case IPQM_PACKET:
            {
                ipq_packet_msg_t *m = ipq_get_packet(buf);
                printf("\nReceived Packet");
                /****YOUR CODE TO MODIFY PACKET GOES HERE****/
                status = ipq_set_verdict(h, m->packet_id, NF_ACCEPT, 0, NULL);
                if (status < 0)  die(h);
                break;
            }
            default:
                fprintf(stderr, "Unknown message type!\n");
                break;
        }
    } while (1);
    ipq_destroy_handle(h);
    return 0;
}
于 2014-05-06T12:07:15.083 回答