[转帖]通过Nginx和Nginx Plus阻止DDoS攻击

通过,nginx,plus,阻止,ddos,攻击 · 浏览次数 : 0

小编点评

**分布式拒绝服务攻击(DDoS)缓解与解决方法** **什么是DDoS攻击?** DDoS攻击是一种网络攻击方法,通过多台机器向一个服务或网站发送大量看似合法的数据包,使其网络阻塞、资源耗尽无法为正常用户提供正常服务的攻击方式。 **DDoS攻击的特点:** * 攻击流量来自固定的IP地址,每个IP地址创建比真实用户多得多的连接和请求。 * 流量全部是由机器产生的,其速率比人类用户高的多。 * 攻击器的User-Agent头并非标准值,Referer头有时也会被设置成能够与攻击关联起来的值。 **如何缓解或解决DDoS攻击:** * **限制请求率:**通过设置请求率限制指令,仅允许指定数量的请求进入服务器。 * **限制连接数量:**通过设置连接数限制指令,仅允许指定数量的客户端可以打开连接。 * **关闭慢连接:**通过设置慢连接超时时间,拒绝一直保持打开的连接。 * **关闭IP黑名单:**通过设置IP黑名单指令,拒绝来自指定IP地址的请求。 * **设置IP白名单:**通过设置IP白名单指令,允许指定IP地址的请求进入。 * **缓存削减流量峰值:**通过启用缓存并设置缓存参数,降低攻击所产生的流量峰值。 * **阻塞请求:**通过设置请求筛选规则,拒绝以特定URL、User-Agent或Referer为目标的请求。 * **限制连接数:**通过设置后端服务器连接数限制指令,仅允许指定数量的连接进入。 **其他建议:** * 使用Nginx Plus来缓和DDoS攻击。 * 使用Nginx Plus Status模块发现异常的流量模式,定位DDoS攻击。

正文

分布式拒绝服务攻击(DDoS)指的是通过多台机器向一个服务或者网站发送大量看似合法的数据包使其网络阻塞、资源耗尽从而不能为正常用户提供正常服务的攻击手段。随着互联网带宽的增加和相关工具的不断发布,这种攻击的实施难度越来越低,有大量IDC托管机房、商业站点、游戏服务商一直饱受DDoS攻击的困扰,那么如何缓解甚至解决DDoS呢?最近Rick Nelson在Nginx的官方博客上发表了一篇文章,介绍了如何通过Nginx和Nginx Plus缓和DDoS攻击

Rick Nelson首先介绍了DDoS攻击的一些特点,例如攻击的流量通常来源于一些固定的IP地址,每一个IP地址会创建比真实用户多得多的连接和请求;同时由于流量全部是由机器产生的,其速率要比人类用户高的多。此外,进行攻击的机器其User-Agent头也不是标准的值,Referer头有时也会被设置成能够与攻击关联起来的值。针对这些特点,Rick Nelson认为Nginx和Nginx Plus有很多能够通过调节或控制流量来应对或者减轻DDoS攻击的特性。

限制请求率 
将Nginx和Nginx Plus可接受的入站请求率限制为某个适合真实用户的值。例如,通过下面的配置让一个真正的用户每两秒钟才能访问一次登录页面:

  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. }

在该配置中,limit_req_zone指令配置了一个名为one的共享内存zone用来存储$binary_remote_addr的请求状态,location块中/login.html的limit_req指令引用了共享内存zone

限制连接的数量 
将某个客户端IP地址所能打开的连接数限制为真实用户的合理值。例如,限制每一个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. }

该配置中,limit_conn_zone指令配置了一个名为addr的共享内存zone用来存储 $binary_remote_addr的请求,location块中/store/的limit_conn指令引用了共享内存zone,并将最大连接数设置为10.

关闭慢连接 
关闭那些一直保持打开同时写数据又特别频繁的连接,因为它们会降低服务器接受新连接的能力。Slowloris就是这种类型的攻击。对此,可以通过client_body_timeoutclient_header_timeout指令控制请求体或者请求头的超时时间,例如,通过下面的配置将等待时间控制在5s之内:

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

设置IP黑名单 
如果能识别攻击者所使用的客户端IP地址,那么通过deny指令将其屏蔽,让Nginx和Nginx Plus拒绝来自这些地址的连接或请求。例如,通过下面的指令拒绝来自123.123.123.3、123.123.123.5和123.123.123.7的请求:

  1. location / {
  2. deny 123.123.123.3;
  3. deny 123.123.123.5;
  4. deny 123.123.123.7;
  5. ...
  6. }

设置IP白名单 
如果允许访问的IP地址比较固定,那么通过allowdeny指令让网站或者应用程序只接受来自于某个IP地址或者某个IP地址段的请求。例如,通过下面的指令将访问限制为本地网络的一个IP段:

  1. location / {
  2. allow 192.168.1.0/24;
  3. deny all;
  4. ...
  5. }

通过缓存削减流量峰值 
通过启用缓存并设置某些缓存参数让Nginx和Nginx Plus吸收攻击所产生的大部分流量峰值。例如,通过proxy_cache_use_stale指令的updating参数告诉Nginx何时需要更新过期的缓存对象,避免因重复发送更新请求对后端服务器产生压力。另外,proxy_cache_key指令定义的键通常会包含嵌入的变量,例如默认的键$scheme$proxy_host$request_uri包含了三个变量,如果它包含$query_string变量,那么攻击者可以通过发送随机的query_string值来耗尽缓存,因此,如果没有特别原因,不要在该键中使用$query_string变量。

阻塞请求 
配置Nginx和Nginx Plus阻塞以下类型的请求:

  • 以某个特定URL为目标的请求
  • User-Agent头中的值不在正常客户端范围之内的请求
  • Referer头中的值能够与攻击关联起来的请求
  • 其他头中存在能够与攻击关联在一起的值的请求

例如,通过下面的配置阻塞以/foo.php为目标的攻击:

  1. location /foo.php {
  2. deny all;
  3. }

或者通过下面的配置阻塞已识别出的User-Agent头的值是foo或者bar的DDoS攻击:

  1. location / {
  2. if ($http_user_agent ~* foo|bar) {
  3. return 403;
  4. }
  5. ...
  6. }

限制对后端服务器的连接数 
通常Nginx和Nginx Plus实例能够处理比后端服务器多得多的连接数,因此可以通过Nginx Plus限制到每一个后端服务器的连接数。例如,通过下面的配置限制Nginx Plus和每一台后端服务器之间建立的连接数不多于200个:

  1. upstream website {
  2. server 192.168.100.1:80 max_conns=200;
  3. server 192.168.100.2:80 max_conns=200;
  4. queue 10 timeout=30s;
  5. }

另外,Rick Nelson还提到了如何处理基于范围的攻击如何处理高负载的问题,以及如何使用Nginx Plus Status模块发现异常的流量模式,定位DDoS攻击。


感谢魏星对本文的审校。

</article>

与[转帖]通过Nginx和Nginx Plus阻止DDoS攻击相似的内容:

[转帖]通过Nginx和Nginx Plus阻止DDoS攻击

分布式拒绝服务攻击(DDoS)指的是通过多台机器向一个服务或者网站发送大量看似合法的数据包使其网络阻塞、资源耗尽从而不能为正常用户提供正常服务的攻击手段。随着互联网带宽的增加和相关工具的不断发布,这种攻击的实施难度越来越低,有大量IDC托管机房、商业站点、游戏服务商一直饱受DDoS攻击的困扰,那么如

[转帖]nginx性能和软中断

https://plantegg.github.io/2022/11/04/nginx%E6%80%A7%E8%83%BD%E5%92%8C%E8%BD%AF%E4%B8%AD%E6%96%AD/ 问题 如何调整软中断才能达到最优性能? 通过 top 观察软中断 和 si%、sy% 的关系 测试机型

[转帖]nginx性能和软中断

https://plantegg.github.io/2022/11/04/nginx%E6%80%A7%E8%83%BD%E5%92%8C%E8%BD%AF%E4%B8%AD%E6%96%AD/ nginx性能和软中断 问题 如何调整软中断才能达到最优性能? 通过 top 观察软中断 和 si%、

[转帖]nginx性能和软中断

https://plantegg.github.io/2022/11/04/nginx%E6%80%A7%E8%83%BD%E5%92%8C%E8%BD%AF%E4%B8%AD%E6%96%AD/ nginx性能和软中断 问题 如何调整软中断才能达到最优性能? 通过 top 观察软中断 和 si%、

[转帖]Nginx负载均衡之ip_hash

原理: 通过哈希值和ip进行运算,得出一个哈希字符串,一个值。分发的时候进行判断请求之前是否和哈希绑定过。有的话则优先分配 匹配到对应哈希值的服务器上。 什么是ip_hash? ip_hash是根据用户请求过来的ip,然后映射成hash值,然后分配到一个特定的服务器里面;使用ip_hash这种负载均

[转帖]Nginx动静分离;资源分离;rewrite重写、跳转、伪静态、规则、日志

https://www.cnblogs.com/caodan01/p/14745562.html 一、动静分离 动静分离,通过中间件将动静请求和静态请求进行分离; 通过中间件将动态请求和静态请求分离,可以减少不必要的请求消耗,同时能减少请求的延时。 通过中间件将动态请求和静态请求分离,逻辑图如下:

[转帖]nginx重定向(Redirect)- rewrite

语法:rewrite regex replacement [flag];; 默认值:—— 可配置段:server, location 作用:通过正则表达式的使用来改变URI。可以同时存在一个或多个指令。需要按照顺序依次对URL进行匹配和处理。 示例: rewrite ^/(.*) http://ww

[转帖]Nginx动静分离详解以及配置

https://developer.aliyun.com/article/885602?spm=a2c6h.24874632.expert-profile.314.7c46cfe9h5DxWK 简介: 1.Nginx动静分离概念 动静分离,通过中间件将动态请求和静态请求进行分离,分离资源,减少不必要

[转帖]yum downloadonly

https://www.jianshu.com/p/937e41636e73 对于很多有特殊部门部署经验的运维人员来说,每一次上线都是非常痛苦的,因为服务器不能通外网,所以无法直接通过yum仓库进行安装,所在安装一个普通的nginx都变得非常繁琐,首先要安装gcc和g++,这两个工具又分别依赖其他的

[转帖]Traefik中诡异的502和504问题

https://zhuanlan.zhihu.com/p/156138704 我们都知道在 Kubernetes 集群中通常会使用 Ingress 方案来统一代理集群内部的流量,而常用的 Ingress 方案为 traefik 和 nginx,和传统的 Nginx 作为企业内部的反向代理以及负载设备