先说下我目前的系统情况:
nginx+php+php-fpm+mysql
由于项目还没有上线,所以ECS用的是最低的配置。但我不知道是我自己的问题还是阿里本身的问题,阿里的云盾CC防护最低阀值为100个/s HTTP请求。
在这种情况下,我不得不做了nginx的限制同IP并发数为10。
这么做的效果是,虽然在超过10的并发连接会被nginx返回503。但nginx还是会影响这个请求,这不是我想要的结果,如果有无聊的恶意攻击,日志会被一直这样的快速写入,但一时间也没有特别好的方案。
所以我写了一个shell脚本来做这么一件事:
1.获取当前与10秒后的nginx日志文件
2.对获取到的文件进行处理,统计IP及请求次数
3.获取每个IP在10秒内增加的数量
4.使用iptables关闭10秒后访问次数超过30的IP
脚本如下:
#!/bin/bash
## Date: 2015/7/25
## Author: Mislost
## Denfense DDOS with iptables rule.
##定义nginx log文件路径
log_file="/var/log/nginx/access"
## 后台每10秒做一次防护
while true
do
## 获得当前nginx访问信息
awk -F" " '{print $1}' $log_file | sort | uniq -c | sort -n -r -k1 > /tmp/ip.old
# 获得10秒后nginx访问信息
sleep 10
awk -F" " '{print $1}' $log_file | sort | uniq -c | sort -n -r -k1 > /tmp/ip.new
## 格式化信息(也可用IFS=$”\n“实现读行的问题)
awk -F" " '{print $1":"$2}' /tmp/ip.old > /tmp/old
awk -F" " '{print $1":"$2}' /tmp/ip.new > /tmp/new
## 获取10秒内请求次数超过30次的IP地址,并通过iptables拒绝访问。
for line in $(cat /tmp/new)
do
## 获取所有IP地址,并计算10内在日志中请求数
IP=`echo $line | awk -F":" '{print $2}'`
count_new=`echo $line |awk -F":" '{print $1}'`
count_old=$(awk -F":" "/$IP/{print \$1}" old)
if [[ $count_old != "" ]];then
let result=count_new-count_old
else
result=$count_new
fi
if [[ $result -ge 30 ]];then
# 如果10秒内请求数大于30,拒绝这个IP的所有入站访问
iptables -I INPUT -s $IP -j DROP
now=`date "+%Y-%m-%d %H:%M:%S"`
##写入日志来记录被决绝的IP地址
echo \[$now\]Drop the ip ==== $IP >> /var/log/ddos.log
fi
done
done
注意:由于iptables写的比较死,如果需要用自己的IP进行测试,请将iptables 规则写成
iptables -I INPUT -s $IP -p tcp --dport 80 -j DROP
用root用户将脚本丢到后台运行。
比如:./ddos.sh &
这可能不是一个好方法,并且次方案只能防护DOS和轻量的DDOS。
我会研究其他的可行方案,并跟踪此贴。
真心希望有更好的方案提供给我。
QQ:124236270
-------------------------
引用第5楼mislost于2015-07-27 20:31发表的 回4楼云代维的帖子 :
你说的这个动静的问题 我其实是考虑过的
不过我们的静态页面是做了缓存 且日志是另外写在一个文件里的 本来是要求不记录的 后来我加上去的
所以不存在在access.log中出现静态页面的请求的
也就是说 access日志中出现的全部都是动态的页面请求
[url=http://bbs.aliyun.com/job.php?action=topost&tid=252127&pid=679833][/url]
-------------------------
-------------------------
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。