DDOS的全称是Distributed Denial of Service,即"分布式拒绝服务攻击",是指击者利用大量“肉鸡”对攻击目标发动大量的正常或非正常请求、耗尽目标主机资源或网络资源,从而使被攻击的主机不能为合法用户提供服务。linux
DDOS攻击的本质是:
利用木桶原理,寻找利用系统应用的瓶颈;阻塞和耗尽;当前问题:用户的带宽小于攻击的规模,噪声访问带宽成为木桶的短板。nginx
能够参考下面的例子理解下DDOS攻击。
1)某饭店能够容纳100人同时就餐,某日有个商家恶意竞争,雇佣了200人来这个饭店坐着不吃不喝,致使饭店满满当当没法正常营业。(DDOS攻击成功)
2)老板立即大怒,派人把不吃不喝影响正常营业的人全都轰了出去,且再也不让他们进来捣乱,饭店恢复了正常营业。(添加规则和黑名单进行DDOS防护,防护成功)
3)主动攻击的商家心存不满,此次请了五千人逐批次来捣乱,致使该饭店再次没法正常营业。(增长DDOS流量,改变攻击方式)
4)饭店把那些捣乱的人轰出去只后,另外一批接踵而来。此时老板将饭店营业规模扩大,该饭店可同时容纳1万人就餐,5000人同时来捣乱饭店营业也不会受到影响。(增长硬防与其抗衡)web
DDOS攻击只不过是一个概称,其下有各类攻击方式,好比:"CC攻击、SYN攻击、NTP攻击、TCP攻击、DNS攻击等等",如今DDOS发展变得愈来愈可怕,NTP服务放大攻击渐渐成为主流了,这意味着能够将每秒的攻击流量放大几百倍,好比每秒1G的SYN碎片攻击换成NTP放大攻击,就成为了200G或者更多。
--------------------------------------------------顺便介绍下NTP服务放大攻击--------------------------------------------------------shell
什么事NTP服务? 网络时间协议NTP(Network Time Protocol)是用于互联网中时间同步的标准互联网协议。NTP服务器经过NTP服务向网络上的计算机或其余设备提供标准的授时服务,以保证这些服务系统的时钟可以同步。一般NTP服务使用UDP 123端口提供标准服务。 什么是NTP服务放大攻击? 标准NTP 服务提供了一个 monlist查询功能,也被称为MON_GETLIST,该功能主要用于监控 NTP 服务器的服务情况,当用户端向NTP服务提交monlist查询时,NTP 服务器会向查询端返回与NTP 服务器进行过期间同步的最后 600 个客户端的 IP,响应包按照每 6 个 IP 进行分割,最多有 100 个响应包。因为NTP服务使用UDP协议,攻击者能够伪造源发地址向NTP服务进行monlist查询,这将致使NTP服务器向被伪造的目标发送大量的UDP数据包,理论上这种恶意导向的攻击流量能够放大到伪造查询流量的100倍。 NTP是用UDP传输的,因此能够伪造源地址。NTP协议中有一类查询指令,用短小的指令便可令服务器返回很长的信息,放大攻击就是基于这类指令的。 好比: 小明以吴一帆的名义问李雷"咱们班有哪些人?" ,李雷就回答吴一帆说"有谁谁谁和谁谁谁……"”"(几百字),那么小明就以8个字的成本,令吴一帆收到了几百字的信息,因此叫作放大攻击。 (也就是说:对方服务器是个话唠,你以小明的身份问他一个问题,他回答小明一千句,结果小明崩溃了) 网络上通常NTP服务器都有很大的带宽,攻击者可能只须要1Mbps的上传带宽欺骗NTP服务器,便可给目标服务器带来几百上千Mbps的攻击流量,达到借刀杀人的效果。 因此如今新的ntpd已经能够经过配置文件,关掉除时间同步之外的查询功能。而时间同步的查询和返回大小相同(没记错的话),因此没办法用做放大攻击。 如何查看是否遭受NTP放大攻击? 若是网络上检测到大流量的UDP 123端口的数据,就能够确认正在遭受此类攻击。 如何防范NTP放大攻击? 1)升级服务程序版本 将系统中的NTP服务升级到 ntpd 4.2.7p26 或以后的版本,由于 ntpd 4.2.7p26 版本后,服务默认是关闭monlist查询功能的。 2)关闭服务的monlist查询功能: 首先查询问题主机的REQ_MON_GETLIST和REQ_MON_GETLIST_1请求是否可用。具体操做方法: # ntpq -c rv<localhost/remotehost> # ntpdc -c sysinfo<localhost/remotehost> # ntpdc -n -c monlist<localhost/remotehost> 若是上述功能可用,可尝试经过修改ntp.conf文件解决问题,具体操做建议是在上述配置文件中增长下面的配置: IPV4: restrict default kod nomodify notrap nopeer noquery IPv6: restrict -6 default kod nomodify notrap nopeer noquery 容许发起时间同步的IP,与本服务器进行时间同步,可是不容许修改ntp服务信息,也不容许查询服务器的状态信息(如monlist)*/ 另外,还能够配置限制访问命令,如: restrict default noquery #容许普通的请求者进行时间同步,可是不容许查询ntp服务信息*/ 修改并保存配置文件以后,请重启ntpd服务。
-----------------------------------------------------------------------------------------------------------------------------------
近年来,一些重大的DDOS攻击案例:vim
1)2000年2月,包括雅虎、CNN、亚马逊、eBay、http://Buy.com、ZDNet,以及E*Trade和Datek等网站均遭受到了DDOS攻击,并导致部分网站瘫痪。 2)2007年5月,爱沙尼亚三周内遭遇三轮DDOS攻击,总统府、议会、几乎所有政府部门、主要政党、主要媒体和2家大银行和通信公司的网站均陷入瘫痪,为此北约顶级反网络恐怖主义专家前往该国救援。 3)2009年519断网事件致使南方六省运营商服务器所有崩溃,电信在南方六省的网络基本瘫痪。2009年7月,韩国主要网站三天内遭遇三轮猛烈的DDOS攻击,韩国宣布提早成立网络司令部。 4)比较著名的案例还有有: 全球三大游戏平台:暴雪战网、Valve Steam和EA Origin遭到大规模DDoS攻击,导致大批玩家没法登陆与进行游戏。随后名为DERP的黑客组织声称对这次大规模的DDoS攻击行动负责。
对于DDOS攻击的简单防御措施: centos
1)关闭没必要要的服务和端口; 2)限制同一时间内打开的syn半链接数目; 3)缩短syn半链接的超时时间; 4)及时安装系统补丁; 5)禁止对主机非开放服务的访问; 6)启用防火墙防DDOS属性。硬件防火墙价格比较昂贵,能够考虑利用Linux系统自己提供的防火墙功能来防护。 7)另外也能够安装相应的防御软件,这里强烈建议安装安全狗软件,防御性能不错,而且免费。 8)购买DDOS防护产品,好比阿里云盾的DDOS防护中的高防IP,这个使用起来,效果也很给力。
接下来讲下Linux系统下预防DDOS攻击的操做:安全
Linux服务器在运行过程当中可能会受到黑客攻击,常见的攻击方式有SYN,DDOS等。 经过更换IP,查找被攻击的站点可能避开攻击,可是中断服务的时间比较长。比较完全的解决方法是添置硬件防火墙,可是硬件防火墙价格比较昂贵。能够考虑利用Linux系统自己提供的防火墙功能来防护。 SYN攻击是利用TCP/IP协议3次握手的原理,发送大量的创建链接的网络包,但不实际创建链接,最终致使被攻击服务器的网络队列被占满,没法被正经常使用户访问。 Linux内核提供了若干SYN相关的配置,加大SYN队列长度能够容纳更多等待链接的网络链接数,打开SYN Cookie功能能够阻止部分SYN攻击,下降重试次数也有必定效果。 而DDOS则是经过使网络过载来干扰甚至阻断正常的网络通信,经过向服务器提交大量请求,使服务器超负荷,阻断某一用户访问服务器阻断某服务与特定系统或我的的通信。能够经过配置防火墙或者使用脚本工具来防范DDOS攻击;
1)优化几个sysctl内核参数:bash
[root@test3-237 ~]# vim /etc/sysctl.conf ...... net.ipv4.tcp_max_syn_backlog = 4096 #表示SYN队列的长度,加大队列长度能够容纳更多等待链接的网络链接数 net.ipv4.tcp_syncookies = 1 #表示开启SYN Cookies功能。当出现SYN等待队列溢出时,启用cookies来处理,可防范少许SYN攻击,默认为0,表示关闭,1表示打开; net.ipv4.tcp_synack_retries = 2 #下面这两行表示定义SYN重试次数 net.ipv4.tcp_syn_retries = 2 #提升TCP链接能力 net.ipv4.tcp_rmem = 32768 net.ipv4.tcp_wmem = 32768 net.ipv4.tcp_sack = 0 #打开tcp_sack功能,1表示"关闭",0表示"打开" ...... [root@test3-237 ~]# sysctl -p #使上面配置生效
2)利用linux系统自带iptables防火墙进行预防:服务器
先查看服务器上链接web端口(好比80端口)的哪一个ip是最多的,若是发现可疑ip,就果断将其断开与服务器链接 查看80端口的链接状况 [root@test3-237 ~]# netstat -an | grep ":80" | grep ESTABLISHED 下面的命令表示获取服务器上ESTABLISHED链接数最多的前10个ip,排除了内部ip段192.168|127.0开头的。 [root@test3-237 ~]# /bin/netstat -na|grep ESTABLISHED|awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -rn|head -10|grep -v -E '192.168|127.0' 4001 140.205.140.205 2388 124.65.197.154 1807 111.205.224.15 18 10.51.58.16 ....... 将上面140.205.140.20五、124.65.197.15四、111.205.224.15的这三个ip的包丢弃 [root@test3-237 ~]# iptables -A INPUT -s 140.205.140.205 -p tcp -j DROP [root@test3-237 ~]# iptables -A INPUT -s 124.65.197.154 -p tcp -j DROP [root@test3-237 ~]# iptables -A INPUT -s 111.205.224.15 -p tcp -j DROP [root@test3-237 ~]# service iptables save [root@test3-237 ~]# service iptables restart 不过上面的方法对于伪造源IP地址的SYN FLOOD攻击就无效了! -------------------------------------其余预防攻击的设置------------------------------------- 防止同步包洪水(Sync Flood),缩短SYN-Timeout时间: [root@test3-237 ~]# iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT [root@test3-237 ~]# iptables -A INPUT -i eth0 -m limit --limit 1/sec --limit-burst 5 -j ACCEPT 其中: --limit 1/s 限制syn并发数每秒1次,能够根据本身的须要修改防止各类端口扫描 [root@test3-237 ~]# iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT Ping洪水攻击(Ping of Death) [root@test3-237 ~]# iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT 控制单个IP的最大并发链接数。 以下设置表示:容许单个IP的最大链接数为 30 [root@test3-237 ~]# iptables -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 30 -j REJECT 控制单个IP在必定的时间(好比60秒)内容许新创建的链接数。 以下设置表示:单个IP在60秒内只容许最多新建30个链接 [root@test3-237 ~]# iptables -A INPUT -p tcp --dport 80 -m recent --name BAD_HTTP_ACCESS --update --seconds 60 --hitcount 30 -j REJECT [root@test3-237 ~]# iptables -A INPUT -p tcp --dport 80 -m recent --name BAD_HTTP_ACCESS --set -j ACCEPT --------------------------------------------------------------------------------------------------- 若是出现报错: iptables: Invalid argument. Run `dmesg' for more information. 解决办法: 增长 xt_recent模块的参数值便可,默认是20 [root@test3-237 ~]# cat /sys/module/xt_recent/parameters/ip_pkt_list_tot 20 [root@test3-237 ~]# echo 50 > /sys/module/xt_recent/parameters/ip_pkt_list_tot [root@test3-237 ~]# cat /sys/module/xt_recent/parameters/ip_pkt_list_tot 50 --------------------------------------------------------------------------------------------------- 禁止ping(即禁止从外部ping这台服务器): [root@test3-237 ~]# echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all 用iptables屏蔽IP(以下禁止213.8.166.237链接本机的80端口) [root@test3-237 ~]# iptables -A INPUT -s 213.8.166.227 -p tcp -m tcp -m state --state NEW --dport 80 --syn -j REJECT 容许某ip链接(以下容许13.78.66.27链接本机的80端口) [root@test3-237 ~]# iptables -A INPUT -s 13.78.66.27 -p tcp -m tcp -m state --state NEW --dport 80 --syn -j ACCEPT
3)使用DDoS deflate脚本自动屏蔽攻击ip cookie
DDoS deflate是一款免费的用来防护和减轻DDoS攻击的脚本。它经过netstat监测跟踪建立大量网络链接的IP地址,在检测到某个结点超过预设的限制时,该程序会经过APF或IPTABLES禁止或阻挡这些IP. DDoS deflate实际上是一个Shell脚本,使用netstat和iptables工具,对那些连接数过多的IP进行封锁,能有效防止通用的恶意扫描器,但它并非真正有效的DDoS防护工具。 DDoS deflate工做过程描述: 同一个IP连接到服务器的链接数到达设置的伐值后,全部超过伐值的IP将被屏蔽,同时把屏蔽的IP写入ignore.ip.list文件中,与此同时会在tmp中生成一个脚本文件,这个脚本文件立刻被执行,可是一 运行就遇到sleep预设的秒,当睡眠了这么多的时间后,解除被屏蔽的IP,同时把以前写入ignore.ip.list文件中的这个被封锁的IP删除,而后删除临时生成的文件。 一个事实:若是被屏蔽的IP手工解屏蔽,那么若是这个IP继续产生攻击,那么脚本将不会再次屏蔽它(由于加入到了ignore.ip.list),直到在预设的时间以后才能起做用,加入到了ignore.ip.list中的 IP是检测的时候忽略的IP。能够把IP写入到这个文件以免这些IP被堵塞,已经堵塞了的IP也会加入到ignore.ip.list中,但堵塞了预约时间后会从它之中删除。 如何确认是否受到DDOS攻击? [root@test3-237 ~]# netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n 1 Address 1 servers) 2 103.10.86.5 4 117.36.231.253 4 19.62.46.24 6 29.140.22.18 8 220.181.161.131 2911 167.215.42.88 每一个IP几个、十几个或几十个链接数都还算比较正常,若是像上面成百上千确定就不正常了。好比上面的167.215.42.88,这个ip的链接有2911个!这个看起来就很像是被攻击了! 下面就说下经过DDoS deflate脚原本自动屏蔽DDOS攻击的ip 1)下载DDoS deflate安装脚本,并执行安装。 [root@test3-237 ~]# wget http://www.inetbase.com/scripts/ddos/install.sh [root@test3-237 ~]# chmod 0700 install.sh [root@test3-237 ~]# ./install.sh -------------------------------------------------------------------------- 卸载DDos default的操做以下: # wget http://www.inetbase.com/scripts/ddos/uninstall.ddos # chmod 0700 uninstall.ddos # ./uninstall.ddos -------------------------------------------------------------------------- 2)配置DDoS deflate下面是DDoS deflate的默认配置位于/usr/local/ddos/ddos.conf ,内容以下: [root@test3-237 ~]# cat /usr/local/ddos/ddos.conf ##### Paths of the script and other files PROGDIR="/usr/local/ddos" PROG="/usr/local/ddos/ddos.sh" IGNORE_IP_LIST="/usr/local/ddos/ignore.ip.list" //IP地址白名单 CRON="/etc/cron.d/ddos.cron" //定时执行程序 APF="/etc/apf/apf" IPT="/sbin/iptables" ##### frequency in minutes for running the script ##### Caution: Every time this setting is changed, run the script with --cron ##### option so that the new frequency takes effect FREQ=1 //检查时间间隔,默认1分钟。设置检测时间间隔,默认是分钟,因为系统使用crontab功能,最小单位是分钟 ##### How many connections define a bad IP? Indicate that below. NO_OF_CONNECTIONS=150 //最大链接数,超过这个数IP就会被屏蔽,通常默认便可。默认是150,这是一个经验值,若是服务器性能比较高,能够设置200以上,以免误杀 ##### APF_BAN=1 (Make sure your APF version is atleast 0.96) ##### APF_BAN=0 (Uses iptables for banning ips instead of APF) APF_BAN=0 //使用APF仍是iptables屏蔽IP。推荐使用iptables,将APF_BAN的值改成0便可。设置为1表示使用APF,若是使用APF则须要先安装,centos中默认就没有安装 ##### KILL=0 (Bad IPs are'nt banned, good for interactive execution of script) ##### KILL=1 (Recommended setting) KILL=1 //是否屏蔽IP,默认便可 ##### An email is sent to the following address when an IP is banned. ##### Blank would suppress sending of mails EMAIL_TO="root" //当IP被屏蔽时给指定邮箱发送邮件,推荐使用,换成本身的邮箱便可。若是不但愿发送邮件,设置为空,即EMAIL_TO="" ##### Number of seconds the banned ip should remain in blacklist. BAN_PERIOD=600 //禁用IP时间(锁定ip的时间),默认600秒,可根据状况调整 须要注意的是: DDos default安装完成后在/usr/local/ddos目录下产生了ddos.conf、ddos.sh、ignore.ip.list和LICENSE这四个文件,其中: ddos.conf是配置文件,ddos.sh是一个Shell文件,ignore.ip.list是存放忽略IP的文件,LICENSE是版权声明文件,安装完成后还在/etc/cron.d/下生产了ddos.cron文件,内容以下: [root@test3-237 ~]# cat /etc/cron.d/ddos.cron SHELL=/bin/sh 0-59/1 * * * * root /usr/local/ddos/ddos.sh >/dev/null 2>&1 意思是每隔一分钟执行一下/usr/local/ddos/ddos.sh,这个脚本是关键! 这个cron任务是依赖ddos.conf文件中的NO_OF_CONNECTIONS变量产生的,若是修改了此值,能够经过运行以下命令更新(实际也是在安装是运行了以下命令): [root@test3-237 ~]# /usr/local/ddos/ddos.sh -c Stopping crond: [ OK ] Starting crond: [ OK ] Stopping crond: [ OK ] Starting crond: [ OK ] 或者 [root@test3-237 ~]# /usr/local/ddos/ddos.sh --cron Stopping crond: [ OK ] Starting crond: [ OK ] Stopping crond: [ OK ] Starting crond: [ OK ] 3)DDos default选项 # /usr/local/ddos/ddos.sh -h #查看选项 # /usr/local/ddos/ddos.sh -k n #杀掉链接数大于n的链接。n默认为配置文件的NO_OF_CONNECTIONS 好比: [root@test3-237 ~]# /usr/local/ddos/ddos.sh -k 150 2 103.110.186.75 1 servers) 1 Address # /usr/local/ddos/ddos.sh -c #按照配置文件建立一个执行计划。使得ddos.conf文件配置后生效
4)分享一个防护DDOS攻击的shell脚本
Linux服务器中一旦受到DDOS的攻击(好比IDC机房服务器被攻击了,关机,拔网线,降流量),目前只能经过封IP来源来暂时解决。 然而IP来源变化无穷,光靠手工来添加简直是恶梦,因此仍是想办法写个shell脚原本定时处理,这才是比较靠谱的办法。 [root@test3-237 ~]# mkdir /root/bin [root@test1-237 ~]# cat /root/bin/dropip.sh //此脚本自动提取攻击ip,而后自动屏蔽 #!/bin/bash /bin/netstat -na|grep ESTABLISHED|awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -rn|head -10|grep -v -E '192.168|127.0'|awk '{if ($2!=null && $1>4) {print $2}}'>/tmp/dropip for i in $(cat /tmp/dropip) do /sbin/iptables -A INPUT -s $i -j DROP echo “$i kill at `date`”>>/var/log/ddos done 以上脚本中最重要的是第二行,即: 获取ESTABLISHED链接数最多的前10个ip并写入临时文件/tmp/dropip,排除了内部ip段192.168|127.0开头的.经过for循环将dropip里面的ip经过iptables所有drop掉,而后写到日志文件/var/log/ddos。 给脚本添加执行权限 [root@test1-237 ~]# chmod +x /root/bin/dropip.sh 添加到计划任务,每分钟执行一次 [root@test1-237 ~]#crontab -e */1 * * * * /root/bin/dropip.sh ---------------------------------------------------------------------------------------- 下面是针对链接数屏蔽IP #!/bin/sh /bin/netstat -ant |grep 80 |awk '{print $5}' |awk -F":" '{print $1}' |sort |uniq -c |sort -rn |grep -v -E '192.168|127.0' |awk '{if ($2!=null && $1>50)}' > /root/drop_ip.txt for i in `cat /root/drop_ip.txt` do /sbin/iptables -I INPUT -s $i -j DROP; done
5)Linux下使用safedog(安全狗)软件防护DDOS攻击:
[root@test3-237 ~]# setenforce 0 //关闭selinux,不然不能安装成功 [root@test3-237 ~]# getenforce //永久关闭selinux须要配置/etc/sysconfig/selinux文件,并重启机器生效!! Permissive 安装(nginx版)安全狗(safedog) [root@test3-237 ~]# wget http://safedog.cn/safedogwz_linux_Nginx64.tar.gz [root@test3-237 ~]# tar -zvxf safedogwz_linux_Nginx64.tar.gz [root@test3-237 ~]# cd safedogwz_linux_Nginx64 [root@test3-237 safedogwz_linux_Nginx64]# chmod 755 install.py [root@bastion-IDC safedogwz_linux_Nginx64]# ls install_files install.py uninstall.py [root@test3-237 safedogwz_linux_Nginx64]# ./install.py -A //卸载安全狗就用uninstall.py ....... step 3.5, start service... [ok] step 3.6, save safedog install info... [ok] Tips: (1)Run the command to setup Server Defense Module: sdui (2)Explore more features by tapping the command to join Cloud Management Center (fuyun.safedog.cn) with your account: sdcloud -h If you need any help about installation,please tap the command: ./install.py -h Install Completely! 舒适提示: 1)安装完成后,记得必定要从新启动Nginx服务,网站安全狗软件便可生效。 2)运行时,安装脚本默认将自动获取Nginx服务的安装路径;若自动获取失败则将提示输入Nginx服务的安装路径(绝对路径),须要根据所安装的Nginx的目录,填写真实的安装路径。 3)当出现提示:Are you sure to uninstall?[y/n]时,输入y