本文介绍一个简单完整的对抗cc攻击的方法
使用软件: nginx + redis + iptables 还有少量awk命令
攻击情况
最近被cc攻击,搞得mysql压力很大,访问速度很慢或者无法访问
看了一下nginx日志,发现日志里面$http_user_agent这个变量中总有包含“Baiduspider”这个变量。
如下图
解决思路
1.找出所有包含“Baiduspider”的ip地址
2.用iptables禁用这些地址
具体解决方法
安装redis
aptitude install redis-server
跟踪分析nginx日志,把发起攻击的ip地址存放到redis中
为了拥有完整的IP地址列表,把所有的ip地址过滤出来,并存进redis中,脚本如下:
tail -f /mnt/log/nginx/tuan.ganghaoyouhuo.access.log|awk { if($15 ~ /Baidu/ || $17 ~ /Baidu/) system("redis-cli zincrby black 1 "$1)}
解释一下上述脚本
首先,用tail命令跟踪分析nginx日志,
然后用管道命令,连接awk命令,
分析日志的第15或17列,
如果能匹配到/Baidu/这个关键字,就调起redis命令redis-cli,
使用zincrby方法,给找到的ip地址(nginx日志的第一列,所以是$1),记录访问记录加1.
几分钟后查看一下redis中的结果
发起攻击的IP地址已经被存到redis里了。在redis中使用有序集合来存放ip地址,可以避免重复增加ip地址,还可以统计攻击发起的次数。
为了偷懒不需要经常重新扫nginx日志,这里增加一个后台运行程序,跟随nginx日志的增长来实时分析它,这样可以降低压力。让这个命令在后台运行,不随命令行窗口终结,需要使用nohup命令:
nohup tail -f /mnt/log/nginx/tuan.ganghaoyouhuo.access.log |awk '{ if($15 ~ /Baidu/ || $17 ~ /Baidu/) system("redis-cli zincrby black 1 "$1)}' &
这时候就可以把iptables中的ip地址添加到iptables中禁用掉了
先把禁用命令输出出来看一下
redis-cli zrevrange black 0 -1|awk '{print "iptables -I INPUT -s "$0" -j DROP"}'
命令解释
用redis的zrevrange命令,把记录的ip地址全部输出出来
用管道命令连接awk命令,拼接添加禁用地址的命令语句
结果如下
修改一下命令,让iptables命令直接运行
redis-cli zrevrange black 0 -1|grep ''|awk '{system( "iptables -I INPUT -s "$0" -j DROP")}'
查看运行结果
iptables -L -n
这样,发起攻击的ip地址已经全部被禁用了。
过一定的时间后,可以重复执行上面的命令,刷新iptables中的禁用地址列表
这样发起cc攻击的ip地址就全被禁用掉了,再看一下nginx日志,是不是变得舒缓了起来
增强方案
CC攻击通常有这样的特征
1.一般的CC攻击,攻击方都会定制浏览器类型,就是nginx收到的$http_user_agent变量。这是最容易获取特征的地方。
2.都集中攻击某几个url地址。
3.一般的CC攻击并没有海量的ip地址,能有几万个IP地址已经很了不起了。
所以可以根据这样的特征来设计应对方案。按照$http_user_agent和被访问的url地址来判断是否是攻击行为,利用redis来计算访问次数,再封禁异常的访问IP,这样可以应对多数的cc攻击。
来源:oschina
链接:https://my.oschina.net/u/948305/blog/739855