最近被cc攻击,搞得mysql压力很大,访问速度很慢或者没法访问
看了一下nginx日志,发现日志里面$http_user_agent这个变量中总有包含“Baiduspider”这个变量。
以下图mysql
1.找出全部包含“Baiduspider”的ip地址
2.用iptables禁用这些地址nginx
安装redisredis
aptitude install redis-server
为了拥有完整的IP地址列表,把全部的ip地址过滤出来,并存进redis中,脚本以下:sql
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中的结果ide
发起攻击的IP地址已经被存到redis里了。在redis中使用有序集合来存放ip地址,能够避免重复增长ip地址,还能够统计攻击发起的次数。url
为了偷懒不须要常常从新扫nginx日志,这里增长一个后台运行程序,跟随nginx日志的增加来实时分析它,这样能够下降压力。让这个命令在后台运行,不随命令行窗口终结,须要使用nohup命令:spa
nohup tail -f /mnt/log/nginx/tuan.ganghaoyouhuo.access.log |awk '{ if($15 ~ /Baidu/ || $17 ~ /Baidu/) system("redis-cli zincrby black 1 "$1)}' &
先把禁用命令输出出来看一下命令行
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攻击。