DDOS是一种经过大流量的请求对目标进行轰炸式访问,致使提供服务的服务器资源耗尽进而没法继续提供服务的攻击手段。php
通常状况下,攻击者经过大量请求与链接使服务器处于饱和状态,以致于没法接受新的请求或变得很慢。html
应用层DDOS攻击的特征nginx
应用层(七层/HTTP层)DDOS攻击一般由木马程序发起,其能够经过设计更好的利用目标系统的脆弱点。例如,对于没法处理大量并发请求的系统,仅仅经过创建大量的链接,并周期性的发出少许数据包来保持会话就能够耗尽系统的资源,使其没法接受新的链接请求达到DDOS的目的。其余还有采用发送大量链接请求发送大数据包的请求进行攻击的形式。由于攻击是由木马程序发起,攻击者能够在很短期内快速创建大量的链接,并发出大量的请求。web
如下是一些DDOS的特证,咱们能够据此特征来抵抗DDOS(包括但不限于):后端
攻击常常来源于一些相对固定的IP或IP段,每一个IP都有远大于真实用户的链接数和请求数。缓存
备注:这并不代表这种请求都是表明着DDOS攻击。在不少使用NAT的网络架构中,不少的客户端使用网关的IP地址访问公网资源。可是,即使如此,这样的请求数和链接数也会远少于DDOS攻击。服务器
由于攻击是由木马发出且目的是使服务器超负荷,请求的频率会远远超过正常人的请求。网络
User-Agent一般是一个非标准的值架构
Referer有时是一个容易联想到攻击的值并发
使用Nginx、Nginx Plus抵抗DDOS攻击
结合上面提到的DDOS攻击的特征,Nginx、Nginx Plus有不少的特性能够用来有效的防护DDOS攻击,能够从调整入口访问流量和控制反向代理到后端服务器的流量两个方面来达到抵御DDOS攻击的目的。
限制请求速度
设置Nginx、Nginx Plus的链接请求在一个真实用户请求的合理范围内。好比,若是你以为一个正经常使用户每两秒能够请求一次登陆页面,你就能够设置Nginx每两秒钟接收一个客户端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)。location块中的`limit_req`经过引用one共享内存区来实现限制访问/login.html的目的。
限制链接数量
设置Nginx、Nginx Plus的链接数在一个真实用户请求的合理范围内。好比,你能够设置每一个客户端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)。location块中`limit_conn`经过引用addr共享内存区来限制到/store/的最大链接数为10。
关闭慢链接
有一些DDOS攻击,好比Slowlris,是经过创建大量的链接并周期性的发送一些数据包保持会话来达到攻击目的,这种周期一般会低于正常的请求。这种状况咱们能够经过关闭慢链接来抵御攻击。
`client_body_timeout`命令用来定义读取客户端请求的超时时间,`client_header_timeout`命令用来定于读取客户端请求头的超时时间。这两个参数的默认值都是60s,咱们能够经过下面的命令将他们设置为5s:
server {
client_body_timeout 5s;
client_header_timeout 5s;
...
}
设置IP黑名单
若是肯定攻击来源于某些IP地址,咱们能够将其加入黑名单,Nginx就不会再接受他们的请求。好比,你已经肯定攻击来自于从123.123.123.1到123.123.123.16的一段IP地址,你能够这样设置:
location / {
deny 123.123.123.0/28;
...
}
或者你肯定攻击来源于123.123.123.三、123.123.123.五、123.123.123.7几个IP,能够这样设置:
location / {
deny 123.123.123.3;
deny 123.123.123.5;
deny 123.123.123.7;
...
}
设置IP白名单
若是你的网站仅容许特定的IP或IP段访问,你能够结合使用allow和deny命令来限制仅容许你指定的IP地址访问你的网站。以下,你能够设置仅容许192.168.1.0段的内网用户访问:
location / {
allow 192.168.1.0/24;
deny all;
...
}
deny命令会拒绝除了allow指定的IP段以外的全部其余IP的访问请求。
使用缓存进行流量削峰
经过打开Nginx的缓存功能并设置特定的缓存参数,能够削减来自攻击的流量,同时也能够减轻对后端服务器的请求压力。如下是一些有用的设置:
`proxy_cache_use_stale `的updating参数告诉Nginx何时该更新所缓存的对象。只须要到后端的一个更新请求,在缓存有效期间客户端对该对象的请求都无需访问后端服务器。当经过对一个文件的频繁请求来实施攻击时,缓存功能可极大的下降到后端服务器的请求。
`proxy_cache_key `命令定义的键值一般包含一些内嵌的变量(默认的键值$scheme$proxy_host$request_uri包含了三个变量)。若是键值包含`$query_string`变量,当攻击的请求字符串是随机的时候就会给Nginx代理太重的缓存负担,所以咱们建议通常状况下不要包含`$query_string`变量。
屏蔽特定的请求
能够设置Nginx、Nginx Plus屏蔽一些类型的请求:
针对特定URL的请求
针对不是常见的User-Agent的请求
针对Referer头中包含能够联想到攻击的值的请求
针对其余请求头中包含能够联想到攻击的值的请求
好比,若是你断定攻击是针对一个特定的URL:/foo.php,咱们就能够屏蔽到这个页面的请求:
location /foo.php {
deny all;
}
或者你断定攻击请求的User-Agent中包含foo或bar,咱们也能够屏蔽这些请求:
location / {
if ($http_user_agent ~* foo|bar) {
return 403;
}
...
}
http_name变量引用一个请求头,上述例子中是User-Agent头。能够针对其余的http头使用相似的方法来识别攻击。
限制到后端服务器的链接数
一个Nginx、Nginx Plus实例能够处理比后端服务器多的多的并发请求。在Nginx Plus中,你能够限制到每个后端服务器的链接数,好比能够设置Nginx Plus与website 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`参数能够针对每个后端服务器设置Nginx Plus能够与之创建的最大链接数。`queue`命令设置了当每一个后端服务器都达到最大链接数后的队列大小,`timeout`参数指定了请求在队列中的保留时间。
处理特定类型的攻击
有一种攻击是发送包含特别大的值的请求头,引发服务器端缓冲区溢出。Nginx、Nginx Plus针对这种攻击类型的防护,能够参考[Using NGINX and NGINX Plus to Protect Against CVE-2015-1635](http://nginx.com/blog/nginx-protect-cve-2015-1635/?_ga=1.14368116.2137319792.1439284699)
优化Nginx性能
DDOS攻击一般会带来高的负载压力,能够经过一些调优参数,提升Nginx、Nginx Plus处理性能,硬抗DDOS攻击,详细参考:[Tuning NGINX for Performance](http://nginx.com/blog/tuning-nginx/?_ga=1.48422373.2137319792.1439284699)
识别DDOS攻击
到目前为止,咱们都是集中在如何是用Nginx、Nginx Plus来减轻DDOS攻击带来的影响。如何才能让Nginx、Nginx Plus帮助咱们识别DDOS攻击呢?`Nginx Plus Status module`提供了到后端服务器流量的详细统计,能够用来识别异常的流量。Nginx Plus提供一个当前服务状态的仪表盘页面,同时也能够在自定义系统或其余第三方系统中经过API的方式获取这些统计信息,并根据历史趋势分析识别非正常的流量进而发出告警。
总结
Nginx和Nginx Plus能够做为抵御DDOS攻击的一个有力手段,并且Nginx Plus中提供了一些附加的特性来更好的抵御DDOS攻击而且当攻击发生时及时的识别到。
原文:https://www.nginx.com/blog/mitigating-ddos-attacks-with-nginx-and-nginx-plus/
译者:陈洋 (运维帮)