限制每秒发送 UDP 数据包的速率

限制每秒发送 UDP 数据包的速率

由于 Teamspeak 版本 3 向每个用户发送大量数据包,并且我们的提供商的基础设施出现问题,每秒超过 20,000 个数据包,因此我们必须限制它,以免我们的服务器关闭。

阅读了很多有关 iptables 的内容,但找不到正确的规则。您能给我一些建议,如何管理服务器,使其每秒发送的数据包不超过 19k 个吗?

我们正在 Debian 4 上运行

提前致
谢蒂姆

答案1

您有几个选择。iptables 和流量整形。对于 iptables,请查看如何。 在里面过滤规范部分中有一个使用限制扩展来限制流量的示例。

另一个选项是流量整形,这可能(是吗?)很复杂。看看Linux 高级路由和流量控制指南介绍一下,特别是第九章

另一个选择是调整 TeamSpeak。尝试将使用的编解码器更改为质量较低的编解码器。我相信 TeamSpeak 客户端有带宽限制选项。看看服务器是否也有。

答案2

谢谢你的回覆!

我最终得到了这个 iptables 代码:

/sbin/iptables -A OUTPUT -p udp -m state --state NEW -j ACCEPT
/sbin/iptables -A OUTPUT -p udp -m limit --limit 10000/s -j ACCEPT
/sbin/iptables -A OUTPUT -p udp -j DROP

限制模块中的最大数据包数似乎为 10.000 pps。
不幸的是,对于我的需求来说太低了。

我要查看 Linux HOWTO 的第 9 章。也许我可以通过流量整形来处理它。
如果有人知道其他可行的方法,请告诉我。

答案3

这是该问题的解决方案。

你可以这样使用 iptables

sudo iptables -I OUTPUT 1  -m owner --uid-owner debian-tor -j NFQUEUE --queue-num 1
sudo iptables -A OUTPUT                                    -j NFQUEUE --queue-num 0

这会将所有tor流量重定向至队列号 1,并将所有其他流量重定向至队列号 0。

下一步是编写一个用户空间应用程序,它将从队列中读取数据包并发出判决:ACCEPTDROP

[这里有关于如何构建此类应用程序的出色描述]。(https://home.regit.org/netfilter-en/using-nfqueue-and-libnetfilter_queue/

这是此应用程序的实现应用程序的主要部分位于TScheduler::operator()

TVerdictAction Action;
   if(QueueNum != TorClass) {
      Action = TVerdictAction::Accept;
   } else {
      Action = CurrentRate > d->OverallRate ? TVerdictAction::Drop : TVerdictAction::Accept;
   }

相关内容