我一直在使用自己制作的“iptables 规则”来阻止对游戏服务器的所有主要类型的 DDOS 攻击,因为这些攻击是特定于应用程序/游戏服务器的,而不是一般的 DDOS 攻击。我花了将近 3 年的时间来研究这些攻击并用这些规则做出回应。到目前为止,我在 iptables 上使用了速率限制,如果它达到 250 次/秒,它将自动 DROP 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/sec 的输入,正如通过“iftop”到我的服务器所看到的那样,上述规则并没有阻止它们,因为我的游戏服务器正在响应“..disconnect”数据包到所有传入连接。当游戏服务器无法识别数据包的输入字符串或长度时,就会发生这种情况。这是数据包的内容:
http://paste.ubuntu.com/6000381/
现在您可能会看到数据包的长度很大。根据我抓取数据包的 Wireshark,数据包的长度为 700,数据大小/长度约为 5000 字节。我之前已经看到过,如果数据包的数据长度/大小更高,即使 hitcounts 更少,你仍然可以获得更高的速率。因此,这也许可以解释为什么它的输入约为 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 bytes。
你看过fail2ban吗?它可以通过在防火墙中删除源 IP 来帮助您对传入的攻击做出反应。