在某些情况下,我发生了一些自我伤害的DoS,我试图找出是否可以使用iptables来缓解这种情况。 简短的版本是“我怎样才能限制传入连接到服务器的速度,比如每5秒使用iptables规则不超过2秒?”。 我已经阅读过这样的问题,虽然连接起来了,但是我的答案(我已经尝试过了 – 见下文)并没有达到我所追求的目标。
长版本是我们的客户端/服务器应用程序保持活动连接,并且我们的客户networking之一不断断开连接,这意味着大量(15+)客户端同时断开连接。 当他们的networking连接恢复时,他们都试图同时重新连接,造成一种DoS。 长期的解决scheme是我们在客户端重新连接代码中实现随机退避,我们正在这样做。 与此同时,我迄今为止所尝试的是基于上述SF答案的资源。 从那里,我创造了这两个规则:
-A INPUT -p tcp -s 54.208.46.226 --match state --state NEW --match recent --set -A INPUT -p tcp -s 54.208.46.226 --match state --state NEW --match recent --update --seconds 5 --hitcount 3 -j DROP
注意我已经指定了一个我们自己的IP地址进行testing,所以我可以尝试从这个IP连接,看看是否连接被阻止或允许。 这样的作品,第一次连接尝试被接受,第二次。 但是当第三次尝试在5秒钟内完成时,就会被阻止 – 到目前为止这么好。
问题是,如果客户端继续尝试连接(因为我们的客户端代码目前将这样做),它仍然被阻止 – 我猜是因为第二个更新规则更新时间戳,而这个规则有效地说,必须有一个连接尝试之间有5秒的间隔 。 但是我所追求的是每5秒允许最多2个连接成功,而不pipe他们尝试连接的频率如何。 我推测它可能是--update标志,它保留了最近尝试的时间戳(而不是最近的成功,这实际上是我想testing的)。 我切换到 – --rcheck ,但它似乎performance出相同的行为,这意味着我不了解这个级别的iptable-fu。
所以,总结一下这个问题,如果重复的连接尝试正在进行(每秒几个),是否有一个iptable规则集允许他们以较低的速度(例如平均2.5秒的间隔),而不是阻止他们完全在第一个2之后?
看看速度限制。 它可以将连接节制到指定的速率。 您可能需要每分钟限制一次,因为我相信这些费率是整数。 24 /分钟的速度应该工作。
你将不得不testing一下连接是如何爆发的。