到目前为止,我已经考虑过使用带有“recent”模块的 iptables 速率限制命令来对每个 IP 地址进行操作。例如,只有当单个 IP 的速率超过 20k/s 时,才会触发 20k/s 的速率限制规则,而当 4 个不同的 IP 的速率超过 5k/s 时则不会触发。如果我的考虑有误,请纠正我,因为我只将这些规则用于 TCP/UDP。
但今天我尝试了类似的 ICMP 规则并应用了 4/s 输入/输出。但当我尝试从 just-ping.com 进行 ping 测试时,我可以看到几乎所有 IP 地址都出现数据包丢失。这是怎么发生的?因为如果它对每个 IP 地址都有效,那么它就不会触发规则,因为我相信来自 just-ping 的每个 IP 的速率可能为 1/s。
我仍然认为第一个是正确的,因为如果不是,那么如果综合速率(如果有更多连接的玩家)增加了阈值,我的 GameServer 就会阻止所有人。到目前为止还没有发生这种情况,所以 ICMP 的事情真的让我很困惑。
谢谢。
更新
这是我的配置:
-A INPUT -p icmp -m recent --set --name PING --rsource
-A INPUT -p icmp -m recent --update --seconds 1 --hitcount 4 --name PING --rsource -j DROP
-A OUTPUT -p icmp -m recent --set --name PING2 --rsource
-A OUTPUT -p icmp -m recent --update --seconds 1 --hitcount 4 --name PING2 --rsource -j DROP
答案1
好吧,在对此进行一些研究之后,我发现通过多个 IP 甚至 MTR 数据包发出的 icmp echo 请求实际上可能不是 1/s。将其设置为 20/s 可以使其正常工作,并且数据包不再被阻止。尽管我仍然找不到为什么 echo 请求的速率超过 5/s。