用nginx日志+iptables防御CC攻击

本文介绍一个简单完整的对抗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攻击。

转载于:https://my.oschina.net/phptiger86/blog/739855

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值