我一直在使用自己编写的“iptables 规则”来阻止针对游戏服务器的所有主要类型的 DDOS 攻击,因为这些攻击是针对应用程序/游戏服务器的,而不是一般的 DDOS 攻击。我花了近 3 年的时间来研究这些攻击并使用这些规则做出响应。到目前为止,我在 iptables 上使用速率限制,如果 IP 每秒的命中次数为 250 次,则会自动丢弃该 IP,因为客户端速率远低于此(最大值为 500kb/s)。这是因为攻击者通常会发送大量命中次数为 15:30 的数据包,因为这是游戏服务器响应良好的一般数据包长度。这种方法非常有效,直到今天有人使用其他方法攻击以突破此规则。
-A INPUT -p udp -m udp --dport 16000:29000 -m recent --set
-A INPUT -p udp -m udp --dport 16000:29000 -m recent --update --seconds 1 --hitcount 250 -j DROP
最近,我观察到一些攻击很容易产生 1-3mb/秒的输入,正如通过“iftop”看到的那样,上述规则并没有阻止它们,因为我的游戏服务器对所有传入连接都响应了“....disconnect”数据包。当游戏服务器无法识别输入字符串或数据包长度时,就会发生这种情况。这是数据包的内容:
http://paste.ubuntu.com/6000381/
现在您可能已经看到数据包很长了。根据我抓取数据包的Wireshark,数据包的长度为700,数据大小/长度约为5000字节。我之前也看到过这种情况,如果数据包的数据长度/大小较大,即使命中次数较少,仍然可以获得更高的速率。所以这也许解释了为什么它的输入速度约为 3mb/s 并且它没有通过命中计数被阻止,因为它的命中计数从未超过 250。
现在我需要一个比每秒数据包数量更特定于带宽的东西。我需要一个 iptables 规则,它可以自动阻止大于 1mb/s 的输入,并且如果需要,它可能会使用数据包的长度。公平游戏服务器客户端的一般数据大小/长度通常具有小于 500 字节的数据包长度和数据大小,但在某些情况下可能会更高,但绝不会占用超过 500kb/s 的带宽。
这个问题与之前回答的其他问题不同,因为它首先是特定于应用程序的。其次,我问的是 iptables 解决方案,它会拒绝任何 >1mb/s 的输入?
更新:
我做了一些理论工作来解释为什么 3 Mb/s 的输入带宽不超过 250 次/秒,工作原理如下:
3 Mb = 3x1024x1024 = 3,145,728 位/秒 = 393,216 字节/秒
因此,
如果数据包的大小为 5000 字节,则每秒的最大数据包数量应为:
393216/5000 = 78.6 数据包/秒
这意味着,如果 iptables 规则要起作用,数据包应该小于 393216/250 =1516 字节。
答案1
您看过 fail2ban 吗?它可以通过在防火墙处丢弃源 IP 来帮助您应对传入的攻击。