热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

防御DDOS是一个系统工程,攻击花样多,防御的成本高瓶颈多,防御起来即被动又无奈,下面这篇文章主要给大家介绍了关于如何利用nginx处理DDOS进行系统优化的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下

前言

众所周知DDoS很常见,甚至被称为黑客圈子的准入技能;DDoS又很凶猛,搞起事来几乎压垮一方网络。

DDOS的特点是分布式,针对带宽和服务攻击,也就 是四层流量攻击和七层应用攻击,相应的防御瓶颈四层在带宽,七层的多在架构的吞吐量。对于七层的应用攻击,我们还是可以做一些配置来防御的,例如前端是 Nginx,主要使用nginx的http_limit_conn和http_limit_req模块来防御。

什么是分布式拒绝服务DDoS(Distributed Denial of Service)意为分布式拒绝服务攻击,攻击者利用大量“肉鸡”对攻击目标发动大量的正常或非正常请求,耗尽目标主机资源或网络资源,从而使被攻击者不能为合法用户提供服务。通常情况下,攻击者会尝试使拥有这么多连接的系统饱和,并要求它不再能够接受新的流量,或者变得非常缓慢以至于无法使用。

换句话说老张的饭店(被攻击目标)可接待100个顾客同时就餐,隔壁老王(攻击者)雇佣了200个人(肉鸡),进饭店霸占位置却不吃不喝(非正常请求),饭店被挤得满满当当(资源耗尽),而真正要吃饭的顾客却进不来,饭店无法正常营业(DDoS攻击达成)。那么问题来了,老张该怎么办?

当然是,轰出去!

通常情况下,攻击者会尝试使拥有这么多连接的系统饱和,并要求它不再能够接受新的流量,或者变得非常缓慢以至于无法使用。

应用层DDoS攻击特性

应用层(第7层/ HTTP)DDoS攻击由软件程序(机器人)执行,该软件程序可以定制为最佳利用特定系统的漏洞。例如,对于不能很好地处理大量并发连接的系统,仅通过周期性地发送少量流量打开大量连接并保持活动状态,可能会耗尽系统的新连接容量。其他攻击可以采取发送大量请求或非常大的请求的形式。由于这些攻击是由僵尸程序而不是实际用户执行的,因此攻击者可以轻松地打开大量连接并非常快速地发送大量请求。

DDoS攻击的特征可以用来帮助减轻这些攻击,包括以下内容(这并不意味着是一个详尽的列表):

-流量通常来自一组固定的IP地址,属于用于执行攻击的机器。因此,每个IP地址负责的连接和请求数量远远超出您对真实用户的期望。

注意:不要认为此流量模式总是代表DDoS攻击。转发代理的使用也可以创建这种模式,因为转发代理服务器的IP地址被用作来自它所服务的所有真实客户端的请求的客户端地址。但是,来自转发代理的连接数和请求数通常远低于DDoS攻击。

-由于流量是由机器人生成的,并且意味着压倒服务器,因此流量速率远高于人类用户可以生成的流量。

- User-Agent报头被设置有时到非标准值。

-该 Referer头有时设为您可以与攻击相关联的值。

使用NGINX和NGINX Plus来抵御DDoS攻击

NGINX和NGINX Plus具有许多功能,与上述的DDoS攻击特性相结合,可以使它们成为DDoS攻击缓解解决方案的重要组成部分。这些功能通过调节传入流量并通过控制流量代理后端服务器来解决DDoS攻击。

NGINX事件驱动架构的内在保护

NGINX旨在成为您的网站或应用程序的“减震器”。它具有非阻塞的事件驱动架构,可以应对大量请求,而不会明显增加资源利用率。

来自网络的新请求不会中断NGINX处理正在进行的请求,这意味着NGINX可以利用下面描述的技术来保护您的站点或应用免受攻击。

有关底层架构的更多信息,请参阅Inside NGINX:我们如何为性能和规模设计。

限制请求率

您可以将NGINX和NGINX Plus接收传入请求的速率限制为实际用户的典型值。例如,您可能会决定访问登录页面的真实用户每2秒只能发出一个请求。您可以配置NGINX和NGINX Plus,以允许单个客户端IP地址每2秒尝试登录(相当于每分钟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)。/login.html块中的 limit_req 指令引用共享内存区域。 location

有关速率限制的详细讨论,请参阅博客上的NGINX和NGINX Plus的速率限制。

限制连接数量

您可以限制单个客户端IP地址可以打开的连接数,也可以限制为适合真实用户的值。例如,您可以允许每个客户端IP地址打开不超过10个到您网站的/ store区域的连接:

limit_conn_zone $binary_remote_addr zOne=addr: 10m ; 
server { 
  
# ... 
 location /store/ { 
  limit_conn addr 10 ; 
   
# ... 
 } 
} 

该 limit_conn_zone 指令配置了一个名为addr的共享内存区域,用于存储指定密钥的请求,在这种情况下(如前例所示)客户端IP地址 $binary_remote_addr。在 limit_conn该指令 location为块/存储引用共享存储器区,并设置一个最大从每个客户端IP地址10个连接。

关闭慢速连接

您可以关闭正在写入数据的连接,这可能意味着尝试尽可能保持连接打开(从而降低服务器接受新连接的能力)。Slowloris就是这种攻击的一个例子。该 client_body_timeout指令控制NGINX在客户机体写入之间等待的时间,该 client_header_timeout 指令控制NGINX在写入客户机标题之间等待的时间。这两个指令的默认值是60秒。本示例将NGINX配置为在来自客户端的写入或头文件之间等待不超过5秒钟:

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

列入黑名单IP地址

如果您可以识别用于攻击的客户端IP地址,则可以使用该 deny指令将其列入黑名单,以便NGINX和NGINX Plus不接受其连接或请求。例如,如果您确定攻击来自地址范围123.123.123.1到123.123.123.16:

location / { 
 deny 123.123 . 123.0 / 28 ; 
  
# ... 
} 

或者,如果您确定攻击来自客户端IP地址123.123.123.3,123.123.123.5和123.123.123.7:

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

将白名单IP地址

如果仅允许从一个或多个特定组或范围的客户端IP地址访问您的网站或应用程序,则可以一起使用 allow和 deny指令以仅允许这些地址访问该站点或应用程序。例如,您可以限制只访问特定本地网络中的地址:

​

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

在这里, deny all指令阻止所有不在 allow指令指定的范围内的客户端IP地址。

使用缓存来平滑流量尖峰

您可以配置NGINX和NGINX Plus来吸收攻击导致的大量流量峰值,方法是启用缓存并设置某些缓存参数以卸载后端的请求。一些有用的设置是:

  • 该指令的 updating参数 proxy_cache_use_stale告诉NGINX,当它需要获取一个陈旧的缓存对象的更新时,它应该只发送一个更新请求,并且继续将陈旧对象提供给在接收时间期间请求它的客户端来自后端服务器的更新。当对某个文件的重复请求是攻击的一部分时,这会显着减少对后端服务器的请求数量。
  • 该 proxy_cache_key指令定义的键通常由嵌入式变量组成(缺省键 $scheme$proxy_host$request_uri,有三个变量)。如果该值包含 $query_string 变量,则发送随机查询字符串的攻击可能导致过度缓存。 $query_string除非您有特殊原因,否则我们建议您不要在变量中包含变量。

阻止请求

您可以配置NGINX或NGINX Plus来阻止几种请求:

  • 请求一个似乎有针对性的特定网址
  • User-Agent报头设置为与正常客户端流量不对应的值的请求
  • 将 Referer标头设置为可与攻击关联的值的请求
  • 其他头文件具有可与攻击关联的值的请求

例如,如果您确定DDoS攻击的目标是URL /foo.php,则可以阻止该页面的所有请求:

​location /foo.php { 
 deny all; 
} 

或者,如果您发现DDoS攻击请求的 User-Agent头部值为 foo或 bar,则可以阻止这些请求。

​location / { 
 if ($http_user_agent ~* foo|bar) { 
  return 403; 
 } 
 # ... 
} 

该变量引用一个请求头,在上面的例子中是头。类似的方法可以用于具有可用于识别攻击的值的其他报头。 http_*name*``User-Agent

限制到后端服务器的连接

NGINX或NGINX Plus实例通常可以处理比负载平衡的后端服务器更多的并发连接。使用NGINX Plus,您可以限制连接到每个后端服务器的数量。例如,如果要限制NGINX Plus与网站 上游组中的两个后端服务器建立的连接数不超过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参数指定在队列中保留请求的时间。

处理基于范围的攻击

一种攻击方法是发送一个 Range具有非常大值的标头,这可能导致缓冲区溢出。有关如何使用NGINX和NGINX Plus来缓解此类攻击的讨论,请参阅使用NGINX和NGINX Plus来保护CVE-2015-1635。

处理高负荷

DDoS攻击通常会导致高流量负载。有关调整NGINX或NGINX Plus以及允许系统处理更高负载的操作系统的提示,请参阅调整NGINX的性能。

识别DDoS攻击

到目前为止,我们专注于您可以使用NGINX和NGINX Plus来帮助减轻DDoS攻击的影响。但NGINX或NGINX Plus如何帮助您发现DDoS攻击呢?该NGINX加状态模块 提供了有关被负载后端服务器,你可以用它来发现异常流量模式平衡交通的详细指标。NGINX Plus附带了一个状态仪表板网页,以图形方式描述了NGINX Plus系统的当前状态(请参阅demo.nginx.com上的示例)。通过API也可以使用相同的指标,您可以使用它将指标提供给自定义或第三方监控系统,您可以在其中进行历史趋势分析以发现异常模式并启用警报。

参考

https://www.nginx.com/blog/mitigating-ddos-attacks-with-nginx-and-nginx-plus

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。


推荐阅读
  • 本文详细介绍了 InfluxDB、collectd 和 Grafana 的安装与配置流程。首先,按照启动顺序依次安装并配置 InfluxDB、collectd 和 Grafana。InfluxDB 作为时序数据库,用于存储时间序列数据;collectd 负责数据的采集与传输;Grafana 则用于数据的可视化展示。文中提供了 collectd 的官方文档链接,便于用户参考和进一步了解其配置选项。通过本指南,读者可以轻松搭建一个高效的数据监控系统。 ... [详细]
  • 用阿里云的免费 SSL 证书让网站从 HTTP 换成 HTTPS
    HTTP协议是不加密传输数据的,也就是用户跟你的网站之间传递数据有可能在途中被截获,破解传递的真实内容,所以使用不加密的HTTP的网站是不 ... [详细]
  • Cookie学习小结
    Cookie学习小结 ... [详细]
  • 本文详细介绍了Linux系统中用于管理IPC(Inter-Process Communication)资源的两个重要命令:ipcs和ipcrm。通过这些命令,用户可以查看和删除系统中的消息队列、共享内存和信号量。 ... [详细]
  • 为什么多数程序员难以成为架构师?
    探讨80%的程序员为何难以晋升为架构师,涉及技术深度、经验积累和综合能力等方面。本文将详细解析Tomcat的配置和服务组件,帮助读者理解其内部机制。 ... [详细]
  • JUC(三):深入解析AQS
    本文详细介绍了Java并发工具包中的核心类AQS(AbstractQueuedSynchronizer),包括其基本概念、数据结构、源码分析及核心方法的实现。 ... [详细]
  • PTArchiver工作原理详解与应用分析
    PTArchiver工作原理及其应用分析本文详细解析了PTArchiver的工作机制,探讨了其在数据归档和管理中的应用。PTArchiver通过高效的压缩算法和灵活的存储策略,实现了对大规模数据的高效管理和长期保存。文章还介绍了其在企业级数据备份、历史数据迁移等场景中的实际应用案例,为用户提供了实用的操作建议和技术支持。 ... [详细]
  • DVWA学习笔记系列:深入理解CSRF攻击机制
    DVWA学习笔记系列:深入理解CSRF攻击机制 ... [详细]
  • 在对WordPress Duplicator插件0.4.4版本的安全评估中,发现其存在跨站脚本(XSS)攻击漏洞。此漏洞可能被利用进行恶意操作,建议用户及时更新至最新版本以确保系统安全。测试方法仅限于安全研究和教学目的,使用时需自行承担风险。漏洞编号:HTB23162。 ... [详细]
  • 该大学网站采用PHP和MySQL技术,在校内可免费访问某些外部收费资料数据库。为了方便学生校外访问,建议通过学校账号登录实现免费访问。具体方案可包括利用学校服务器作为代理,结合身份验证机制,确保合法用户在校外也能享受免费资源。 ... [详细]
  • Java Socket 关键参数详解与优化建议
    Java Socket 的 API 虽然被广泛使用,但其关键参数的用途却鲜为人知。本文详细解析了 Java Socket 中的重要参数,如 backlog 参数,它用于控制服务器等待连接请求的队列长度。此外,还探讨了其他参数如 SO_TIMEOUT、SO_REUSEADDR 等的配置方法及其对性能的影响,并提供了优化建议,帮助开发者提升网络通信的稳定性和效率。 ... [详细]
  • 本文介绍了如何利用Struts1框架构建一个简易的四则运算计算器。通过采用DispatchAction来处理不同类型的计算请求,并使用动态Form来优化开发流程,确保代码的简洁性和可维护性。同时,系统提供了用户友好的错误提示,以增强用户体验。 ... [详细]
  • 普通树(每个节点可以有任意数量的子节点)级序遍历 ... [详细]
  • 兆芯X86 CPU架构的演进与现状(国产CPU系列)
    本文详细介绍了兆芯X86 CPU架构的发展历程,从公司成立背景到关键技术授权,再到具体芯片架构的演进,全面解析了兆芯在国产CPU领域的贡献与挑战。 ... [详细]
  • 使用ArcGIS for Java和Flex浏览自定义ArcGIS Server 9.3地图
    本文介绍了如何在Flex应用程序中实现浏览自定义ArcGIS Server 9.3发布的地图。这是一个基本的入门示例,适用于初学者。 ... [详细]
author-avatar
lily--妹妹
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有