《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 即可封禁恶意IPShell脚本中:
#!/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'