使用 libnetfilter_queue 延迟数据包

使用 libnetfilter_queue 延迟数据包

从配置为接入点的 Raspberry Pi,我设置了以下规则:

sudo iptables -I FORWARD -p tcp --sport 25 -j NFQUEUE --queue-num 0
sudo iptables -I FORWARD -p tcp --sport 80 -j NFQUEUE --queue-num 1
sudo iptables -I FORWARD -p udp --sport 5060 -j NFQUEUE --queue-num 2
sudo iptables -I FORWARD -p tcp --sport 5060 -j NFQUEUE --queue-num 2

我的目的是将来自端口 5060 的数据包转发给来自端口 80 的数据包,然后再转发来自端口 25 的数据包(一种粗鲁的服务质量实现,我试图为“Skype 数据包”(来自 5060)赋予最高优先级,为“HTTP 数据包”(端口 80)赋予中等优先级,为“SMTP 数据包”(端口 25)赋予低优先级)。

我在用着libnetfilter_queue图书馆:我如何使用nfq_set_verdict延迟低优先级的数据包?

NF_QUEUE 将数据包注入不同的队列(目标队列号位于判决的高 16 位)但不再继续迭代

NF_REPEAT 再次重复相同的循环

也许我不明白上面的两个标志的含义:如何使用它们来延迟低优先级的数据包?

答案1

您无需NF_DROP对传入数据包进行判定并通过原始套接字重新发送。您可以将数据包保存在自己的队列中,稍后(例如,经过一段时间延迟)再进行判定。

我使用这种技术在 Linux 用户空间编写了一个简单的流量整形器:https://github.com/vmxdev/damper/

仅用于NFQUEUE延迟数据包可以简化iptables规则。您不必考虑从哪个接口重新注入数据包以及它将如何与 conntrack 交互

答案2

在这里得到答案:我不知道每个nfq_set_verdict数据包只能调用一次,因此在NF_DROP对每个数据包进行判决后(将其复制到我的用户空间应用程序中后),我无法再次调用nfq_set_verdictNF_ACCEPT因此,打开一个raw套接字以发送排队的数据包。

https://stackoverflow.com/questions/31368816/sending-queued-packets-with-nfqueue

相关内容