DDOS介绍
DDOS的全称是Distributed Denial of Service,即"分布式拒绝服务攻击",是指击者利用大量“肉鸡”对攻击目标发动大量的正常或非正常请求、耗尽目标主机资源或网络资源,从而使被攻击的主机不能为合法用户提供服务。
DDOS攻击的本质是:
利用木桶原理,寻找利用系统应用的瓶颈;阻塞和耗尽;当前问题:用户的带宽小于攻击的规模,噪声访问带宽成为木桶的短板。
可以参考下面的例子理解下DDOS攻击。
1)某饭店可以容纳100人同时就餐,某日有个商家恶意竞争,雇佣了200人来这个饭店坐着不吃不喝,导致饭店满满当当无法正常营业。(DDOS攻击成功)
2)老板当即大怒,派人把不吃不喝影响正常营业的人全都轰了出去,且不再让他们进来捣乱,饭店恢复了正常营业。(添加规则和黑名单进行DDOS防御,防御成功)
3)主动攻击的商家心存不满,这次请了五千人逐批次来捣乱,导致该饭店再次无法正常营业。(增加DDOS流量,改变攻击方式)
4)饭店把那些捣乱的人轰出去只后,另一批接踵而来。此时老板将饭店营业规模扩大,该饭店可同时容纳1万人就餐,5000人同时来捣乱饭店营业也不会受到影响。(增加硬防与其抗衡)
DDOS攻击只不过是一个概称,其下有各种攻击方式,比如:“CC攻击、SYN攻击、NTP攻击、TCP攻击、DNS攻击等等”,现在DDOS发展变得越来越可怕,NTP服务放大攻击渐渐成为主流了,这意味着可以将每秒的攻击流量放大几百倍,比如每秒1G的SYN碎片攻击换成NTP放大攻击,就成为了200G或者更多。
DDoS攻击的类型
第一种类型:CC类攻击
命令:netstat –na,
若观察到大量的ESTABLISHED的连接状态 单个IP高达几十条甚至上百条
第二种类型:SYN类攻击
命令::netstat –na,
若观察到大量的SYN_RECEIVED的连接状态
第三种类型:UDP类攻击
观察网卡状况 每秒接受大量的数据包
网络状态:netstat –na TCP信息正常
第四种类型:TCP洪水攻击
命令:netstat –na,
网站受到DDoS攻击的表现
1.服务器CPU被大量占用
2.带宽被大量占用
3.服务器连接不到,网站也打不开
4.域名ping不出IP
第一种类型:CC类攻击
命令:netstat –na,
若观察到大量的ESTABLISHED的连接状态 单个IP高达几十条甚至上百条
第二种类型:SYN类攻击
命令::netstat –na,
若观察到大量的SYN_RECEIVED的连接状态
第三种类型:UDP类攻击
观察网卡状况 每秒接受大量的数据包
网络状态:netstat –na TCP信息正常
第四种类型:TCP洪水攻击
命令:netstat –na,
若观察到大量的ESTABLISHED的连接状态 单个IP高达几十条甚至上百条
以上就是网站受DDoS攻击的表现以及查看方法的相关介绍,对于网站运营来说,DDoS的影响非常大,甚至如果出现经常性的DDoS攻击时,可能还会对网站有摧毁性的危险性,因而站长们要对防DDoS需要更多的重视,一旦网站出现受DDoS攻击的表现时,立即采取必要的防御手段
NTP服务放大攻击
什么事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攻击的简单防护措施: **
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内核参数:
[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.205、124.65.197.154、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 **
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
使用iptables缓解DDOS及CC攻击
缓解DDOS攻击
防止SYN攻击,轻量级预防
#iptables -N syn-flood
#iptables -A INPUT -p tcp –syn -j syn-flood
#iptables -I syn-flood -p tcp -m limit –limit 3/s –limit-burst 6 -j RETURN
#iptables -A syn-flood -j REJECT
防止DOS太多连接进来,可以允许外网网卡每个IP最多15个初始连接,超过的丢弃
#iptables -A INPUT -i eth0 -p tcp –syn -m connlimit –connlimit-above 15 -j DROP
#iptables -A INPUT -p tcp -m state –state ESTABLISHED,RELATED -j ACCEPT
用Iptables缓解DDOS (参数与上相同)
#iptables -A INPUT -p tcp --syn -m limit --limit 12/s --limit-burst 24 -j ACCEPT
#iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT
缓解CC攻击
当apache站点受到严重的cc攻击,我们可以用iptables来防止web服务器被CC攻击,自动屏蔽攻击IP。
1.系统要求
- (1)LINUX
内核版本:2.6.9-42ELsmp或2.6.9-55ELsmp(其它内核版本需要重新编译内核,比较麻烦,但是也是可以实现的)。 - (2)iptables版本:1.3.7
2、安装
安装iptables1.3.7和系统内核版本对应的内核模块kernel-smp-modules-connlimit
配置相应的iptables规则
示例如下:
(1)控制单个IP的最大并发连接数
iptables -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 25 -j REJECT #允许单个IP的最大连接数为25个
早期iptables模块不包含connlimit,需要自己单独编译加载,请参考该地址http://sookk8.blog.51cto.com/455855/280372 不编译内核加载connlimit模块
(2)控制单个IP在一定的时间(比如60秒)内允许新建立的连接数
#iptables -A INPUT -p tcp --dport 80 -m recent --name BAD_HTTP_ACCESS --update --seconds 60 --hitcount 30 -j REJECT
#iptables -A INPUT -p tcp --dport 80 -m recent --name BAD_HTTP_ACCESS --set -j ACCEPT
单个IP在60秒内只允许最多新建30个连接
实时查看模拟攻击客户机建立起来的连接数
watch 'netstat -an | grep:21 | grep <攻击IP>| wc -l
查看模拟攻击客户机被 DROP 的数据包数
watch 'iptables -L -n -v | grep <攻击IP>
分享一个实用的shell脚本–实现DDOS攻击自动封禁IP
摘要: 概述今天分享一个Shell脚本,主要是用来解决DDOS攻击的简单版。需求请根据web日志或者或者网络连接数,监控当某个IP并发连接数或者短时内PV达到100,即调用防火墙命令封掉对应的IP。防火墙命令为:iptables-I INPUT -s IP地址 -j DROP。练习使用日志下载地址:https://files.cnblogs.com/files/clsn/ac …
需求
请根据web日志或者或者网络连接数,监控当某个IP并发连接数或者短时内PV达到100,即调用防火墙命令封掉对应的IP。
防火墙命令为:iptables-I INPUT -s IP地址 -j DROP。
练习使用日志下载地址:https://files.cnblogs.com/files/clsn/access-web-log.zip
脚本实现
#!/bin/bash
#############################################################
# File Name: ddos_check.sh
#############################################################
Info_File=/tmp/ddos_check.log
#从连接数获取
#netstat -lant|awk -F "[ :]+" '/180:80/{clsn[$6]++}END{for(pol in clsn)print pol,clsn[pol]}' >$Info_File
# 从日志获取
awk '{hotel[$1]++}END{for(pol in hotel)print pol,hotel[pol]}' access.log|sort -nk2 -r >$Info_File
while read line
do
Ip_Add=`echo $line |awk '{print $1}'`
Access=`echo $line |awk '{print $2}'`
if [ $Access -ge 10000 ]
then
#echo $Ip_Add
iptables -I INPUT -s $Ip_Add -j DROP
fi
done <$Info_File
脚本执行结果
./ddos_check.sh
iptables -L
ddos攻击防御之使用nginx
ddos 攻击是最常见的web攻击了,原理非常简单,用自己的电脑模拟大量用户发送大量请求,apache 的 ab 压力测试工具就可以做到这一点,如果我这样做,而对方的服务器配置没有我电脑好,那么一会之后,对方的服务器就难以响应其他用户的请求,如果我控制了大量肉鸡并使用这些肉鸡发送请求,结果可想而知。
我假设你使用 nginx 或者其衍生版,那么,你可以通过简单的几行配置有效防御这种攻击,现在,我们步入正文,首先编辑 nginx.conf 在 http 里面添加下面两行,最终大致如下:
http {
limit_req_zone $binary_remote_addr zone=blog:10m rate=10r/s;
limit_conn_zone $binary_remote_addr zone=addr:10m;
}
这里我忽略了其他配置,第一行 limit_req_zone $binary_remote_addr zone=blog:10m rate=10r/s; 这里定义了一个名字为blog的会话区域,速度是10次每秒,你也可以使用600r/m 表示每分钟600次,但是没有每小时的限制哦,只有分钟与秒的限制,且为整数。但仅仅这样配置并不起作用,还需要在location里添加配置,如下:
location / {
limit_conn addr 7;
limit_req zone=blog burst=7 nodelay;
}
这里,burst 表示突发之意,blog 指定了要使用的请求会话区域,可以理解为平均每秒钟可以有10次请求,但是突发情况下允许每秒多增7个请求,且不延迟,超过7个则503,你也可以将nodelay删除,那么,如果你一秒内发送了20个请求过去,前10个是允许的,后面7个被延迟处理,最后的3个503,如果加了nodelay则是前17个立即处理,后面3个503,现在,我们来说下 limit_conn_zone $binary_remote_addr zone=addr:10m; 这行创建了10m的会话区域addr,存储的是连接数,不是请求数。limit_conn addr 7; 这句指定了使用addr 连接存储区域,且最多是7个。下面我举个栗子。
假设你们办公室公用一个IP,其实现在IP4即将枯竭,很多小区都是共享IP的,那么,addr 7表示,连接数不超过7,比如你们同时有7个设备访问这是OK的,但如果超过7台后被限制。而这7台设备每秒限制17次,超过就503,但是过一会就又可以继续访问,这种方案固然可以,但是实际作用也不够有力,假设某个IP一直请求,无视你的503,那么它就能一直继续请求下去,即使很明显这是攻击也无济于事,nginx的配置只能是过滤掉无用的请求,形成稳定的流量。如果你想一段时间内被限制超过了5次,就拉黑几分钟,那么可以看看这篇: fail2ban – 防御cc攻击利器,为什么要拉黑呢,因为nginx也是有压力的,比如这里的10m存储区域,另外,nginx返回503,请求不是没成功,只是没有转发给你的业务应用,nginx的压力依旧存在,大量请求过来,完全可能导致nginx瘫痪,这种限制只是保护了nginx后面的应用而已,当然nginx的并发性能很屌,这样处理也是OK的,但不代表nginx就不能被弄瘫痪,最好的办法是发现是明显攻击后将ip拉黑,可以动态的处理,比如拉黑几分钟、几十分钟、几小时等等。而这些fail2ban可以做到,你可以参考我之前给你的链接。
最后,我们讨论下这里的10M,你可以参考 nginx官方文档,文档最后面有这么几句话:
Here, the states are kept in a 10 megabyte zone “one”, and an average request processing rate for this zone cannot exceed 1 request per second.
A client IP address serves as a key. Note that instead of $remote_addr, the $binary_remote_addr variable is used here. The $binary_remote_addr variable’s size is always 4 bytes for IPv4 addresses or 16 bytes for IPv6 addresses. The stored state always occupies 64 bytes on 32-bit platforms and 128 bytes on 64-bit platforms. One megabyte zone can keep about 16 thousand 64-byte states or about 8 thousand 128-byte states.
If the zone storage is exhausted, the least recently used state is removed. Even if after that a new state cannot be created, the request is terminated with an error.
大致意思是:
这里状态保存在10M大的区域one里面,这个区域里平均请求处理速度不超过每秒1个请求。
客户端地址作为key键,请注意,这里并没有使用 $remote_addr 而是使用了 b i n a r y r e m o t e a d d r 变 量 , 一 个 i p 4 地 址 的 binary_remote_addr 变量,一个ip4地址的 binaryremoteaddr变量,一个ip4地址的binary_remote_addr 变量的大小是4字节,ip6是16个字节。存储状态在32位操作系统上占用64个字节,在64位系统上占用128个字节,1M的区域大约可以存储16_000个64位的状态或者大约8_000个128位的状态。
如果区域存储空间耗尽,最近最少使用状态将被删除,即使在此之后无法创建新状态,该请求也会以错误终止。
综上述,64位系统1M大小的区域可以存储8千个IP,而32位是1万6千个,如果超过则会将最近最久未使用的删除,删除后如果还无法创建存储状态,这个请求也会以错误而终止,我的理解是这样。
如果你觉得有用记得收藏哦,也可以转发让更多的人看到,ps,可以点击 左下角 了解更多 阅读优化排版的版本。您的支持,是我持续创作的动力。
实例
一般的DDOS解决方法
1)设置方法1
vim编辑/proc/sys/net/ipv4/tcp_max_syn_backlog
8000
默认500,建议改为8000以上
2)设置方法2
vim编辑/proc/sys/net/ipv4/tcp_fin_timeout
默认值60,建议改为15
3)syncooies
sysctl -w net.ipv4.icmp_echo_ignore_all=1
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
sysctl -w net.ipv4.tcp_max_syn_backlog="2048"
sysctl -w net.ipv4.tcp_synack_retries="3"
iptables -A INPUT -i eth0 -p tcp --syn -j syn-flood
# Limit 12 connections per second (burst to 24)
iptables -A syn-flood -m limit --limit 12/s --limit-burst 24 -j RETURN
4)limit
iptbales -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT
https://blog.csdn.net/weixin_34216107/article/details/89903815?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-14.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-14.nonecase
参考链接:
DDoS攻击的六种主要类型及常见防御技术 http://news.west.cn/42133.html
使用netstat命令验证DDOS入侵 :https://blog.csdn.net/chunlian8492/article/details/100820736?utm_medium=distribute.pc_relevant_t0.none-task-blog-OPENSEARCH-1.nonecase&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-OPENSEARCH-1.nonecase
Linux下防御DDOS攻击的操作梳理 : https://cloud.tencent.com/developer/article/1027280
使用iptables缓解DDOS及CC攻击 : http://www.178linux.com/368
分享一个实用的shell脚本–实现DDOS攻击自动封禁IP: http://www.safebase.cn/article-259086-1.html
ddos攻击防御之使用nginx :http://www.safebase.cn/article-257098-1.html
网站受到DDoS攻击的表现 :http://www.safebase.cn/article-258782-1.html
使用iptables应对SYN攻击、CC攻击、ACK攻击 :https://blog.csdn.net/weixin_34216107/article/details/89903815?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-14.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-14.nonecase