从配置为接入点的 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_verdict
。NF_ACCEPT
因此,打开一个raw
套接字以发送排队的数据包。
https://stackoverflow.com/questions/31368816/sending-queued-packets-with-nfqueue