当前位置: > Linux服务器 > nginx >

如何通过配置NGINX和NGINX Plus来缓解DDoS攻击?

时间:2017-07-22 23:35来源:linux.it.net.cn 作者:IT

分布式拒绝服务(DDoS)攻击是一种试图使服务(通常是网站服务)无法正常使用,通过多台机器同时对目标产生大量流量从而使其服务器因为资源耗尽而无法正常提供服务。

通常,攻击者试图同目标系统建立大量连接和发送大量连接请求,使其无法在接受新的连接或者响应速度变的非常缓慢严重影响使用。

应用层 DDos 攻击特征

应用层(第7层/HTTP)DDoS 攻击是由软件程序(机器人)发动的,并且可以根据具体的系统漏洞发动最佳的攻击。例如,对于无法处理大量并发连接的系统,只需要建立大量的连接并定期发送少量流量保持连接的存活,这样就可以耗尽系统的资源。其他的攻击都可以通过发送大量或超大量的请求来完成。因为发动这些攻击不是真实用户而是机器人,所以攻击者可以很轻松的产生大量的连接并非常快速的发送连接请求。

了解 DDoS 攻击的特征可以帮助缓解受到危害,特征如下(不意味这是一份完整的特征列表):

1.流量通常来源于一组用于攻击的 IP 地址,其结果就是,每一个 IP 地址都请求建立大量远超正常用户的需求连接。

注意:这里非常重要,不要认为这种流量模式就一定代表是 DDoS 攻击。使用代理转发也可能产生这种流量,因为代理会为其用户产生大量真实的连接请求。然而,来自代理的连接请求数通常也比来自 DDoS 攻击的少很多。

2.因为流量是由机器人产生的,而且其目标就是瘫痪服务器,所以它们产生流量的速度远超正常用户可能产生的速度。

3.头部 User-Agent 字段通常为非标准值。

4.头部 Referer 字段有时会设置为与攻击相关的值

配置 NGINX 和 NGINX Plus 对抗 DDoS 攻击

NGINX 和 NGINX Plus 含有一些功能(对照上述 DDoS 攻击特征)可以缓解 DDoS 攻击。这些功能通过调节传入流量和控制来自代理或后端服务器的流量来处理 DDoS 攻击。

限制请求的速率

可以通过 NGINX 和 NGINX Plus 设置将来自真实用户的请求速率限制在一个正常值内。例如,你可能认为一个真实用户进入登录页面至少会每两秒产生一次请求。这样你就可以设置 NGINX 和 NGINX Plus 要求一个客户端的 IP 每隔两秒才能产生一次登录请求(相当于每分钟30次):


limit_req_zone $binary_remote_addr zone=one:10m rate=30r/m;server {     ...     location /login.html {         limit_req zone=one;     ...     } }

limit_req_zone 指令配置一个共享内存区域称为 one 用于存储请求指定项的状态,本例中为客户端 IP 地址($binary_remote_addr)。limit_req 指令指定 location 为 /login.html 的页面使用这块共享内存区域。

限制连接数

可以限制来自单独客户端 IP 的连接数为一个正常用户适用的值。例如,允许每个客户端 IP 跟网站的 /store 区域同时最多建立10个连接:


limit_conn_zone $binary_remote_addr zone=addr:10m; server {     ...     location /store/ {         limit_conn addr 10;         ...     } }

limit_conn_zone 指令配置一个共享内存区域称为 addr 用于存储请求指定项的状态,本例中(同之前的示例)为客户端 IP 地址($binary_remote_addr)。limit_conn 指令指定 location 为 /store 的页面使用这块共享内存区域,并且限制每个客户端 IP 的最大连接数为10个。

关闭慢速连接

可以关闭那些请求数据非常稀少的连接,这些连接通常试图保持尽可能长的时间以消耗服务器资源。Slowloris 攻击就是这种类型。client_body_timeout 指令控制 NGINX 在两次用户体写之间等待多长时间,client_header_timeout 指令控制 NGINX 在两次用户头部写之间等待多长时间。这两个指令默认值均为60秒。下面为示例配置 NGINX 在两次用户体或头部写之间最多等待5秒:


server {     client_body_timeout 5s;     client_header_timeout 5s;     ... }

IP 地址黑名单

如果你可以识别出用于攻击的 IP 地址,就可以使用 deny 指令将其加入黑名单中,这样 NGINX 和 NGINX Plus 会拒绝来着这个 IP 的任何连接或请求。例如,如果你确定攻击来自地址 123.123.123.1~123.123.123.16:


location / {     deny 123.123.123.0/28;     ... }

又或者你确定攻击来自地址 123.123.123.3,123.123.123.5和123.123.123.7:


location / {     deny 123.123.123.3;     deny 123.123.123.5;     deny 123.123.123.7;     ... }

IP 地址白名单

如果网站或应用只允许来自指定 IP 地址的连接,则可以同时使用 allow 和 deny 指令来设置只允许指定 IP 访问网站或应用。例如,限制只允许来自本地网络的连接:


location / {     allow 192.168.1.0/24;     deny all;     ... }

这里的 deny all 指令禁止所有来自 allow 指定范围之外 IP 的连接。

使用缓存来平滑流量峰值

可以配置 NGINX 和 NGINX Plus 使其承受更多来自攻击产生的流量峰值,通过启用缓存并配置相关参数使其暂存后续的请求。下面是一些有用的配置:

1.proxy_cache_use_stale 指令的 updating 参数告诉 NGINX 当它需要获取一个过期缓存对象的更新时,它应当发送一个更新请求,并在此期间使用更新前的对象继续服务于请求的用户。如果攻击就是在不停的重复请求某个文件,这样可以大大减小对后端服务器的请求数量。

2.proxy_cache_key 指令定义的关键字包含内置变量(默认关键字有三个,$scheme$proxy_host$request_uri)。如果包含$query_string 变量,那么攻击者可以发送大量随机的请求字符串从而导致缓存更新过渡频繁。不建议在关键字中包含$query_string变量除非你有什么特别的理由。

阻塞请求

可以配置 NGINX 和 NGINX Plus 阻塞多种请求:

1.极具指向性针对指定 URL 的请求
2.请求头部中的 User-Agent 字段为非正常值
3.请求头部中的 Referer 字段为与攻击相关的值
4.请求头部中其他字段含有与攻击相关的值

例如,如果确定 DDoS 攻击的目标 URL 为 /foo.php,则可以设置阻塞所有对于该页面的请求:


location /foo.php {     deny all; }

或者发现来自 DDoS 攻击的请求头部 User-Agent 字段值为 foo 或 bar,则可以设置阻塞这些请求:


location / {     if ($http_user_agent ~* foo|bar) {         return 403;     }     ... }

http_name 变量代表请求头部,本例中为 User-Agent。类似的方法可用于阻塞其他头部值的请求。

限制后端服务器的连接

NGINX 和 NGINX Plus 由于负载均衡所以经常同时处理比后端服务器更大量的连接。对于 NGINX Plus 可以限制每个后端服务器的连接数。例如,如果希望 NGINX Plus 限制每个网站 upstream 组内后端服务器最多建立200个连接:


upstream website {     server 192.168.100.1:80 max_conns=200;     server 192.168.100.2:80 max_conns=200;     queue 10 timeout=30s;}

max_conns 参数为每个服务器指定最大连接数。queue 指令设置当 upstream 组内后端服务器达到了最大连接数时请求队列的长度,timeout 参数设置请求队列中每项的保留时间。

处理基于 Range 字段的攻击

攻击的另一种方法就是通过发送一个头部中 Range 字段具有非常大的数值,从而导致服务器的溢出。具体关于如何配置 NGINX 和 NGINX Plus 缓解这种攻击可以参见一个案例,如何配置 NGINX 和 NGINX Plus 抵御CVE-2015-1635

处理高负荷

DDoS 攻击通常都会导致高负荷。关于如何调整 NGINX 和 NGINX Plus 以及操作系统处理高负荷可以参见调整NGINX性能

识别 DDoS 攻击

到目前为止,我们主要关注了如何配置 NGINX 和 NGINX Plus 缓解 DDoS 攻击带来的影响。但是如何使用 NGINX 和 NGINX Plus 帮助发现 DDoS 攻击呢?NGINX Plus 状态模块 提供了详细的指标描述了当前链路的负载均衡状况,可以使用这个模块帮助发现不寻常的流量模式。NGINX Plus 也提供了一个展示状态仪表盘的网页,可以实时的描述当前 NGINX Plus 系统的运行状态(演示地址:demo.nginx.com)。同样的指标也可以通过 API 进行读取,使用自定义的或第三方监控系统都可以获取到这些指标,之后可以自己根据数据分析历史趋势并发现异常流量进行报警。

总结

NGINX 和 NGINX Plus 可以作为缓解 DDoS 攻击方案的重要组成部分,其中 NGINX Plus 提供了更多的功能帮助识别并抵御 DDoS 攻击。



(责任编辑:IT)
------分隔线----------------------------
栏目列表
推荐内容