由于 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。
下一步是编写一个用户空间应用程序,它将从队列中读取数据包并发出判决:ACCEPT
或DROP
。
[这里有关于如何构建此类应用程序的出色描述]。(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;
}