1.什么是DDOS

DDOS是英文Distributed Denial of Service的缩写,意即"分布式拒绝服务",DDOS的中文名叫分布式拒绝服务攻击,俗称洪水攻击。首先,我们来了解一下相关定义。? 

服务:系统提供的,用户在对其使用中会受益的功能? 

拒绝服务:任何对服务的干涉如果使其可用性降低或者失去可用性均称为拒绝服务。? 

拒绝服务攻击:是指攻击者通过某种手段,有意地造成计算机或网络不能正常运转从而不能向合法用户提供所需要的服务或者使得服务质量降低? 

分布式拒绝服务攻击:处于不同位置的多个攻击者同时向一个或者数个目标发起攻击,或者一个或多个攻击者控制了位于不同位置的多台机器并利用这些机器对受害者同时实施攻击,由于攻击的发出点是分布在不同地方的,这类攻击称为分布式拒绝服务攻击。 


2.防范方法

第一:高性能的防火墙产品,如思科,Juniper、NETGEAR等

第二:分流,前端的CDN等。


3.系统操作简单防范

以上产品均需要钱,如果没钱,恰好有人在攻击,可以通过以下方法简单防范:


3.1.内核优化

vi /etc/sysctl.conf 
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_max_orphans = 262144

生效:

sysctl -p

防御能力非常有限


3.2.防火墙控制

假如大量的地址在频繁请求,根据地址请求次数进行限制

日志内容:

# tail -1 /data/log/nginx/www.ckl.com.log    
192.168.1.5 test.ckl.com - [29/Apr/2016:05:28:05 +0800] "GET / HTTP/1.1" -304 0 1461878885.697 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36" "-" 475 0.000
.....

通过脚本来控制:

(通过查看日志,来收集访问IP,如果在一分钟内大于100则加入iptables限制)

vim ip_f.sh 
#!/bin/bash
LOG_FILE=/data/log/nginx/www.ckl.com.log
declare -i IP_NUM=(`cat ${LOG_FILE} | awk '{print $1}' | sort -t"." -k1 -k2 -k3 -k4 | uniq -c | sort -rn | head -n 1`)
NUM=${IP_NUM[0]}
IP=${IP_NUM[1]}
if [ ${NUM} -gt 100 ];then
        /sbin/iptables -I INPUT -p tcp -s ${IP} -j DROP
        /etc/init.d/iptables save
        > ${LOG_FILE}
fi

添加权限:

chmod +x ip_f.sh

添加计划任务:

*/1 * * * * /bin/bash /root/ip_f.sh

此种方法比较low如果大量访问iptables太长可能会死掉,也可能造成误杀。只是临时解决


3.3.nginx 链接限制及限速

在http段添加:

   limit_zone one $binary_remote_addr 10m;
   limit_req_zone  $binary_remote_addr zone=one:10m rate=1r/s;

增加全局限速:

server {
  location / {
       limit_conn one 3;
       limit_rate 100k;
  }
  
   location /search/ {
     limit_req zone=one burst=5;
  }
}

限制用户每秒的速度及连接数,这种方法也可能会造成误杀。


3.4.nginx 连接拒绝:

通过allow,deny,也是检查日志定期去检查,加入deny列表,比较笨拙


3.5.nginx 黑白名单

黑名单中的ip,将无法访问web服务。

白名单中的ip,访问web服务时,将不受nginx所有安全模块的限制。

支持动态黑名单,与ngx_http_limit_req 配合


大概如下:

black_list_conf conf/black.list zone=black:3m;
white_list_conf conf/black.list zone=white:3m;

自动黑白名单,自己未实现,有实现的朋友可以共享一下。


3.6.通过tcpwrapper控制

/etc/hosts.allow 和hosts.deny

此处控制登录,不能控制访问,随便加的


3.7.nginx 通过http_user_agent来匹配特征

访问:

http://test.ckl.com:81/

This is ckl !


查看日志:

188.1.12.13 - - [29/Apr/2016:15:24:48 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.75 Safari/537.36" -
188.1.12.13 - - [29/Apr/2016:15:25:26 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.75 Safari/537.36" -

做用户特征匹配,如果匹配,则返回404:

if ($http_user_agent ~* "Mozilla/5.0\ \(Windows\ NT\ 6.1\; WOW64\) AppleWebKit/537.36 \(KHTML, like Gecko\) Chrome/49.0.2623.75 Safari/537.36")
{
    return 404;
}


重新加载nginx

/etc/init.d/nginx reload


再次访问:

http://test.ckl.com:81/

404 Not Found


查看日志:

188.1.12.13 - - [29/Apr/2016:15:26:20 +0800] "GET / HTTP/1.1" 404 564 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.75 Safari/537.36" -
188.1.12.13 - - [29/Apr/2016:15:26:20 +0800] "GET / HTTP/1.1" 404 564 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.75 Safari/537.36" -

日志返回的404,此种方法可以临时缓解,推荐。

总的来说遇到DDOS无法从根本解决,分流和扩展架构才是最终解决手段,淘宝每天的访问都类似于DDOS攻击,其架构的设计几乎完美。