根据nginx访问日志,对非法请求URL 自动设置iptables软防火墙 封禁IP脚本

使用环境:

         通过elk等工具,发现web服务器经常受到公网的非法请求(如下图),所以增加自动封禁脚本。

        此方式是在被请求成功后根据日志内容进行关键字筛选 然后封禁; 如果有 在被请求前 进行阻止的方式 可以告知我,感谢!        

自动封禁脚本内容:

#!/bin/bash
##过滤nginx日志,且日志首个字段为来源IP地址
##使用iptables封禁80 443端口
##建议配合nginx日志每天切割脚本一起使用
##建议在iptables先添加完白名单后,再执行本脚本,方式误封无法访问!
##将脚本放置crontab中,每几分钟循环执行



#时间格式 2024-03-15 10:09:06
shiJian=`date "+%Y-%m-%d %H:%M:%S"`
riQi=`date "+%Y-%m-%d"`

#nginx日志目录 每条日志首内容为来源IP
logDir='/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/'
logFile='access.log'

#执行日志
zxlogDir='/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/'
mkdir -p ${zxlogDir}
##################################本次执行过滤恶意访问IP###################################
#过滤关键字数组
gjzshuzu=(
        passwd
        password
        \.php
        \/etc\/
        \.sql
        \/bin\/
        \.jsp
        \.tar\.gz
        )

for gjz in "${gjzshuzu[@]}"
 do
  #循环执行过滤关键字 将存在恶意关键字请求的 IP追加到 临时1文件
  grep "${gjz}" ${logDir}${logFile} |awk '{printf $1 "\n"}'|sort |uniq >> ${zxlogDir}linshi1.txt
 done

#排序并去重 临时1文件(本次运行初步过滤的IP),覆盖到临时2文件(本次运行去重的恶意IP);删除临时1文件
sort ${zxlogDir}linshi1.txt |uniq > ${zxlogDir}linshi2.txt
rm -rf ${zxlogDir}linshi1.txt
#将时间 和 临时2文件 记录到永久记录文件
mkdir -p ${zxlogDir}yongjiu/
echo "###${shiJian}" >> ${zxlogDir}yongjiu/${riQi}.txt
echo "`cat ${zxlogDir}linshi2.txt`" >> ${zxlogDir}yongjiu/${riQi}.txt


##################################解封历史限制###################################
#设置解封哪天的恶意IP
lastdate=`date +%Y-%m-%d --date="-5 day"`
jiefengFile=${zxlogDir}yongjiu/${lastdate}_5.txt
#判断文件 存在且非空
if [ -s "${jiefengFile}" ]
 then
  #cat ${jiefengFile} | while read jfiptime
  for jfiptime in `cat ${jiefengFile}`
   do
    #将每个ip 时间段输出到一个临时文件,偌不执行此步骤会报错awk: cannot open 141.98.7.67>2024-03-27_15:20:02
    echo $jfiptime > ${zxlogDir}linshi3.txt
    #循环执行 解封恶意IP地址
    jfip=`awk -F ">" '{printf $1 "\n"}' ${zxlogDir}linshi3.txt`
    jftime=`awk -F ">" '{printf $2 "\n"}' ${zxlogDir}linshi3.txt`
    /usr/sbin/iptables -D INPUT -s ${jfip} -p tcp -m multiport --dport 80,443 -j DROP -m comment --comment "nginx日志检测恶意访问IP ${jftime}"
    echo "###${jfip} ${shiJian} del封禁" >> ${zxlogDir}yongjiu/${riQi}.txt
    rm -rf ${zxlogDir}linshi3.txt
   done

 else
  echo "###${jiefengFile}文件不存在,或者文件为空,未删除封禁" >> ${zxlogDir}yongjiu/${riQi}.txt
fi


##################################新增封禁###################################
#过滤 排序 并去重 当天永久文件,覆盖输出为永久文件2(当天恶意IP 去重)
egrep -v "###|add|del|^$|禁" ${zxlogDir}yongjiu/${riQi}.txt |sort | uniq > ${zxlogDir}yongjiu/${riQi}_2.txt

#过滤 防火墙规则 是否已存在封禁中,输出至永久文件3(当天防火墙存在封禁记录 去重)
/usr/sbin/iptables -nL|grep "443"|grep DROP|grep "nginx日志检测恶意访问IP" |awk '{printf $4 "\n"}'|cut -d "/" -f1 |sort|uniq >${zxlogDir}yongjiu/${riQi}_3.txt

#比对 临时2文件(本次运行恶意IP去重版)和 当天永久文件3(当天防火墙存在记录)的差异 ,覆盖至永久文件4(对比差异文件)
duiBi=`diff ${zxlogDir}linshi2.txt ${zxlogDir}yongjiu/${riQi}_3.txt |grep '<'| awk '{printf $2 "\n"}'`
 echo ${duiBi} > ${zxlogDir}yongjiu/${riQi}_4.txt
 sed -i "s/ /\n/g" ${zxlogDir}yongjiu/${riQi}_4.txt

#判断,对比的内容,是否有新增恶意IP
if [ -n "${duiBi}" ]
 then
  cat ${zxlogDir}yongjiu/${riQi}_4.txt | while read ip
   do
    #循环执行 封堵本次查询新产生的 恶意IP地址
    fengjintime=`date "+%Y-%m-%d_%H:%M:%S"`
    /usr/sbin/iptables -A INPUT -s ${ip} -p tcp -m multiport --dport 80,443 -j DROP -m comment --comment "nginx日志检测恶意访问IP ${fengjintime}"
     echo "${ip} ${fengjintime} add封禁">> ${zxlogDir}yongjiu/${riQi}.txt
     #永久5文件  记录当天封禁的IP 时间,设置>为分隔符,若不设置则删除封禁的循环会以空格执行
     echo "${ip}>${fengjintime}">> ${zxlogDir}yongjiu/${riQi}_5.txt
   done

 else
  echo "###${shiJian} no新增恶意IP" >> ${zxlogDir}yongjiu/${riQi}.txt
fi


##################################删除200天未修改的文件###################################
find ${zxlogDir} -type f -mtime +200  -exec rm -rf {} \;

脚本介绍与注意事项:

        1、访问日志文件 不宜过大,否则影响过滤效率。建议使用其他脚本等方式每天切割日志

        2、本环境使用为nginx,且access.log日志的第一个字段为IP

        3、请自行更改 web日志目录 和 本脚本执行日志目录  XXXXXXXXXXXX内容,/开头结尾。

        4、请根据业务的实际请求,自行修改封禁关键字,防止误封。

        5、执行前请先执行白名单放行策略,再执行本脚本,防止误封。

        6、本脚本涉及iptables命令,需要放置在root用户中 crontab 定时任务中执行。

        7、本脚本会产生如下 执行日志:

                linshi1.txt   本次执行 根据封禁关键字,过滤的IP  (后续自动删除)

                linshi2.txt   本次执行 排序去重后的linshi1.txt文件,违规IP,并追加到yongjiu/${riQi}.txt  (自动覆盖)

                linshi3.txt  本次执行 拆分封禁IP 封禁时间(yongjiu/${riQi}_5.txt) 后的每条记录 (后续自动删除)

                yongjiu/${riQi}.txt  记录当天 执行结果内容,和违规IP   (每次追加)

                yongjiu/${riQi}_2.txt  记录当天去重后的违规IP  (自动覆盖)

                yongjiu/${riQi}_3.txt  记录当天防火墙存在的封禁IP (自动覆盖)

                yongjiu/${riQi}_4.txt  对linshi2.txt和_3文件比较,仅保留本次新的违规IP (自动覆盖)

                yongjiu/${riQi}_5.txt  记录当天封禁的IP与封禁时间文件 (每次追加)

测试效果:

  • 9
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
网上找了许久,下载了几个文档,然而都不能搭建好,这是我搭建好的,里面有配置文件:nginx.conf 用SSH Secure Shell远程终端将nginx-1.8.1.tar.gz以及依赖包openssl-1.0.1e-48.el6.x86_64.rpm、pcre-7.8-7.el6.x86_64.rpm、zlib-1.2.3-29.el6.x86_64.rpm上传到服务器目录/opt/ESB_InstallFiles/Nginx/下。 先安装依赖包: root@localhost Nginx]# yum install gcc-++ [root@localhost Nginx]# yum -y install zlib zlib-devel openssl openssl--devel pcre pcre-devel [root@localhost Nginx]# cd /usr/local/ [root@db local]# tar -zxv -f nginx-1.8.1.tar.gz [root@db local]# cd /usr/local/nginx/ [root@db nginx]# ./configure --prefix=/usr/local/nginx [root@db nginx-1.8.1]# make [root@db nginx-1.8.1]# make install 开放防火墙的这个端口 vi /etc/sysconfig/iptables 添加:-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT 重启iptables service iptables restart 开放一个范围的端口22到80 -A INPUT -m state --state NEW -m tcp -p tcp --dport 22:80 -j ACCEPT [root@db nginx-1.8.1] ./configure && make && make install [root@name Nginx]# rpm –ivh openssl-1.0.1e-48.el6.x86_64.rpm [root@name Nginx]# rpm –ivh pcre-7.8-7.el6.x86_64.rpm [root@name Nginx]# rpm –ivh zlib-1.2.3-29.el6.x86_64.rpm 再安装Nginx: [root@name Nginx]tar zxvf nginx-1.8.1.tar.gz [root@name Nginx] cd nginx-1.8.1 [root@db nginx-1.8.1] ./configure && make && make install 启动Nginx: 启动:/usr/local/nginx/sbin/nginx 停止/重新加载:/usr/local/nginx/sbin/nginx -s stop(quit、reload) 验证配置文件是否合法:/usr/local/nginx/sbin/nginx -t 命令帮助:/usr/local/nginx/sbin/nginx –h

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值