我在游戏中使用服务器,该服务器已损坏 AntyCheat,如果一次连接过多,则整个服务器都会损坏,没有人可以连接。因此,解决方案是使用 IPTables 将一次连接限制为 5 秒内 1 个连接。它应该是这样的:1 个玩家 -> 5 秒 -> 2 个玩家 -> 5 秒(如果一个连接,它必须停止其他连接 5 秒)
答案1
对于此示例答案,协议是 tcp,其他信息取自评论。请进行相应调整。
第一个例子将仅给出连接之间的平均值 5 秒:
sudo iptables -A INPUT -i eth0 -m state --state NEW -p tcp -m limit --limit 12/minute --dport 12871 -j ACCEPT
sudo iptables -A INPUT -i eth0 -m state --state NEW -p tcp --dport 12871 -j DROP
第二个示例将要求两次连接尝试之间正好间隔 5 秒,并且在这 5 秒内没有任何其他新连接尝试。即,在这 5 秒内的尝试将重置时间计数器。
sudo iptables -A INPUT -i eth0 --protocol tcp --destination-port 12871 -m state --state NEW -m recent --mask 0.0.0.0 --update --hitcount 1 --seconds 5 --name LIMIT_NEW_RATE -j DROP
sudo iptables -A INPUT -i eth0 --protocol tcp --destination-port 12871 -m state --state NEW -m recent --mask 0.0.0.0 --set --name LIMIT_NEW_RATE -j ACCEPT
您必须确定此规则在整体 iptables 规则环境中需要去往何处。
答案2
使用connlimit
和limit
模块:
sudo iptables -A INPUT -p tcp --syn -i eth0 --dport 12871:12881 -m connlimit --connlimit-above 1 --connlimit-mask 24 -j REJECT --reject-with tcp-reset
sudo iptables -A INPUT --dport 12871:12881 -m state --state RELATED,ESTABLISHED -m limit --limit 12/minute --limit-burst 1 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 12871:12881 -i eth0 -m state --state NEW -m recent --set
sudo iptables -A INPUT -p tcp --dport 12871:12881 -i eth0 -m state --state NEW,RELATED,ESTABLISHED -m recent --update --seconds 5 --hitcount 1 -j DROP
然后应用新规则:
sudo iptables-save > /etc/iptables/rules.v4
安装持久 iptables 包:
sudo apt install iptables-persistent
sudo service netfilter-persistent reload
笔记:
- 将接口名称更改为您的
- 添加您的端口范围
- 这会附加到现有规则,因此您可以将
-I
这些规则放在前面。