本文主要介绍了利用nginx处理DDOS进行系统优化的方法,非常详细,具有一定的参考价值。有兴趣的朋友一定要看!
前言
众所周知,DDoS非常常见,甚至被称为黑客圈的访问技巧;DDoS很厉害,几乎碾压一个网络。
DDOS的特点是分布式,针对带宽和服务攻击,即四层流量攻击和七层应用攻击,对应的防御瓶颈是四层带宽和七层多架构吞吐量。对于七层应用攻击,我们还是可以做一些配置来防御。比如前端是nginx,主要用Nginx的http_limit_conn和http_limit_req模块来防御。
什么是分布式拒绝服务(DDOS)就是分布式拒绝服务攻击。攻击者利用大量“肉鸡”向目标发起大量正常或异常请求,耗尽目标主机资源或网络资源,从而使被攻击人无法为合法用户提供服务。通常,攻击者会试图用如此多的连接使系统饱和,并要求它不能再接受新的流量或变得太慢而无法使用。
换句话说,老张的餐厅(被攻击的目标)可以同时接待100个顾客吃饭,隔壁老王(攻击者)雇佣200人(肉鸡),进入餐厅占据位置但不吃不喝(非正常要求),酒店拥挤(资源枯竭),但真正想吃的顾客进不去,酒店无法正常运营(达到DDoS攻击)。那么问题来了,老张该如何解决?
当然是了。滚出去!
通常,攻击者会试图用如此多的连接使系统饱和,并要求它不能再接受新的流量或变得太慢而无法使用。
应用层DDoS攻击特性
应用层(第7层/HTTP)DDoS攻击是由软件程序(机器人)执行的,可以进行定制,以充分利用特定系统的漏洞。例如,对于不能很好地处理大量并发连接的系统,通过定期发送少量流量来打开大量连接并保持其活动状态可能会耗尽系统的新连接容量。其他攻击可以采取发送大量请求或非常大的请求的形式。因为这些攻击是由机器人而不是实际用户执行的,所以攻击者可以很容易地打开大量连接,并非常快速地发送大量请求。
DDoS攻击的特征可用于帮助减轻这些攻击,包括以下内容(这并不是详尽的列表):
-流量通常来自一组固定的IP地址,属于用于执行攻击的机器。因此,每个IP地址负责的连接和请求比您对真实用户的预期要多。
注意:不应该认为这种流量模式总是代表分布式拒绝服务攻击。使用转发代理也可以创建这种模式,因为转发代理服务器的IP地址被用作它所服务的所有真实客户端的请求的客户端地址。然而,来自转发代理的连接和请求的数量通常比DDoS攻击少得多。
-因为流量是由机器人产生的,这意味着服务器,无法承受,所以流量率远远高于人类用户所能产生的流量。
用户代理头有时设置为非标准值。
-引用头有时被设置为一个可以与攻击相关联的值。
使用NGINX和NGINX Plus来抵御DDoS攻击
NGINX和NGINX Plus有很多功能。结合以上DDoS攻击特点,它们可以成为DDoS攻击缓解解决方案的重要组成部分。这些功能通过调节传入流量和控制流量代理的后端服务器来解决DDoS攻击。
NGINX事件驱动架构的内在保护
NGINX是为你的网站或应用设计的“减震器”。它具有非阻塞事件驱动的体系结构,可以处理大量请求,而不会显著增加资源利用率。
来自网络的新请求不会中断NGINX对正在进行的请求的处理,这意味着NGINX可以使用下面描述的技术来保护您的站点或应用程序免受攻击。
有关底层架构的更多信息,请参见Intering NGINX:我们如何设计性能和规模。
限制请求率
您可以将NGINX和NGINX Plus接收传入请求的速率限制为实际用户的典型值。例如,您可以决定访问登录页面的真实用户每2秒钟只能发出一个请求。您可以将NGINX和NGINX Plus配置为允许单个客户端IP地址每2秒钟尝试登录一次(相当于每分钟30个请求):
limit _ req _ zone $ binary _ remote _ addrzone=one :
10m
速率=
30r
/m;
服务器{
# .
location/login.html{
limit _ req zone=1;
# .
}
limit _ req _ zone指令配置了一个名为“one”的共享内存区域,用于存储指定密钥的请求状态,在本例中是客户端IP地址($binary_remote_addr)。/login.html块中的limit_req指令引用了一个共享内存区域。位置
关于限速的详细讨论,请参考博客上NGINX和NGINX Plus的限速。
限制连接数量
你可以
以限制单个客户端IP地址可以打开的连接数,也可以限制为适合真实用户的值。例如,您可以允许每个客户端IP地址打开不超过10个到您网站的/ store区域的连接:limit_conn_zone$binary_remote_addrzone=addr:10m; server{ #... location/store/{ limit_connaddr10; #... } }
该 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_timeout5s; client_header_timeout5s; #... }
列入黑名单IP地址
如果您可以识别用于攻击的客户端IP地址,则可以使用该 deny指令将其列入黑名单,以便NGINX和NGINX Plus不接受其连接或请求。例如,如果您确定攻击来自地址范围123.123.123.1到123.123.123.16:
location/{ deny123.123.123.0/28; #... }
或者,如果您确定攻击来自客户端IP地址123.123.123.3,123.123.123.5和123.123.123.7:
location/{ deny123.123.123.3; deny123.123.123.5; deny123.123.123.7; #... }
将白名单IP地址
如果仅允许从一个或多个特定组或范围的客户端IP地址访问您的网站或应用程序,则可以一起使用 allow和 deny指令以仅允许这些地址访问该站点或应用程序。例如,您可以限制只访问特定本地网络中的地址:
location/{ allow192.168.1.0/24; denyall; #... }
在这里, 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{ denyall; }
或者,如果您发现DDoS攻击请求的 User-Agent头部值为 foo或 bar,则可以阻止这些请求。
location/{ if($http_user_agent~*foo|bar){ return403; } #... }
该变量引用一个请求头,在上面的例子中是头。类似的方法可以用于具有可用于识别攻击的值的其他报头。 http_*name*``User-Agent
限制到后端服务器的连接
NGINX或NGINX Plus实例通常可以处理比负载平衡的后端服务器更多的并发连接。使用NGINX Plus,您可以限制连接到每个后端服务器的数量。例如,如果要限制NGINX Plus与网站 上游组中的两个后端服务器建立的连接数不超过200个:
upstreamwebsite{ server192.168.100.1:80max_conns=200; server192.168.100.2:80max_conns=200; queue10timeout=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也可以使用相同的指标,您可以使用它将指标提供给自定义或第三方监控系统,您可以在其中进行历史趋势分析以发现异常模式并启用警报。
以上是“利用nginx处理DDOS进行系统优化的方法”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注亿速云行业资讯频道!