(为了解决“重复”问题:我没有看到很多请求。数量相当少。相反,每个请求都会下载大量数据。)
我所说的服务器具有 2x10 GBit/秒的互联网连接,后端为 40 GBit/秒。它使用 Debian Stable 系统上的 nginx/vsftpd/rsyncd 向公众提供大约 20 TB 的数据。此外,apache2 用于提供一些非静态内容,但可以忽略不计。
硬件足够强大,可以提供高达 18 GBit/秒的传输速度(据一次观察),而且流量是免费的。由于服务器是开源软件和其他公共软件的镜像,因此停机时间也不是一个关键问题。
但是,我观察到 DDoS 攻击的特定模式,我希望停止影响服务器。每当攻击持续进行时,Debian 的大多数 DVD ISO(大约 300 GByte,远远超过 RAM 所能容纳的大小)都会被多台主机下载,每个文件的下载都会重复进行。根据攻击的组织方式,这会导致带宽增加很多,当然会给硬件带来一些压力,同时限制服务器合法用户的体验。
在这些攻击中,通常会有 2-3 个网络参与攻击,每个网络都会下载上述文件。大多数情况下,似乎一键托管或某种文件缓存被滥用,被诱骗反复下载同一文件 - 并且自动下载大量不同文件作为攻击的一部分。
有什么方法可以配置 nginx 自动禁止某些 IP 范围?或者将这些网络的流量速率限制为 1 GBit/秒(一段时间)?
我不想施加一般的限制,因为实际上应该使用服务器,即使对于高速传输(最有可能是镜像到镜像)。
需要注意的是,无论动机如何,一个聪明的攻击者都可以开始滥用 FTP/RSYNC 而不是 HTTP,从而解决这个问题可能产生的解决方案。
目前,当我意识到正在发生 DDoS 攻击时,我会扫描日志文件,识别滥用网络并手动禁止它们。
答案1
实际上你可以使用Nginx 限制请求数 模块以及Nginx limit_conn
这两个模块都能够限制来自特定来源的连接,并限制来自 IP 的请求,这对你来说可能非常有帮助
根据要求,nginx 还可以用来限制带宽。
location ^~ /videos/ {
...
limit_rate_after 100m;
limit_rate 150k;
...
}
在此示例中,limit_rate_after 100m;
nginx 将(对于每个用户连接,请注意这一点)将连接限制到最大150k
。例如,如果您需要允许高达 100m 的全带宽,然后限制速度,这可以为您提供帮助。
请注意,此解决方案限制了每个连接的 nginx 下载速度,因此,如果一个用户打开多个视频文件,它将能够下载 150k x 他连接视频文件的次数。如果您需要设置连接限制,您应该能够使用限制区域和limit_conn指令。例如:
在您的服务器块配置中:
limit_rate 128K; limit_zone one $binary_remote_addr 10m;
在您的位置块配置中:
limit_conn one 10;
在此示例中,每个 IP 允许 10 个连接,每个连接 1 Mbit。
答案2
您可以使用配置扫描 nginx 访问日志的 fail2ban。网上有很多指南可以帮助您完成此操作。
如果没有专门的软件/硬件进行模式识别,很难阻止此类攻击。您可能可以使用某种黑名单,但我不确定是否有适合您用例的黑名单。
另一种解决方案是使用某种 javascript 墙,除非浏览器使用 javascript,否则阻止下载,但这是一种不好的做法,会阻止合法用户使用 curl/wget。