如何使用nginx防御DDOS攻击

2015-10-26 22:05:42 9182

1.DDOS是一种通过大流量的请求对目标进行轰炸式访问,导致提供服务的服务器资源耗尽进而无法继续提供服务的攻击手段。

一般情况下,攻击者通过大量请求与连接使服务器处于饱和状态,以至于无法接受新的请求或变得很慢。

2.应用层DDOS攻击的特征

应用层(七层/HTTP层)DDOS攻击通常由木马程序发起,其可以通过设计更好的利用目标系统的脆弱点。例如,对于无法处理大量并发请求的系统,仅仅通过建立大量的连接,并周期性的发出少量数据包来保持会话就可以耗尽系统的资源,使其无法接受新的连接请求达到DDOS的目的。其他还有采用发送大量连接请求发送大数据包的请求进行攻击的形式。因为攻击是由木马程序发起,攻击者可以在很短时间内快速建立大量的连接,并发出大量的请求。

以下是一些DDOS的特证,我们可以据此特征来抵抗DDOS(包括但不限于):攻击经常来源于一些相对固定的IPIP段,每个IP都有远大于真实用户的连接数和请求数。备注:这并不表明这种请求都是代表着DDOS攻击。在很多使用NAT的网络架构中,很多的客户端使用网关的IP地址访问公网资源。但是,即便如此,这样的请求数和连接数也会远少于DDOS攻击。因为攻击是由木马发出且目的是使服务器超负荷,请求的频率会远远超过正常人的请求。User-Agent通常是一个非标准的值Referer有时是一个容易联想到攻击的值

3.使用NginxNginx Plus抵抗DDOS攻击

结合上面提到的DDOS攻击的特征,NginxNginx Plus有很多的特性可以用来有效的防御DDOS攻击,可以从调整入口访问流量和控制反向代理到后端服务器的流量两个方面来达到抵御DDOS攻击的目的。

限制请求速度

    设置Nginx的连接请求在一个真实用户请求的合理范围内。比如,如果你觉得一个正常用户每两秒可以请求一次登录页面,你就可以设置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的目的。

4.限制连接数量

设置Nginx的连接数在一个真实用户请求的合理范围内。比如,你可以设置每个客户端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

5.关闭慢连接

有一些DDOS攻击,比如Slowlris,是通过建立大量的连接并周期性的发送一些数据包保持会话来达到攻击目的,这种周期通常会低于正常的请求。这种情况我们可以通过关闭慢连接来抵御攻击。

`client_body_timeout`命令用来定义读取客户端请求的超时时间,`client_header_timeout`命令用来定于读取客户端请求头的超时时间。这两个参数的默认值都是60s,我们可以通过下面的命令将他们设置为5s

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

6.设置IP黑名单

如果确定攻击来源于某些IP地址,我们可以将其加入黑名单,Nginx就不会再接受他们的请求。比如,你已经确定攻击来自于从123.123.123.1123.123.123.16的一段IP地址,你可以这样设置:

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

或者你确定攻击来源于123.123.123.3123.123.123.5123.123.123.7几个IP,可以这样设置:

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

7.设置IP白名单

如果你的网站仅允许特定的IPIP段访问,你可以结合使用allowdeny命令来限制仅允许你指定的IP地址访问你的网站。如下,你可以设置仅允许192.168.1.0段的内网用户访问:

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

deny命令会拒绝除了allow指定的IP段之外的所有其他IP的访问请求。

提交成功!非常感谢您的反馈,我们会继续努力做到更好!

这条文档是否有帮助解决问题?

非常抱歉未能帮助到您。为了给您提供更好的服务,我们很需要您进一步的反馈信息:

在文档使用中是否遇到以下问题: