跳至内容
《Nginx 恶意攻击 IP 自动分析与封禁拦截器》

《Nginx 恶意攻击 IP 自动分析与封禁拦截器》

March 19, 2026

背景:Nginx 服务器遭到恶意爬虫的疯狂扫描,/var/log/nginx/error.log 文件瞬间暴增了上万行。 如果手动去找是哪些 IP 在攻击,然后一条条加进防火墙,费时费力

解决方案:通过Python自动化脚本运用 os 和 re库来自动化提取恶意IP;并放入Shell脚本中,根据实际情况决定是否执行脚本

操作:检查下列代码(有解释);并根据自身实际情况修改,将py代码与自身想要检索的日志放在同一个目录下

代码与逻辑:

import re

import os

  

#============配置区=============

LOG_FILE = 'error.log'

OUTPUT_FILE = 'ban_ips.sh'

THERESHOLD = 50        #报警阈值

WHERELIST = ['192.168.1.6', '10.0.0.6']          #白名单

#==============================

  

def main():

    ip_Regex = re.compile(r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}')

  

    ip_Counts = {}          #空字典当“计数器”

  
  
  

    print(f"正在分析日志文件: {LOG_FILE}")

    if not os.path.exists(LOG_FILE):

            print("找不到日志文件,请检查路径。")

            return

  

    with open(LOG_FILE, 'r', encoding='utf-8', errors='ignore') as file:

        for line in file:

                match = ip_Regex.search(line)

                if match:

                    ip = match.group()

                    if ip in WHERELIST:

                        continue

                    if ip in ip_Counts:

                        ip_Counts[ip] += 1

                    else:

                        ip_Counts[ip] = 1

  

    malicious_ips = []

    for ip, count in ip_Counts.items():

        if count >= THERESHOLD:

                malicious_ips.append(ip)

                print(f"发现恶意IP {ip} 攻击了 {count} 次!!!")

  

    if malicious_ips:

        with open(OUTPUT_FILE, 'w',  encoding='utf-8') as out_file:

                out_file.write("#!/bin/bash\n")

                out_file.write("# 自动生成的防火墙封禁脚本\n\n")

  

                for ip in malicious_ips:

                    cmd = f"firewall-cmd --permanent --add-rich-rule='rule family=\"ipv4\" source address=\"{ip}\" drop' \n "

                    out_file.write(cmd)

                out_file.write("\nfirewall-cmd --reload\n")

                out_file.write(f"echo '所有恶意ip已经被写入文件{OUTPUT_FILE}'\n")

  

        print(f"\n 已经生成封禁IP脚本{OUTPUT_FILE}")

        print(f" 您只需要执行:bash {OUTPUT_FILE} 即可封禁恶意IP")

    else:

        print("\n 日志很干净没有发现恶意IP")

  

if __name__ == '__main__':

     main()

执行结果如下:

终端中:
[root@SERVER nginx]# python3 ./ips_blocker.py
正在分析日志文件: error.log
发现恶意IP 141.101.69.127 攻击了 896 次!!!
发现恶意IP 172.71.126.94 攻击了 583 次!!!

 已经生成封禁IP脚本ban_ips.sh
 您只需要执行:bash ban_ips.sh 即可封禁恶意IP
Shell脚本中:
#!/bin/bash
自动生成的防火墙封禁脚本

firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="141.101.69.127" drop'
 firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="172.71.126.94" drop'

firewall-cmd --reload
echo '所有恶意ip已经被写入文件ban_ips.sh'