脚本怎样批量管理IP黑名单:从手动封禁到自动化运维的完整指南
目录导读

- 为什么需要批量管理IP黑名单?
- 核心原理:脚本与黑名单数据库的协同机制
- 实战脚本方案:Shell、Python、自动化工具对比
- 集成防火墙与CDN:Nginx、iptables、Cloudflare联动
- 问答环节:常见脚本错误与性能陷阱
- 扩展应用:基于日志分析的动态黑名单生成
- 最佳实践:从10个IP到10万级黑名单的优化策略
为什么需要批量管理IP黑名单?
对于运行Web服务的运维人员来说,IP黑名单是抵御恶意爬虫、暴力破解、CC攻击的第一道防线,手动封禁单个IP效率低下,当IP量级突破1000个后,手动操作几乎不可行。脚本化批量管理能实现以下目标:
- 自动化读取攻击IP列表,批量写入防火墙规则
- 定时刷新黑名单,防止误封恢复或新增攻击源
- 统一管理多台服务器(负载均衡、CDN、云端节点)
核心痛点:不同环境(Linux/Windows、云原生/物理机)的黑名单管理接口差异大,如何用一套脚本覆盖90%场景?
核心原理:脚本与黑名单数据库的协同机制
批量管理IP黑名单的典型流程是:
- 数据源:从日志(Nginx access log、Fail2ban、WAF日志)或第三方威胁情报API提取恶意IP
- 脚本引擎:Shell(简单快速)、Python(复杂逻辑与API调用)、Ansible(多机分发)
- 执行接口:防火墙(iptables/nftables)、服务配置(Nginx deny、Apache .htaccess)、云厂商API(安全组、ACL)
关键数据格式:
- 纯IP列表(每行一个IP)
- CIDR子网(如192.168.1.0/24)
- JSON结构(含时间戳、来源、封禁原因)
实战脚本方案:Shell、Python、自动化工具对比
方案1:Shell脚本 + iptables(适合单机快速封禁)
#!/bin/bash
BLACKLIST_FILE="/path/to/blacklist.txt"
# 读取每行IP,添加至iptables黑名单链
while IFS= read -r ip; do
if [[ $ip =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
iptables -A INPUT -s "$ip" -j DROP
fi
done < "$BLACKLIST_FILE"
优点:无需依赖,执行快
缺点:单机态,不支持云安全组,重启规则丢失
方案2:Python脚本支持多平台(重点推荐)
import subprocess
import re
def ban_ip(ip):
# 支持iptables、云API、Nginx配置
subprocess.run(["iptables", "-A", "INPUT", "-s", ip, "-j", "DROP"])
# 兼容Cloudflare API(需配置Token)
# requests.post("https://api.cloudflare.com/client/v4/zones/{zone_id}/firewall/access_rules/rules")
优势:可集成日志分析,动态生成黑名单,支持IO复用
方案3:Ansible批量分发(多服务器场景)
- name: 批量添加IP至iptables
hosts: all
tasks:
- name: 读取本地黑名单文件
set_fact:
ban_ips: "{{ lookup('file', '/etc/blacklist.txt').split('\n') }}"
- name: 添加防火墙规则
iptables:
chain: INPUT
source: "{{ item }}"
jump: DROP
loop: "{{ ban_ips }}"
集成防火墙与CDN:Nginx、iptables、Cloudflare联动
单一黑名单管理工具不够——攻击往往来自全球,需要多层防御:
-
Nginx黑名单:在
http/server块加入include /etc/nginx/blacklist.conf; # 内容:deny 192.168.1.1; deny 10.0.0.0/24;
脚本定期通过
sed或awk更新.conf文件,然后nginx -s reload -
Cloudflare防火墙规则:利用API批量创建IP规则,覆盖DDoS和爬虫
import requests url = "https://api.cloudflare.com/client/v4/zones/{zone_id}/firewall/access_rules/rules" payload = { "mode": "block", "configuration": {"target": "ip", "value": "1.2.3.4"}, "notes": "manual block via script" }
问答环节:常见脚本错误与性能陷阱
Q1:脚本运行后,新加入的黑名单IP未被封禁?
A:检查两点:
- 脚本是否成功写入防火墙规则(
iptables -L INPUT -n | grep <IP>) - 云安全组是否覆盖了最新规则(云API需要确认
apply操作)
Q2:黑名单文件太大(超过1万条),脚本卡死怎么办?
A:采用分批策略:每500个IP为一组,用xargs -P并发执行;或者用iptables的ipset(内存哈希表,性能提升100倍):
ipset create blacklist hash:ip maxelem 100000 ipset add blacklist 1.1.1.1 iptables -A INPUT -m set --match-set blacklist src -j DROP
Q3:如何避免误封白名单IP(如搜索引擎爬虫)?
A:脚本中集成白名单过滤:
whitelist = ['66.249.66.1', '5.9.98.0/24'] # Googlebot
if ip not in whitelist:
ban_ip(ip)
扩展应用:基于日志分析的动态黑名单生成
被动封禁IP是落后策略——主动分析日志流量,实时生成黑名单才是高级运维:
- 工具组合:
tail -f access.log | awk '{print $1}' | sort | uniq -c | sort -rn统计高频IP - 阈值触发:如果某IP在10分钟内请求超过200次,自动加入黑名单
- 示例脚本:
# 日志分析+自动封禁(每5分钟运行) awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -50 | awk '$1>500 {print $2}' > /tmp/black.tmp cat /tmp/black.tmp >> /etc/blacklist.txt
最佳实践:从10个IP到10万级黑名单的优化策略
- 结构优化:将黑名单拆分为“临时封禁”(24h自动过期)和“永久封禁”
- 存储迁移:从文本文件改为Redis Sorted Set(支持TTL和IP去重)
- 定时任务:每15分钟用
crontab执行脚本,并记录日志以便回溯 - 灰度机制:先通知封禁(如Nginx返回403),确认无误后再硬性阻断
- 备份与回滚:每次修改前备份当前iptables规则:
iptables-save > /backup/rules.$(date +%Y%m%d%H%M%S)
批量管理IP黑名单的核心不是“写脚本”,而是建立数据获取-规则校验-执行封禁-监控反馈的闭环,从单机Shell到分布式安全组,脚本只是导管,真正的价值在于自动化编排与安全策略的实时对齐。