当前位置 主页 > 服务器问题 > nginx问题汇总 >

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

    栏目:nginx问题汇总 时间:2018-09-12 11:22

    `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` 变量。

    7. 屏蔽特定的请求

    可以设置 Nginx、Nginx Plus 屏蔽一些类型的请求:

    针对特定 URL 的请求 针对不是常见的 User-Agent 的请求 针对 Referer 头中包含可以联想到攻击的值的请求 针对其他请求头中包含可以联想到攻击的值的请求

    比如,如果你判定攻击是针对一个特定的 URL:/foo.php,我们就可以屏蔽到这个页面的请求:

    location /foo.php { deny all; } 

    或者你判定攻击请求的 User-Agent 中包含 foo 或 bar,我们也可以屏蔽这些请求:

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

    http_name 变量引用一个请求头,上述例子中是 User-Agent 头。可以针对其他的 http 头使用类似的方法来识别攻击。

    8. 限制到后端服务器的连接数

    一个 Nginx、Nginx Plus 实例可以处理比后端服务器多的多的并发请求。在 Nginx Plus 中,你可以限制到每一个后端服务器的连接数,比如可以设置 Nginx Plus 与 website upstream 中的每个后端服务器建立的连接数不得超过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` 参数指定了请求在队列中的保留时间。