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

2019-10-17 17:27:54丽君

使用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; 
  
# ... 
}