到目前为止,我已经考虑过使用“最近”模块为每个 IP 地址工作的 iptables 速率限制命令。例如,仅当单个 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
好吧,在对这个进行一些研究之后,我发现通过多个 IP 甚至在 MTR 数据包中发出的 icmp 回显请求实际上可能不是 1/s。将它设置为 20/s 使其工作良好并且数据包不再被阻塞。虽然我仍然找不到为什么 echo-request 的速率超过 5/s。