通过awk和shell来限制IP多次访问之学不会你打死我

学不会你打死我

今天我们用shell脚本,awk工具来分析日志来判断是否存在扫描器来进行破解网站密码——限制访问次数过多的IP地址,通过Iptables来进行限制。代码在末尾

首先我们要先查看日志的格式,分析出我们需要筛选的内容,日志的内容在**/var/log/文件下,这次我们分析的是访问HTTP的日志,该目录在/var/log/httpd/access_log**

在这里插入图片描述

根据一分钟之内的访问量来判断访问量。利用awk的特点我们可以分析出,时间在第四列,IP地址在第一列,由于我们要根据一分中之内

的访问次数来限制IP,所以我们要设置时间变量来控制时间。

然后通过awk进行日志筛选来选择出符合条件的IP。

最后通过Iptables对符合要求的IP地址进行设置,使其拒绝访问;

这是我们自己搭建的一个web服务器

我们对网页进行连续访问,然后在日志中出现记录

在这里插入图片描述

然后我们开启shell脚本

在这里插入图片描述

shell脚本立即执行,并且打印出起始时间和结束时间

我们查看我们的lalala文件

在这里插入图片描述

可以看出该IP对网页进行了24次访问,我们的ip.txt文件中记录符合条件(一分钟访问次数超过10次)的IP地址。

在这里插入图片描述

基于ip.txt文件中IP地址,使用Iptables来进行拒绝访问80和443端口

在这里插入图片描述

到此,就结束了。

shell脚本代码如下:

#!/bin/bash
logfile=/var/log/httpd/ #定义物理路径
start_time=`date -d"1 minutes ago" +"%d/%m/%Y:%H:%M:%S"` #设置时间格式,"%d天/%m月/%Y年:%H时:%M分:%S秒"
echo $start_time  #打印出起始时间
last_time=`date +"%d/%m/%Y:%H:%M:%S"` #设置结束时间
echo $last_time #打印出结束时间
sed -i 's/Jan/01/g' $logfile/access_log  #由于date读出的时间为01与日志时间中Jan格式不同,所以通过sed来将Jan替换为01,通过-i进行文件修改
tac $logfile/access_log | awk -v st="$start_time" -v et="$last_time" '{t=substr($4,2);if(st<=t && t<=et){print $1}}'| uniq -c | sort -nr >> $logfile/lalala #tac将文件倒序输出,然后通过awk -v设置变量,来判断它与起始时间和结束时间来判断符合条件的IP地址,由于awk的第四列打印出来时格式为‘[13/Jan/2022:22:19:46’ 与 起始时间的格式不匹配,所以我们通过或substr()函数来进行截取,然后经过uniq 去重;-c进行统计,sort 排序,然后将符合条件的IP地址和访问的次数,写入lalala文件中;
line=`cat $logfile/lalala | awk '{if($1 > 10)print $2}'`  #通过判断访问的次数来进行限制,第一列为访问的次数,第二列为IP,通过awk进行筛选;
for ip in $line
do
echo $ip >> $logfile/ip.txt
done    #通过for语句将符合条件的IP地址打印出来输入至ip.txt文件中;
ip_1=`cat $logfile/ip.txt`
for i in $ip_1
do
iptables -t filter -I INPUT -p tcp -s $i -m multiport --dport 80,443 -j DROP
done #通过iptables功能将IP进行拒绝访问

Guess you like

Origin blog.csdn.net/m0_53183117/article/details/122486277