使用Nginx、Nginx Plus抵御DDOS攻击的方法

2019-10-17 17:37:02王振洲
limit_conn_zone $binary_remote_addr zone=addr:10m; 
server { 
... 
location /store/ { 
limit_conn addr 10; 
... 
} 
} 

`limit_conn_zone` 命令设置了一个叫 addr 的共享内存区来存储特定键值的状态,在上面的例子中是客户端 IP( $binary_remote_addr)。location 块中 `limit_conn` 通过引用 addr 共享内存区来限制到 /store/ 的最大连接数为10。

3. 关闭慢连接

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

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

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

4. 设置IP黑名单

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

location / { 
deny 123.123.123.0/28; 
... 
} 

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

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

5. 设置IP白名单

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

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

deny 命令会拒绝除了 allow 指定的 IP 段之外的所有其他 IP 的访问请求。

6. 使用缓存进行流量削峰

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

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