使用Nginx、Nginx Plus防止服务器DDoS攻击

分布式拒绝服务攻击(DDoS)指的是经过多台机器向一个服务或者网站发送大量看似合法的数据包使其网络阻塞、资源耗尽从而不能为正经常使用户提供正常服务的攻击手段。随着互联网带宽的增长和相关工具的不断发布,这种攻击的实施难度愈来愈低,有大量IDC托管机房、商业站点、游戏服务商一直饱受DDoS攻击的困扰,那么如何缓解甚至解决DDoS呢?最近Rick Nelson在Nginx的官方博客上发表了一篇文章,介绍了如何经过Nginx和Nginx Plus缓和DDoS攻击php

Rick Nelson首先介绍了DDoS攻击的一些特色,例如攻击的流量一般来源于一些固定的IP地址,每个IP地址会建立比真实用户多得多的链接和请求;同时因为流量所有是由机器产生的,其速率要比人类用户高的多。此外,进行攻击的机器其User-Agent头也不是标准的值,Referer头有时也会被设置成可以与攻击关联起来的值。针对这些特色,Rick Nelson认为Nginx和Nginx Plus有不少可以经过调节或控制流量来应对或者减轻DDoS攻击的特性。html

限制请求率 将Nginx和Nginx Plus可接受的入站请求率限制为某个适合真实用户的值。例如,经过下面的配置让一个真正的用户每两秒钟才能访问一次登陆页面:nginx

limit_req_zone $binary_remote_addr zone=one:10m rate=30r/m;

server {
    ...
    location /login.html {
        limit_req zone=one;
    ...
    }
}

在该配置中, limit_req_zone指令配置了一个名为 one的共享内存 zone用来存储$binary_remote_addr的请求状态,location块中/login.html的 limit_req指令引用了共享内存zoneweb

限制链接的数量 将某个客户端IP地址所能打开的链接数限制为真实用户的合理值。例如,限制每个IP对网站/store部分打开的链接数不超过10个:后端

limit_conn_zone $binary_remote_addr zone=addr:10m;

server {
    ...
    location /store/ {
        limit_conn addr 10;
        ...
    }
}

该配置中, limit_conn_zone指令配置了一个名为 addr的共享内存 zone用来存储 $binary_remote_addr的请求,location块中/store/的 limit_conn指令引用了共享内存zone,并将最大链接数设置为10.缓存

关闭慢链接 关闭那些一直保持打开同时写数据又特别频繁的链接,由于它们会下降服务器接受新链接的能力。Slowloris就是这种类型的攻击。对此,能够经过 client_body_timeoutclient_header_timeout指令控制请求体或者请求头的超时时间,例如,经过下面的配置将等待时间控制在5s以内:服务器

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

设置IP黑名单 若是能识别攻击者所使用的客户端IP地址,那么经过 deny指令将其屏蔽,让Nginx和Nginx Plus拒绝来自这些地址的链接或请求。例如,经过下面的指令拒绝来自123.123.123.三、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地址比较固定,那么经过 allowdeny指令让网站或者应用程序只接受来自于某个IP地址或者某个IP地址段的请求。例如,经过下面的指令将访问限制为本地网络的一个IP段:分布式

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

经过缓存削减流量峰值 经过启用缓存并设置某些缓存参数让Nginx和Nginx Plus吸取攻击所产生的大部分流量峰值。例如,经过 proxy_cache_use_stale指令的 updating参数告诉Nginx什么时候须要更新过时的缓存对象,避免因重复发送更新请求对后端服务器产生压力。另外, proxy_cache_key指令定义的键一般会包含嵌入的变量,例如默认的键 $scheme$proxy_host$request_uri包含了三个变量,若是它包含 $query_string变量,那么攻击者能够经过发送随机的 query_string值来耗尽缓存,所以,若是没有特别缘由,不要在该键中使用 $query_string变量。工具

阻塞请求 配置Nginx和Nginx Plus阻塞如下类型的请求:

  • 以某个特定URL为目标的请求
  • User-Agent头中的值不在正常客户端范围以内的请求
  • Referer头中的值可以与攻击关联起来的请求
  • 其余头中存在可以与攻击关联在一块儿的值的请求

例如,经过下面的配置阻塞以/foo.php为目标的攻击:

location /foo.php {
    deny all;
}

或者经过下面的配置阻塞已识别出的User-Agent头的值是foo或者bar的DDoS攻击:

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

限制对后端服务器的链接数 一般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;
}

另外,Rick Nelson还提到了如何处理基于范围的攻击如何处理高负载的问题,以及如何使用Nginx Plus Status模块发现异常的流量模式,定位DDoS攻击。

相关文章
相关标签/搜索