论CC攻击之防范
2015-05-30秦春磊
秦春磊
摘 要:文章以一次被攻击经历为例,详细描述了如何发现CC攻击和对CC攻击进行基本的防范。
关键词:CC攻击;防范;bash iptables
CC攻击,全名是Challenge Collapsar攻击,是DDOS(分布式拒绝服务)的一种,是利用TCP/IP协议三次握手规则发起的针对服务器的攻击。
1 背景介绍
近日,某web服务器出现了典型的被攻击的症状:网络和系统正常的情况下,打开网页延迟很高;远程登录服务器时,建立连接等待时间长。
服务器是CentOS系统,独立IP接入互联网,因为是测试机,所以前端没有防护设备。上面安装了http服务。
2 攻击类型确认
面对攻击,首先得确定攻击类型,以对症下药。
首先查看资源使用情况。经检查,内存、CPU使用率很低,显然,资源使用率不是延迟高的原因;然后,修改http端口号,发现访问速度恢复正常。输入命令: ps -ef | grep apache | wc,结果显示:277 2450 41582,原因找到!数字277意思是有277个apache进程。而低并发网站,进程数应为10个左右。因此,初步断定为DDOS攻击。考虑到资源利用率低,猜测是CC攻击。
为了验证猜测,输入命令:netstat -ant | awk '/^tcp/ {c[$NF] ++} END { for(s in c) print s,c[s];}',显示结果如下:
(略)
SYN_RECV 254
(略)
这里,SYN_RECV连接数为254个。我们知道,建立TCP/IP连接,有三次握手: 一是(SYN_SEND),C到S的syn包发送,等待S回复;二是(SYN_RECV),S到C的syn/ack数据发送,等待C回复;三是(ESTABLISHED),C确认ACK给服务器,链接成功。
3 攻击防范策略
CC攻击非常常见,而且没有“简单而廉价的”处理方式。主要原因是无法简单有效地判断一个连接是否是CC攻击。如果把ACK连接时间长的杀掉,有可能导致误杀。通常做法是使用专业设备,由前置设备进行判断连接的有效性。
当然,上述是商业化的解决方案,作为学习之用,应对低强度CC攻击,可考虑下面手段:
第一步:应用层面上的防范,采用mod_evasive模块。Mod_evasive是Apache通用的防DDOS攻击的扩展模块。它不能防御DDOS,但可缓解服务器压力。安装过程可参考网上资料。
默认配置下,模块会在/tmp目录下形成日志。如:来自1.2.3.4的CC攻击有99次,就会生成一个名为1.2.3.4的文件,内容是99。
第二步:防火墙层面的防范,可利用iptables命令配置,这个网上也有很多描述,就不再详细描述。可参考第四步的命令。
第三步:系统层面关于SYN的设置,Linux内核提供了若干SYN相关的配置,用命令: sysctl -a | grep syn 看到相关的参数,修改这些参数即可。详细参数介绍可以参考网上介绍。为了系统重启动时保持上述配置,可将上述命令加入到/etc/rc.d/rc.local文件中。
第四步:使用bash命令,自动添加黑名单。
建立一个目录,用于存放我们的bash文件和log文件。
首先:创建iptables.rule文件,添加以下内容(精选部分):
Vim iptables.rule
#!/bin/bash
(省略部分前期配置)
iptables -F
iptables -X
iptables -Z
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state RELATED -j ACCEPT
iptables -F -t nat
iptables -X -t nat
iptables -Z -t nat
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT
# Keep connect established
iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED -j ACCEPT
(省略部分)
iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT
iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT
iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
简要说明:上述命令,实际上是设置了内外网访问不同的权限,对连接的链路也做了一定的规定。可以根据内外网网卡名字的不同和ip地址的不同做适当的修改。这个文件,在后面是可以随时进行增加的,主要用于增加黑名单。
最后,在/usr/local/gateway中,创建black.sh文件,该文件的作用,就是分析/tmp目录下的已经确定是cc的ip地址,然后把该ip地址加入到黑名单中。
Vim black.sh
增加如下内容:
#!/bin/bash
LOCAL="127.0.0.1"
W1="1.2.3.4" #允许访问的公网ip地址。
now=`date +%Y-%m-%d.dos`
echo "#add $now" >> /root/gateway/iptables.rule
for i in `ls /tmp/dos* | awk -F- '{print $2}'`
do
if [ $i = $LOCAL ]
then
continue;
fi
if [ $i = $W1 ]
then
continue;
fi
m=$"iptables -I INPUT -s $i -j DROP"
echo $m >> /usr/local/gateway/log/$now
echo $m >> / usr/local/gateway/iptables.rule
done
rm -f /tmp/dos*
/bin/iptable.rule restart
保存退出。
完成了上述操作,我们可以把上述三个文件设置为可执行,最后加入到crontab中设置为定时运行:
Crontab -e
增加:
0 */4 * * * /bin/bash /usr/local/gateway/black.sh
至此,完成了全部的服务器设置。服务器在运行一段时间后,在检测SYN_RECV数据,就可以看到数量明显下降。
当然,上述方法无法彻底解决CC攻击,要彻底解决,还是要从系统构架、资金保障等方面去考虑。