秦春磊

摘 要:文章以一次被攻击经历为例,详细描述了如何发现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攻击,要彻底解决,还是要从系统构架、资金保障等方面去考虑。