如何让nginx服务器抵御DDOS攻击

DDOS是一种通过大流量的请求对目标进行轰炸式访问,导致提供服务的服务器资源耗尽进而无法继续提供服务的攻击手段。一般情况下,攻击者通过大量请求与连接使服务器处于饱和状态,以至于无法接受新的请求或变得很慢。

应用层DDOS攻击的特征

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

以下是一些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个请求)。

  1. limit_req_zone $binary_remote_addr zone=one:10m rate=30r/m;
  2.     server {
  3.     ...
  4.     location /login.html {
  5.         limit_req zone=one;
  6.     ...
  7.     }
  8.     }
  9.    limit_req_zone 命令设置了一个叫one的共享内存区来存储请求状态的特定键值,在上面的例子中是客户端IP($binary_remote_addr)。location块中的`limit_req`通过引用one共享内存区来实现限制访问/login.html的目的。

限制连接数量

设置Nginx、Nginx Plus的连接数在一个真实用户请求的合理范围内。比如,你可以设置每个客户端IP连接/store不可以超过10个。

  1. limit_conn_zone $binary_remote_addr zone=addr:10m;
  2.      server {
  3.      ...
  4.      location /store/ {
  5.          limit_conn addr 10;
  6.          ...
  7.       }
  8.      }
  9.     `limit_conn_zone`命令设置了一个叫addr的共享内存区来存储特定键值的状态,在上面的例子中是客户端IP( $binary_remote_addr)。location块中`limit_conn`通过引用addr共享内存区来限制到/store/的最大连接数为10。

关闭慢连接

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

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

  1. server {
  2.    client_body_timeout 5s;
  3.    client_header_timeout 5s;
  4.    ...
  5.    }

设置IP黑名单

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

  1. location / {
  2.   deny 123.123.123.0/28;
  3.   ...
  4.   }

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

  1. location / {
  2.   deny 123.123.123.0/28;
  3.   ...
  4.   }

设置IP白名单

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

  1. location / {
  2.  allow 192.168.1.0/24;
  3.  deny all;
  4.  ...
  5.  }
  6. deny命令会拒绝除了allow指定的IP段之外的所有其他IP的访问请求。

使用缓存进行流量削峰

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

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

识别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/(运维帮译)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Youngxj

bat锁机代码

2.8K9
来自专栏IMWeb前端团队

调试利器-SSH隧道

本文作者:IMWeb 吴浩麟 原文出处:IMWeb社区 未经同意,禁止转载 在开发微信公众号或小程序的时候,由于微信平台规则的限制,部分接口需要通过...

5779
来自专栏Python

linux每日命令(7):rmdir命令

rmdir是常用的命令,该命令的功能是删除空目录,一个目录被删除之前必须是空的。(注意,rm - r dir命令可代替rmdir,但是有很大危险性。)删除某目录...

1054
来自专栏屈定‘s Blog

对一个WEB请求的理解

随着写的WEB程序越来越多,项目的部署也越来越繁琐,对于一些线上问题总是搞不清楚是哪个环节出的问题,归根结底是对整个流程的不熟悉导致,所以分析下一个WEB请求从...

2195
来自专栏网络

一步步带你了解前后端分离利器之JWT

一、HTTP的无状态性 HTTP 是无状态协议,它不对之前发送过的请求和响应的状态进行管理。也就是说,无法根据之前的状态进行本次的请求处理。假设要求登录认证的 ...

3275
来自专栏我和PYTHON有个约会

31.2企业级开发进阶3.2:接收电子邮件引入解析需要的模块解析邮件内容引入需要的模块定义解析邮件内容的函数decode_header解码操作函数

上一节内容中,我们通过Python进行了电子邮件发送功能的处理 本节内容内容主要讲解接收邮件功能的处理

702
来自专栏编程

App与后台通信:从文本协议到二进制协议

本文主要总结了心悦俱乐部 App 的接入层从文本协议到二进制 jce 协议迭代过程中的技术方案。

1.6K10
来自专栏原创

个推推送iOS版 常见问题详解

1、提交了.p12文件后多久可以测试? 提交后10分钟左右才可以测试,并不是立即生效的。 2、应用在后台时接收不到消息,即APNS消息接收不到? 1.    先...

38211
来自专栏令仔很忙

新手学Linux(六)----安装Nginx

nginx是C语言开发,建议在linux上运行,本教程使用Centos7.0作为安装环境。

2222
来自专栏技术专栏

Spring Security+Spring Social+SpringBoot集成Restful可配置安全模块及代码生成器

1.本项目主要分为core核心模块,browser浏览器模块,app模块,demo使用restful实例模块及spring-boot-api-project-s...

6462

扫码关注云+社区

领取腾讯云代金券