脚本方式处理网站被***

网友投稿 316 2022-10-24


脚本方式处理网站被***

上半年负责的一个业务官网经常被,这里总结下当时的处理方法。有的朋友可能不知道什么叫CC,在这里我简单介绍一下。CC属于DDos的一种,者会利用大量“肉鸡”对攻 击目标网站发起请求,并且频率很快,这样会导致目标网站的服务器承受不住而瘫痪。CC攻 击虽然看起来跟正常的访问几乎没有什么区别,但如果我们仔细分析访问日志还是可以找到一些线索,比如某个IP访问频次很高,或者某几个IP的user_agent是固定的等等特性,有的甚至会去模仿正规的搜索引擎,比如,把自己伪装为百度的“蜘蛛爬虫”。当遇到CC攻 击时,只要你肯花费一些精力来分析访问日志,终究是可以找出发起CC***的真凶,然后我们只要封掉它们的IP就万事大吉了。本案例的情况是这样的:每分钟分析一次访问日志/data/logs/access_log,日志片段如下:180.98.113.151 - [19/Feb/2020:09:30:07 +0800] "/uc_server/avatar.php?uid=1145811&size=middle" 301 "GET HTTP/1.1" "-" "Mozilla/5.0 (iPhone; CPU iPhone OS 9_2_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Mobile/13D15 MAGAPPX|4.1.2-4.1.0-41|iPhone OS 9.2.1 iPhone 6|wenyou|C6C25422-279C-4337-8E10-F588D577B9D7|da97ede5be797f79b96d6761bf858632|426ef86c3fc2359dc90468f7bdd0f5e9|c64f2225ec641231cd612bbe08f2b40d" 61.227.224.229 - [19/Feb/2020:09:30:07 +0800] "/misc.php?mod=ranklist&type=member&view=post" 200 "GET HTTP/1.1" ""Mozilla/5.0 (Windows NT 6.1; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0"

把访问量高于100的IP给封掉,封过的IP都要记录到一个日志中,每隔5分钟检查一次被封的IP,把没有访问量或者访问量很少的IP解封,解封的IP记录到另外一个日志中。

知识点一:awk用法在shell脚本中,awk出现概率是极高的,因为它在处理字符串上有很强的能力。先来看一个小例子:awk -F ':' '$3>500 {print $1,$3}' /etc/passwdsystemd-bus-proxy 999polkitd 998chrony 997user1 1000说明:awk最核心的功能是分段,可以用-F选项指定一个分隔符,然后针对某一段字符进行处理,本例中用':'作为分隔符,去找第3段大于500的行,然后把第1段和第3段打印出来。下面列举几个常见的用法:1)截取指定段awk -F ':|#' '{print $2}' 1.txt说明:分隔符可以是一个正则表达式,本例中的分隔符可以是':'也可以是'#'。2)匹配字符后字符串awk -F ':' '$1 ~ "abc"' 1.txt说明:过滤出第一段包含abc的行,其中这里的abc可以是一个正则表达式,例如:awk -F ':' '$1 ~ "^ro+"' 1.txt说明:^表示开头,+表示+前面的字符至少有1个,所以可以匹配的字符串有:ro, roo, rooo...3)多个语句同时使用awk -F ':' '$1 ~ "root" {print $1,$3}; $3>=100 {print $1,$2}' 1.txt4)内置变量awk -F ':' '{print NF,NR}' 1.txt说明:NF为段数,NR为行数5)数学运算awk -F ':' '$7=$3+$4 {print $0}' 1.txt因为$7的值被重新定义了,所以打印$0时,并不会包含分隔符计算某一段的总和,这种用法也比较常见,例如:awk -F ':' '{(tot=tot+$3)}; END {print tot}' 1.txt

知识点二:sort排序语法: sort [-t 分隔符] [-kn1,n2] [-nru] 这里的n1 < n2-t 分隔符 :作用跟cut的-d一个意思-n :使用纯数字排序-r :反向排序-u :去重复-kn1,n2 :由n1区间排序到n2区间,可以只写-kn1,即对n1字段排序如果sort不加任何选项,则从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出,如下:head -n5 /etc/passwd |sortadm:x:3:4:adm:/var/adm:/sbin/nologinbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologinlp:x:4:7:lp:/var/spool/lpd:/sbin/nologinroot:x:0:0:root:/root:/bin/bash-t 后面跟分隔符,-k后面跟数字,表示对第几个区域的字符串排序,-n 则表示使用纯数字排序,示例如下:head -n5 /etc/passwd |sort -t: -k3 -nroot:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologinadm:x:3:4:adm:/var/adm:/sbin/nologinlp:x:4:7:lp:/var/spool/lpd:/sbin/nologin-k3,5 表示从第3到第5区域间的字符串排序,-r表示反向排序,示例如下:head -n5 /etc/passwd |sort -t: -k3,5 -rlp:x:4:7:lp:/var/spool/lpd:/sbin/nologinadm:x:3:4:adm:/var/adm:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologinbin:x:1:1:bin:/bin:/sbin/nologinroot:x:0:0:root:/root:/bin/bash

知识点三:uniq去重复这个命令我经常用的选项只有一个,-c :统计重复的行数,并把行数写在前面sort testb.txt |uniq -c2 1111 2221 333

知识点四:sed用法sed和grep、awk一样频繁地出现在shell脚本中,它们三个经常被叫做“正则三剑客”,可见这三个工具和正则表达式之间的关系非同一般。对于sed工具的用法,我列几个常见的。1)打印指定行sed -n '10p' 1.txt说明:10指的是行号,p表示print(打印),加上-n后只显示第10行,否则会把1.txt所有行都显示出来,这里的单引号是我的习惯,你可以不加也可以加双引号。另外,可以指定多行,示例命令如下:sed -n '1,5p' 1.txt 说明:打印1到5行,如果是不连续的行,可以这样:sed -n '1p;5p' 1.txtsed也有和grep类似的过滤指定行的功能,如下:sed -n '/abc/p' 1.txt说明://为一个固定写法,里面就是要匹配的字符串,可以是正则,例如:sed -n '/[a-z0-9]/p' 1.txt在正则表达式中,有几个特殊符号属于扩展正则范畴,它们是+, ?, |, (), {}。在grep中要使用它们需要加上-E选项,而在sed中要使用它们,需要加上-r选项,比如:sed -nr '/abc|123/p' 1.txt2)删除指定行sed '10d' 1.txt说明:会删除第10行,但并不会真正操作1.txt内容,而是屏幕上显示的内容少了第10行,要想直接在文件内生效,可以加上-i选项,如下:sed -i '10d' 1.txt删除包含'abc'或者'linux'字符串的行sed -ir '/abc|linux/d' 1.txt查找替换把1.txt中的出现的全部'a'替换为'linux'sed 's/a/linux/g' 1.txt说明:这里的s表示替换,g表示全局替换,如果不加g则只替换每行中出现的第一个'a'。

本案例参考脚本:#定义1分钟以前的时间,用于过滤1分钟以前的日志t1=date -d "-1 min" +%Y:%H:%Mlog=/data/logs/access_log

block_ip(){egrep "$t1:[0-5]+" $log > /tmp/tmp_last_min.log

#把1分钟内访问量高于100的ip记录到一个临时文件中 awk '{print $1}' /tmp/tmp_last_min.log |sort -n |uniq -c|sort -n |awk '$1>100 {print $2}' > /nginx/conf/vhosts/bad_ip.list.conf #计算ip的数量 n=`wc -l /nginx/conf/vhosts/bad_ip.list.conf|awk '{print $1}'` #当ip数大于0时,才会用nginx封掉它 if [ $n -ne 0 ] then nginx reload #将这些被封的IP记录到日志里 echo "`date` 封掉的IP有:" >>/tmp/block_ip.log cat /nginx/conf/vhosts/bad_ip.list.conf >> /tmp/block_ip.log fi

}

unblock_ip(){#首先将日志里请求数小于10个的ip记录到一个临时文件里,把它们标记为白名单IPegrep "$t1:[0-5]+" $log | awk '{print $1}' |sort -n |uniq -c|sort -n |awk '$1<100 {print $2}' > /tmp/good_ip.listn=wc -l /tmp/good_ip.list|awk '{print $1}'if [ $n -ne 0 ]thenfor ip in cat /tmp/good_ip.listdosed -ir '/ip/d' /nginx/conf/vhosts/bad_ip.list.confdonenginx reloadecho "date 解封的IP有:" >> /tmp/unblock_ip.logcat /tmp/good_ip.list >> /tmp/unblock_ip.logfi}

#取当前时间的分钟数t=date +%M

#当分钟数为00或者30时(即每隔30分钟),执行解封IP的函数,其他时间只执行封IP的函数if [ $t == "00" ] || [ $t == "30" ]thenunblock_ipblock_ipelseblock_ipfi


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:nmap编译
下一篇:紧抓3个要素,控制好实施RPA的成本
相关文章

 发表评论

暂时没有评论,来抢沙发吧~