使用Nginx、Nginx Plus抵御DDOS攻击的方法

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

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

一、应用层DDOS攻击的特征

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

以下是一些DDOS的特证,我们可以据此特征来抵抗 DDOS(包括但不限于):

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

二、使用Nginx、Nginx Plus抵抗DDOS攻击

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

1. 限制请求速度

设置 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 的目的。

2. 限制连接数量

设置 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。

3. 关闭慢连接

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

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

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

4. 设置IP黑名单

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

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

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

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

5. 设置IP白名单

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

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

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

6. 使用缓存进行流量削峰

通过打开 Nginx 的缓存功能并设置特定的缓存参数,可以削减来自攻击的流量,同时也可以减轻对后端服务器的请求压力。以下是一些有用的设置:

  1. proxy_cache_use_stale ` 的 updating 参数告诉 Nginx 什么时候该更新所缓存的对象。只需要到后端的一个更新请求,在缓存有效期间客户端对该对象的请求都无需访问后端服务器。当通过对一个文件的频繁请求来实施攻击时,缓存功能可极大的降低到后端服务器的请求。
  2. proxy_cache_key ` 命令定义的键值通常包含一些内嵌的变量(默认的键值 $scheme$proxy_host$request_uri 包含了三个变量)。如果键值包含 `$query_string` 变量,当攻击的请求字符串是随机的时候就会给 Nginx 代理过重的缓存负担,因此我们建议一般情况下不要包含 `$query_string` 变量。

7. 屏蔽特定的请求

可以设置 Nginx、Nginx Plus 屏蔽一些类型的请求:

  1. 针对特定 URL 的请求
  2. 针对不是常见的 User-Agent 的请求
  3. 针对 Referer 头中包含可以联想到攻击的值的请求
  4. 针对其他请求头中包含可以联想到攻击的值的请求

比如,如果你判定攻击是针对一个特定的 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 头使用类似的方法来识别攻击。

8. 限制到后端服务器的连接数

一个 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` 参数指定了请求在队列中的保留时间。

9. 处理特定类型的攻击

有一种攻击是发送包含特别大的值的请求头,引起服务器端缓冲区溢出。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)

10. 优化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 攻击并且当攻击发生时及时的识别到。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Nginx+iptables屏蔽访问Web页面过于频繁的IP(防DDOS,恶意访问,采集器)

    脚本如下: 复制代码 代码如下: #!/bin/sh nginx_home = /Data/app_1/nginx log_path = /Data/logs /usr/bin/tail -n50000 $log_path/access.log \ |awk '$8 ~/aspx/{print $2,$13}' \ |grep -i -v -E "google|yahoo|baidu|msnbot|FeedSky|sogou" \ |awk '{print $1}'|sort|uniq

  • 如何利用nginx处理DDOS进行系统优化详解

    前言 众所周知DDoS很常见,甚至被称为黑客圈子的准入技能:DDoS又很凶猛,搞起事来几乎压垮一方网络. DDOS的特点是分布式,针对带宽和服务攻击,也就 是四层流量攻击和七层应用攻击,相应的防御瓶颈四层在带宽,七层的多在架构的吞吐量.对于七层的应用攻击,我们还是可以做一些配置来防御的,例如前端是 Nginx,主要使用nginx的http_limit_conn和http_limit_req模块来防御. 什么是分布式拒绝服务DDoS(Distributed Denial of Service)意为

  • Nginx防御DDOS攻击的配置方法教程

    前言 Nginx是一款轻量级的Web服务器,由俄罗斯的程序设计师Igor Sysoev所开发,最初供俄国大型的入口网站及搜寻引Rambler使用. 其特点是占有内存少,并发能力强,事实上Nginx的并发能力确实在同类型的网站服务器中表现较好. 防御DDOS是一个系统工程,攻击花样多,防御的成本高瓶颈多,防御起来即被动又无奈.DDOS的 特点是分布式,针对带宽和服务攻击,也就是四层流量攻击和七层应用攻击,相应的防御瓶颈四层在带宽,七层的多在架构的吞吐量.对于七层的应用攻击,我们还 是可以做一些配置

  • 使用Nginx、Nginx Plus抵御DDOS攻击的方法

    DDOS 是一种通过大流量的请求对目标进行轰炸式访问,导致提供服务的服务器资源耗尽进而无法继续提供服务的攻击手段. 一般情况下,攻击者通过大量请求与连接使服务器处于饱和状态,以至于无法接受新的请求或变得很慢. 一.应用层DDOS攻击的特征 应用层(七层/HTTP层)DDOS 攻击通常由木马程序发起,其可以通过设计更好的利用目标系统的脆弱点.例如,对于无法处理大量并发请求的系统,仅仅通过建立大量的连接,并周期性的发出少量数据包来保持会话就可以耗尽系统的资源,使其无法接受新的连接请求达到 DDOS

  • php的ddos攻击解决方法

    本文实例讲述了php的ddos攻击解决方法.分享给大家供大家参考.具体分析如下: 今天自己的一台机器突然向外部发送大量数据包,可每秒到1G以上,虽然我用策略把UDP禁止包是发不出去但是很占cup啊,所以想到最后还是想办法解决了. 先看源码,代码如下: 复制代码 代码如下: <?php set_time_limit(999999); $host = $_GET['host']; $port = $_GET['port']; $exec_time = $_GET['time']; $Sendlen

  • PHP利用hash冲突漏洞进行DDoS攻击的方法分析

    本文实例分析了PHP利用hash冲突漏洞进行DDoS攻击的方法.分享给大家供大家参考.具体分析如下: 首先声明:本文内容只用于研究学习使用,请勿用于非法行为! 前面提到过最近爆出的hash表碰撞漏洞,包括java.python.php等在内的很多常用语言均未幸免,今晚咱就来实际看看它的威力. 攻击原理: 通过向目标服务器post一组精心拼凑的数组参数,到达服务端后语言底层处理接收到的数组参数时,由于该漏洞的存在造成CPU的大量消耗,最终导致服务器资源耗尽. 不用什么花哨的手法,就用PHP简单实现

  • linux抵御DDOS攻击 通过iptables限制TCP连接和频率

    cc攻击一到就有点兵临城下的感觉,正确的设置防护规则可以做到临危不乱,这里给出一个iptables对ip进行连接频率和并发限制,限制单ip连接和频率的设置规则的介绍 #单个IP在60秒内只允许新建20个连接,这里假设web端口就是80, 复制代码 代码如下: iptables -I  INPUT -i eth1 -p tcp -m tcp –dport 80 -m state –state NEW -m recent –update –seconds 60 –hitcount 20 –name

  • 私服有效防DDOS攻击的方法

    首先声明.这样设置后,可以防止DDOS,也可以防止70%的SYN半连接攻击| 首先对你机器做以下的设置 !用本地安全策略封掉所有不属于传奇开放端口,封的方法见网络上,很多,就是封3000的办法 ! 你传奇服务器内部可以访问,.但不对外,然后打开 7000. 7100 7200 端口 ! (记得不要封掉)然后去下载个硬件防火墙软件模拟工具 ! (哈哈,有这个吗 ?)名字叫MapPort 端口影射工具 !打开,输入第一组隐射组7000 - > 30000(LoginGate)7100 - > 31

  • Nginx服务器抵御CC攻击的相关配置讲解

    0x00 CC攻击的基本原理 CC攻击利用代理服务器向网站发送大量需要较长计算时间的URL请求,如数据库查询等,导致服务器进行大量计算而很快达到自身的处理能力而形成DOS.而攻击者一旦发送请求给代理后就主动断开连接,因爲代理并不因爲客户端这边连接的断开就不去连接目标服务器.因此攻击机的资源消耗相对很小,而从目标服务器看来,来自代理的请求都是合法的. 以前防CC攻击的方法 为了防范CC,以前的方法一个是限制每个IP的连接数,这在地址范围很广阔的情况下比较难实现;二是限制代理的访问,因为一般的代理都

  • 配置Nginx实现简单防御cc攻击

    ddos攻击:分布式拒绝服务攻击,就是利用大量肉鸡或伪造IP,发起大量的服务器请求,最后导致服务器瘫痪的攻击. cc攻击:类似于ddos攻击,不过它的特点是主要是发起大量页面请求,所以流量不大,但是却能导致页面访问不了. 使用Nginx的配置对cc攻击进行简单防御 =================================================================== 主要是通过nginx和lua来配合,达到防御的目的. 一.Nginx编译支持lua -------

  • Linux VPS安全设置之三:使用DDOS deflate抵御少量DDOS攻击

    互联网是丰富多彩的,基本上能够找到我们需要的资源,也正因为如此很多朋友都加入到站长的行列中来.在众多站长之间也会存在明争暗斗的事情.尤其是我们个人站长,由于技术和财力有限,好不容易使用上主机.VPS后被攻击没有能力防御,导致我们的主机或者VPS商给我们的账户暂停,IP挂起等.尤其是我们在使用的VPS主机中,因为是按照流量消费的,在耗尽我们的流量,遭遇大量的DDOS攻击之后,也束手无策,包括老左也看到之前也遭遇到DDOS攻击. 在遇到这些问题的时候,我们是否能在VPS设置中进行处理呢?哪怕是一点点

  • IIS防御小规模DDOS攻击实例(反向代理)

    最近几天公司官网和业务系统的注册页面频繁遭遇DDOS攻击,导致IIS应用程序池CPU占用率100%,访问网站出现503错误.下面总结一下应对措施.     一.启用IIS的CPU监视功能 对于低频率的DDOS可以采取这种方法.w3wp.exe是应用程序池的关联进程,当WEB访问量大时,w3wp.exe会占用大量的系统资源.在DDOS攻击下,很明显的现象就是w3wp.exe占用CPU达到100%,网站拒绝访问,这个时候远程登录服务器都很困难.针对这种情况,做如下优化: 1.为IIS中的每个网站设置

随机推荐