首页 » Linux » 注册页面一直被刷及解决方法的脚本

注册页面一直被刷及解决方法的脚本

 

昨天发现磁盘超过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

 

 

 

原文链接:注册页面一直被刷及解决方法的脚本,转载请注明来源!

0