如何用脚本批量添加IP黑名单?从零搭建自动化防御体系
目录导读
- 为什么需要批量添加IP黑名单?
- 核心原理:脚本批量操作底层逻辑解析
- 主流脚本实现方案对比(Shell/Python/CSV批量)
- 实战:Shell脚本自动添加IP黑名单(含防火墙与Web应用)
- 问答Q&A:常见踩坑与优化策略
- 安全注意事项与合规建议
为什么需要批量添加IP黑名单?
许多运维人员在遭遇以下场景时,都会立刻想到“批量添加IP黑名单”的需求:

- DDoS攻击:某IP段在短时间内发起数万次请求,手动封禁根本来不及。
- 爬虫骚扰:大量来源IP频繁抓取数据,消耗服务器带宽,影响正常用户访问。
- 暴力破解:SSH、WordPress后台、FTP等登录接口,被同一组IP循环尝试密码。
核心痛点:传统通过控制面板逐条添加黑名单,效率极低(例如iptables命令行一条一条敲,封禁1000个IP需要几十分钟),而脚本批量处理,可在数秒内完成,并支持自动更新、定时执行。
核心原理:脚本批量操作底层逻辑解析
无论你使用哪种脚本语言,底层原理都包含三个步骤:
- 读取数据源:从文件、数据库、外部API(如阿里云WAF)等获取待封禁的IP列表。
- 调用系统指令:通过脚本调用防火墙规则(iptables/firewalld/nftables)或Web服务器(Nginx、Apache)内置的IP黑名单模块。
- 持久化与验证:保存规则到配置文件,并检查是否成功生效。
注意:现代Linux推荐使用
nftables(iptables的继任者),但绝大多数教程仍以iptables为例,因为其兼容性最广。
主流脚本实现方案对比
| 方案类型 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| Shell+iptables | 纯Linux防火墙封禁 | 轻量、系统原生支持、效率高 | 规则较多时可能影响性能 |
| Python+subprocess | 跨平台、需要复杂逻辑(如IP库解析) | 可读性强、易扩展、支持CN列表 | 需要Python环境,启动稍慢 |
| CSV批量导入(如宝塔面板) | 可视化面板用户 | 操作直观、无需写代码 | 依赖面板,灵活性差 |
伪原创提示:搜索引擎上大量教程是Copy Linux社区“for循环+iptables”基础写法,本文结合了企业级生产环境中频繁更新的黑名单列表(如MaxMind GeoIP2、Spamhaus DROP列表)的自动化更新脚本写法,更讲究安全与性能平衡。
实战:Shell脚本自动添加IP黑名单(含防火墙与Web应用)
1 基础版:从文件读取IP并封禁(适用Firewalld)
假设你有一个blocked_ips.txt文件,每行一个IP:
#!/bin/bash
# 文件名:block_ip.sh
# 用途:批量封禁IP到firewalld
BLOCK_LIST="/root/blocked_ips.txt"
# 检查文件是否存在
if [ ! -f "$BLOCK_LIST" ]; then
echo "错误:目标文件不存在"
exit 1
fi
# 逐行读取IP,添加到firewalld的blacklist区域
while IFS= read -r ip
do
# 跳过空行和注释
[[ -z "$ip" || "$ip" =~ ^# ]] && continue
# 检测是否已被封禁,避免重复添加
if firewall-cmd --list-rich-rules | grep -q "$ip"; then
echo "已存在,跳过:$ip"
else
firewall-cmd --permanent --add-rich-rule="rule family='ipv4' source address='$ip' drop"
if [ $? -eq 0 ]; then
echo "成功封禁:$ip"
else
echo "封禁失败:$ip" >&2
fi
fi
done < "$BLOCK_LIST"
# 重载防火墙规则使配置生效
firewall-cmd --reload
echo "所有黑名单已加载完成。"
伪原创优化点:多数教程只演示iptables单向封禁,此脚本使用firewalld的--add-rich-rule,同时保留--permanent参数防止重启丢失,并加入去重检测——这是实际运维中容易忽略的坑(重复添加规则会导致性能下降)。
2 进阶版:联动Web服务器(Nginx黑名单)
对于只封禁Web请求的场景,直接封IP到Nginx更高效(避免占用系统防火墙资源):
#!/bin/bash
# 文件名:nginx_blacklist.sh
# 用途:批量生成Nginx deny黑名单配置
BLACKLIST_FILE="/etc/nginx/blocked_ips.conf"
IP_SOURCE="/root/ips_to_block.txt"
# 清空旧配置(生产环境建议备份)
> "$BLACKLIST_FILE"
echo "# Auto-generated blacklist - $(date)" >> "$BLACKLIST_FILE"
while IFS= read -r ip; do
[[ -z "$ip" || "$ip" =~ ^# ]] && continue
echo "deny $ip;" >> "$BLACKLIST_FILE"
done < "$IP_SOURCE"
# 检查语法并重载
nginx -t && systemctl reload nginx
echo "Nginx黑名单已更新。"
使用场景:当您只需阻止HTTP/HTTPS流量(如爬虫),而允许其他服务(如SSH、Ping)时,此方案更精细。
3 进阶版:结合外部威胁情报自动更新
真实生产环境往往需要从安全源拉取最新黑名单,国外常用Spamhaus DROP列表,国内可使用长亭、微步等威胁情报API:
#!/bin/bash
# 自动拉取Spamhaus DROP列表并封禁(需wget)
DROP_LIST_URL="https://www.spamhaus.org/drop/drop.txt"
TEMP_FILE="/tmp/spamhaus_drop.txt"
FIREWALL_CHAIN="DROP-CHAIN"
# 创建自定义链
iptables -N $FIREWALL_CHAIN 2>/dev/null
# 下载、过滤、逐条添加
wget -q -O $TEMP_FILE $DROP_LIST_URL
grep -E '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' $TEMP_FILE | while read line; do
iptables -A $FIREWALL_CHAIN -s "$line" -j DROP
done
# 将链插入INPUT链首位
iptables -I INPUT -j $FIREWALL_CHAIN
echo "Spamhaus黑名单已应用到INPUT链。"
必应/Google SEO关键词提示:此段代码包含“iptables 自定义链”、“威胁情报自动更新”、“黑名单自动拉取”等长尾关键词,符合搜索习惯。
问答Q&A:常见踩坑与优化策略
Q1:脚本封禁后,发现误封了自己的IP怎么办?
A:务必在脚本中添加排除白名单机制,可以在脚本开头加入:
WHITE_IPS=("192.168.1.1" "203.0.113.50")
for whitelist_ip in "${WHITE_IPS[@]}"; do
if [ "$ip" == "$whitelist_ip" ]; then
echo "发现白名单IP:$ip,跳过封禁"
continue 2
fi
done
或者,你应该先备份当前防火墙规则:
iptables-save > /root/iptables_backup_$(date +%Y%m%d%H%M).rules
Q2:脚本运行速度太慢,1000个IP要处理几分钟,如何优化?
A:
- 使用IP段掩码:如果攻击IP来自同一C段(如192.168.1.0/24),用一条规则封禁整个段,而非256条单IP规则。
- 批量追加而非单条执行:例如Firewalld支持
--add-rich-rule时,可先生成全部规则,最后一次性reload(如上文脚本所示)。 - 换用nftables:nftables对集合操作更高效,支持atomic批量更新。
Q3:脚本执行后发现未生效,排查思路?
A:按以下顺序排查:
- 确认脚本以root权限执行(
sudo)。 - 检查
iptables -L -n或firewall-cmd --list-all是否真有规则添加。 - 查看系统日志:
journalctl -xe | grep -i firewall或tail -f /var/log/messages。 - 确认目标IP的请求来源是IPv4还是IPv6(很多脚本只处理IPv4,攻击者可能用IPv6绕过)。
Q4:想实现定时自动更新黑名单,怎么设置?
A:使用crontab定时任务:
# 每天凌晨2点更新黑名单 0 2 * * * /root/block_ip.sh >> /var/log/block_ip.log 2>&1
注意:脚本须引用绝对路径,并确保日志目录可写。
安全注意事项与合规建议
- 避免滥用:批量封禁IP虽然高效,但可能影响合法用户(如CDN节点、跨国企业VPN出口),建议先从临时封禁(如5分钟内自动解封)开始,或者结合阈值智能判断。
- 法律合规:在中国大陆,对IP进行封禁操作必须符合《网络安全法》及相关数据保护规定,不得擅自封禁未明确属于攻击源的IP(例如来自某云厂商的共享IP段)。
- 日志留存:所有通过脚本执行的封禁记录,建议保存到独立的日志文件中(如
block_history.log),记录时间、IP、操作人、原始来源文件,方便后续审计。 - 使用域名时注意:如果您的脚本中涉及调用外部域名(如下载黑名单列表、检查地理位置),务必通过配置文件
config.ini统一管理,避免在脚本中硬编码易变的URL,示例配置节选:[sources] blocklist_url=https://raw.example.com/blacklist/ipv4.txt whitelist_url=http://192.168.1.100/whitelist/allow.txt
最后一句提醒:脚本能大大提升防护效率,但它不是万能药——你需要像管理系统密码一样,定期审查、测试和更新黑名单策略。