【问题标题】:Sending queued packets with NFQUEUE?使用 NFQUEUE 发送排队的数据包?
【发布时间】:2015-07-12 14:26:12
【问题描述】:

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

我用libnetfilter_queuefunctions成功创建了三个队列,绑定它们,监听它们并从中读取如下:

/* 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 而不是 NF_ACCEPT(所以它不会立即被发送出去),将它存储在我的自定义结构中,然后(迟早)根据我的需要重新注入。

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

这是我的自定义结构

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

任何建议将不胜感激。

【问题讨论】:

  • 我认为您只需推迟对这些数据包的nfq_set_verdict() 调用,直到您准备好将它们推回堆栈。关键是它们在内核中排队。 AFAIK,您不必立即为数据包致电nfq_set_verdict()。您可以将数据包或 ID 保存在列表中,稍后再调用。

标签: c networking network-programming netfilter


【解决方案1】:

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

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

【讨论】:

  • 还有很多工作要做,我将开始阅读有关raw 套接字的信息。我不知道nfq_set_verdict每个数据包只能调用一次,并且由于我将它与NF_DROP一起使用,我需要使用其他东西来重新注入数据包。非常感谢。
【解决方案2】:

我不知道这是否适合您的应用程序模型,但Frottle 只是将数据包保持在不确定状态,直到它决定是接受它们还是丢弃它们。这种方法的“新颖性”在于您不需要在 NFQUEUE 回调函数本身期间调用 nfq_set_verdict 。您可以稍后在 netfilter 循环之外调用它。它将使用更多的内核内存,但另一种方法是使用更多的用户模式内存,因此损失不大。

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-27
    • 1970-01-01
    • 2018-02-18
    • 2015-01-08
    • 2021-03-19
    • 2019-01-29
    • 2016-01-13
    相关资源
    最近更新 更多