β

Linux服务器应对DDOS攻击的策略(持续更新)

昨天搞了个微信发红包的活动,果然,又引起了一波不怀好意的攻击,都想偷钱走人,和以往搜索异常请求IP封锁就能解决的情况不同,这次的DDOS实在是猛,不管你怎么封IP都没有用,总有的新的IP发起攻击,资源果然多得惊人。

总结应对DDOS攻击的方法:

基础诊断:

遇到怀疑攻击情况,首先要看看服务器上面的情况,首先top一下,看看服务器负载,如果负载不高,那么基本可以判断不是cc类型的攻击,再输入命令

netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

查看下网络连接的情况,会得到下面这些结果:

TIME_WAIT 1143
FIN_WAIT1 628
FIN_WAIT2 345
ESTABLISHED 10146
LAST_ACK 75

TCP/IP协议使用三次握手来建立连接,过程如下:
1、第一次握手,客户端发送数据包syn到服务器,并进入SYN_SEND状态,等待回复
2、第二次握手,服务器发送数据报syn/ack,给客户机,并进入SYN_RECV状态,等待回复
3、第三次握手,客户端发送数据包ACK给客户机,发送完成后,客户端和服务器进入ESTABLISHED状态,链接建立完成

如果ESTABLISHED非常地高,那么可能是有人在恶意攻击,进一步判断,可以把下面命令保存为脚本执行一下:

如果SYN_RECV非常高,那么表示受到了SYN洪水攻击。

如果上面的值看不出什么异常的话,我们来抓包分析下,可能并非基于TCP的攻击。抓包命令:

tcpdump -w tmp.pcap port not 22

抓包感觉差不多了就ctrl+c结束,结果在保存在当前目录下的tmp.pcap文件中,我们可以使用命令

tcpdump -r tmp.pcap -nnA

如果出现大量的ICMP包或者大量的UDP包,那么可能就是针对性的ICMP洪水以及UDP洪水了。

1.用netstat命令查看DDOS攻击的方法

netstat -an | grep :80 | sort

只显示连接到80段口的活跃的网络连接,80是http端口,这对于web服务器非常有用,并且对结果排序.对于你从许多的连接中找出单个发动洪水攻击IP非常有用

netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n

使用netstat命令来计算每个IP地址对服务器的连接数量

netstat -anp |grep 'tcp|udp' | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n

列出使用tcp和udp连接到服务器的数目

netstat -plan|grep :80|awk {'print $5'}|cut -d: -f 1|sort|uniq -c|sort -nk 1

显示并且列出连接到80端口IP地址和连接数.80被用来作为HTTP

2.使用iptables防火墙进行DDOS防御的方法:

-A
APPEND,追加一条规则(放到最后)
例如:
iptables -A INPUT -j ACCEPT
允许所有访问本机 IP 的数据包通过

-I
INSERT,插入一条规则
例如:
iptables -I INPUT -j DROP
在 filter 表的 INPUT 链里插入一条规则(插入成第 1 条)

-D
DELETE,删除一条规则
iptables -D INPUT 3(按号码匹配)
删除 filter 表 INPUT 链中的第三条规则(不管它的内容是什么)

-R
REPLACE,替换一条规则
例如:
iptables -R INPUT 9 -j ACCEPT
将原来编号为 9 的规则内容替换为“-j ACCEPT”

-P
POLICY,设置某个链的默认规则
例如:
iptables -P INPUT DROP
设置 filter 表 INPUT 链的默认规则是 DROP

-F
FLUSH,清空规则
例如
iptables -F
清空 filter 表中的所有规则
-p
protocol 比对通讯协议
例如
iptables -A INPUT -p tcp
比对通讯协议类型是否相符
-s
src, source
例如
iptables -I INPUT -s 172.16.0.201 -j DROP
用来比对封包的来源 IP,可以比对单机或网络,比对网络时请用数字来表示屏蔽,例屏蔽:172.16.0.201 IP访问,所有数据都将丢弃

–tcp-flags 比对 TCP
例如
iptables -p tcp –tcp-flags SYN,FIN,ACK SYN
TCP状态旗号包括:SYN(同步)、ACK(应答)、FIN(结束)、RST(重设)、URG(紧急)、PSH(强迫推送)
等均可使用于参数中,除此之外还可以使用关键词 ALL 和 NONE 进行比对

–icmp-type
例如:
iptables -A INPUT -p icmp –icmp-type 8
用来比对 ICMP 的类型编号,可以使用代码或数字编号来进行比对。 案例ICMP类型是:8

-m limit –limit
例如
iptables -A INPUT -m limit –limit 3/sec
用来比对某段时间内封包的平均流量,上面的例子是用来比对每秒平均流量是否超过一次 3 个封包。

配置文件位置:
/etc/sysconfig/iptables
iptables 管理服务命令
开启 service iptables start
关闭 service iptables stop
重起 service iptables restart

2*.场景案例分析

a.假如你认为这流量已是不正常流量,可以用以下命令查看有哪些IP在连接本机80端口,然后进行屏蔽!

netstat -ant | grep ":80" | awk '{printf "%s %s\n",$5,$6}' | sort

假如你认为0.201IP有可疑,想进行屏蔽,用以下命令
屏蔽流进ip

iptables -I INPUT -s 172.16.0.201 -j DROP

解封屏蔽

iptables -D INPUT -s 172.16.0.201 -j DROP

只屏蔽172.16.0 IP段访问本机80端口,其他端口可以正常,命令如下:

iptables -I INPUT -p tcp --dport 80 -s 172.16.0.201/24 -j DROP

解封屏蔽

iptables -D INPUT -p tcp --dport 80 -s 172.16.0.201/24 -j DROP

在添加的规则时,REJECT(拒绝)目标和 DROP(放弃)目标这两种行动有所不同。REJECT 会拒绝目标分组的进入,并给企图连接服务的用户返回一个 connection refused 的错误消息。DROP 会放弃分组,而对 telnet 用户不发出任何警告.

命令添加的规则只是临时生效,重起iptables服务后将会恢复,永久进行保存命令service iptables save或者直接修改配置文件
修改完/etc/sysconfig/iptables 防火墙配置文件,需要重起iptables服务才会生效

3.防范DDOS攻击的一些策略

默认的iptables规则是无法过滤DDOS攻击数据的,我们需要添加过滤规则实现iptables拥有抗DDOS的能力。下面给出常用的iptables配置:
屏蔽 SYN_RECV 的连接

-A FORWARD -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -m limit --limit 1/sec -j ACCEPT

限制IP碎片,每秒钟只允许100个碎片,用来防止DoS攻击

-A FORWARD -f -m limit --limit 100/sec --limit-burst 100 -j ACCEPT

限制ping包每秒一个,10个后重新开始

-A FORWARD -p icmp -m limit --limit 1/sec --limit-burst 10 -j ACCEPT

限制ICMP包回应请求每秒一个

-A FORWARD -p icmp -m icmp --icmp-type 8 -m limit --limit 1/sec -j ACCEPT

此处自定义一个表

-A FORWARD -j RH-Firewall-1-INPUT

完全接受 loopback interface 的封包

-A RH-Firewall-1-INPUT -i lo -j ACCEPT

允许主机接受 ping

-A RH-Firewall-1-INPUT -p icmp -m icmp --icmp-type any -j ACCEPT

网际网路印表机服务 (可以删除)

-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT

允许连线出去后对方主机回应进来的封包

-A RH-Firewall-1-INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

允许防火墙开启指定端口 (本服务器规则开了常用端口 22 21 80 25 110 3306等)

-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport port -j ACCEPT

限制SSH登陆
只允许在172.16.0.2上使用ssh远程登录,从其它计算机上禁止使用ssh

iptables -A INPUT -s 172.16.0.2 -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP

3.使用DDoS deflate+iptables
DDoS deflate是一款免费的用来防御和减轻DDoS攻击的脚本。它通过netstat监测跟踪创建大量网络连接的IP地址,在检测到某个结点超过预设的限制时,该程序会通过APF或IPTABLES禁止或阻挡这些IP.

1.安装DDoS deflate
wget http://www.inetbase.com/scripts/ddos/install.sh //下载DDoS deflate
chmod 0700 install.sh //添加权限
./install.sh //执行
2、配置DDoS deflate
下面是DDoS deflate的默认配置位于/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分钟

##### How many connections define a bad IP? Indicate that below.
NO_OF_CONNECTIONS=150 //最大连接数,超过这个数IP就会被屏蔽,一般默认即可

##### 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=1 //使用APF还是iptables。推荐使用iptables,将APF_BAN的值改为0即可。

##### 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被屏蔽时给指定邮箱发送邮件,推荐使用,换成自己的邮箱即可

##### Number of seconds the banned ip should remain in blacklist.
BAN_PERIOD=600 //禁用IP时间,默认600秒,可根据情况调整
用户可根据给默认配置文件加上的注释提示内容,修改配置文件。

查看/usr/local/ddos/ddos.sh文件的第117行

netstat -ntu | awk ‘{print $5}’ | cut -d: -f1 | sort | uniq -c | sort -nr > $BAD_IP_LIST

修改为以下代码即可!

netstat -ntu | awk ‘{print $5}’ | cut -d: -f1 | sed -n ‘/[0-9]/p’ | sort | uniq -c | sort -nr > $BAD_IP_LIST

参考文章: http://www.nigesb.com/ddos-attack-defence-in-linux.html

http://www.centoscn.com/CentosSecurity/CentosSafe/2013/1017/1867.html

作者:云秀网|在云上开发优秀的网站
微信接口,移动Web APP与HTML5响应式网站应用开发专家。
原文地址:Linux服务器应对DDOS攻击的策略(持续更新), 感谢原作者分享。

发表评论