昨天发现磁盘超过80%的报警,上到服务器,查看各个目录的大小:du -ah –max-depth=1 /;发现是日志目录比较大,然后查看访问日志目录,发现有一个web的日志一直被请求,日志在一直生成,而且刷的非常快,发现请求的内容是注册页面。
解决方法:
一般应该先采取封ip的方法,可以通过iptables,nginx,haproxy,tcp_wrapper等,发现一个问题是如果用haproxy如果ip过多的话,也会报太长的错误 ,由于我发源ip有500多个,所以一下子限制没有那么快,就先在ha把那个注册页面关了。
注册页面最好是有验证码,输入了验证码才能获取短信难码。
然后采取了如下措施:
1、由于访问的是同一个页面,所以我在haproxy上先禁止访问这个页面,如下配置 :
acl test_uri path_beg -i /register-register
acl test_uri1 path_beg -i /sms-regPhoneCode.html
http-request deny if test_uri is_m_e_cn
http-request deny if test_uri1 is_m_e_cn
2、由于haproxy的日志也一直增加,我把日志级别同志notice改成了warning。
3、禁了一段时间,又放开访问,发现还是一直在访问。
4、在web上查看了访问ip来源;时间是从昨天晚上3点到下午的,如下是前10的ip访问量,总共访问达40次以上的ip有600个,
[root@web logs]# cat a.txt |head -10 33633 124.127.149.118 32782 1.202.126.239 24643 27.20.161.244 22169 153.34.223.216 21615 180.97.224.254 19130 1.202.127.251 17974 14.213.155.243 16765 219.143.129.229 16707 115.56.134.31 14886 1.202.123.221
5、由于打开注册页面,以上的IP又继续访问,所以暂时关掉了这个注册页面:http://m.e.cn/register-register.html
。
如果用nginx关,配置,也需要把日志关了,不然也然产生日志,只是状态是403,如下:
location = /register-register.html { deny all; access_log off; } location = /sms-regPhoneCode.html { deny all; access_log off; }
写了一个自动封ip的脚本:以下是针对centos6.*的,
#!/bin/bash function abc() { while read line do ip=`echo $line|awk '{print $2}'` count=`echo $line|awk '{print $1}'` ip_count=`iptables -L -n|grep "$ip"|wc -l` if [ "$count" -ge 100 -a "$ip_count" -lt 1 ] then iptables -I INPUT -s "$ip" -j DROP echo "$line is dropped" >>./droplist.log fi done<./ip.txt } function main(){ while true do tail -2000 /root/access-m.log-20160831|grep -v "^$" |awk -F '"' '{print $8 }'|sort|uniq -c |sort -rn|head > ./ip.txt abc sleep 120 done } main
centos7如下:
#/bin/bash function abc() { while read line do ip=`echo $line|awk '{print $2}'` count=`echo $line|awk '{print $1}'` ip_count=`firewall-cmd --list-all |grep "$ip"|wc -l` if [ "$count" -gt 100 -a "$ip_count" -lt 1 ] then firewall-cmd --permanent --add-rich-rule="rule family=ipv4 source address="$ip" drop" >/dev/null && \ firewall-cmd --reload >/dev/null echo "$line is dropped" >>./droplist.log fi done<./ip.txt } function main(){ while true do tail -2000 /root/access-m.log-20160831|grep -v "^$" |awk -F '"' '{print $8 }'|sort|uniq -c |sort -rn|head > ./ip.txt abc sleep 120 done } main
移去命令:
firewall-cmd –permanent –remove-rich-rule=”rule family=ipv4 source address=”$ip” drop”
恢复脚本:
centos7的脚本如下:判断条件可以自行修改,以下是当2000条记录里少于10次访问且已经有封的ip就给予开启访问。也可以放在定时任务,直接把while去掉就可以,也可以放在后台运行,就不需要去掉,看时间间隔,1分钟以内放在后台比较好,超过1分钟最好是用定时任务。
#!/bin/bash function recovery() { while read line do ip1=`echo $line|awk '{print $2}'` count1=`echo $line|awk '{print $1}'` ip_count1=`firewall-cmd --list-all |grep "$ip1"|wc -l` if [ "$count1" -lt 10 -a "$ip_count1" -ge 1 ] then firewall-cmd --permanent --remove-rich-rule="rule family=ipv4 source address="$ip1" drop" >/dev/null && \ firewall-cmd --reload >/dev/null echo "$line is recovery" >>./iprecoverylist.log fi done<./ipcount.txt } function main(){ while true do tail -2000 /root/access-m.log-20160831|grep -v "^$" |awk -F '"' '{print $8 }'|sort|uniq -c |sort -rn > ./ipcount.txt recovery sleep 120 done } main
centos6下的脚本如下:
#!/bin/bash function recovery() { while read line do ip1=`echo $line|awk '{print $2}'` count1=`echo $line|awk '{print $1}'` ip_count1=`iptables -L -n|grep "$ip1"|wc -l` if [ "$count1" -lt 10 -a "$ip_count1" -ge 1 ] then iptables -D INPUT -s "$ip1" -j DROP echo "$line is recovery" >>./drop_recovery_list.log fi done<./ipcount.txt } function main(){ while true do tail -2000 /root/access-m.log-20160831|grep -v "^$" |awk -F '"' '{print $8 }'|sort|uniq -c |sort -rn > ./ipcount.txt recovery sleep 120 done } main
原文链接:注册页面一直被刷及解决方法的脚本,转载请注明来源!