c - 使用 NFQUEUE 发送排队的数据包?

标签 c networking network-programming netfilter

我将 libnetfilter_queueiptablesNFQUEUE 目标一起使用,通过 --queue 将传入数据包存储在三个不同的队列中-num x.

我使用libnetfilter_queue函数成功创建了三个队列,绑定(bind)它们,监听它们并从中读取,如下所示:

/* given 'h' as a handler of one of my three queues */
fd = nfq_fd(h);
while ((rv = recv(fd, buf, sizeof(buf), 0)) && rv >= 0) {
    nfq_handle_packet(h, buf, rv);
}

nfq_handle_packet 触发的回调函数具有 nfq_set_verdict(qh, id, NF_ACCEPT, 0, NULL); 命令,它会在收到数据包后立即发送数据包被处理。 问题是:我希望立即发送每个数据包,因为我需要将它们存储在自定义结构中(如下所示)。

所以我遇到了一个潜在的解决方案:我可以调用 NF_DROP verdict 而不是 NF_ACCEPT 我想排队的每个数据包(这样它就不会被立即发送出去),将它存储在我的自定义结构中,然后(迟早)根据我的需要重新注入(inject)它。

听起来不错,但情况是:我不知道如何从我的用户空间应用程序中随意重新注入(inject)我排队的数据包。在我的代码的同一点再次使用 nfq_set_verdict 是否正确,但使用 NF_ACCEPT verdict?或者我应该打开一个套接字(也许是原始套接字)?

这是我的自定义结构

struct List {
    int queue;
    int pktsize;
    unsigned char *buffer;
    struct nfq_q_handle *qh;
    struct nfqnl_msg_packet_hdr *hdr;
    struct List *next;
};

表示符合上述规则的数据包。

这些是我存储数据包的队列。

struct List *List0 = NULL;  // low priority
struct List *List1 = NULL;  // medium priority
struct List *List2 = NULL;  // high priority

我有 Ubuntu 14.04 3.13.0-57-generic

如有任何建议,我们将不胜感激。

最佳答案

你的想法很有道理。事实上,我已经在我从事的商业产品中看到了一个非常相似的方案。它必须以高速率处理单个数据包,因此它总是会复制传入的数据包并立即设置 NF_DROP 判定。然后它会执行处理,如果它决定应该转发数据包,它会将副本发送到出站接口(interface)。所以你并不孤单。

据我所知,nfq_set_verdict 每个数据包只能调用一次。设置判决后,NFQUEUE 将数据包发送到目的地(在您的情况下是数据包天堂)。它不会保留数据包的额外副本,以防万一您改变主意。因此,要将数据包发送回网络,您必须存储它的副本并使用您自己的套接字发送它。是的,如果您想按原样发送接收到的数据包(包括 header ),则出站套接字必须是 raw

关于c - 使用 NFQUEUE 发送排队的数据包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31368816/

相关文章:

c - 使用指针打印值

mysql - 使用变量插入 MySQL 表

qt4 - 使用 QUdpSocket 发送数据报

java - 需要有关通过网络传输图像的帮助

c - 在 C 中使用递归计算大数的阶乘

使用 1 和 0 的序列创建我自己的数据类型

objective-c - 在 C 预处理器中生成随机标识符以避免重复的链接器符号

algorithm - 返回 N 窗口大小

linux - 查找连接的套接字使用的接口(interface)

linux - 使用 Shell 脚本提供密码