版本: 7.0
这是一个功能强大的 Shell 脚本,旨在通过 iptables 和 ipset 构建一个智能、高效、且具备“自我学习”能力的主动防御防火墙体系。它不仅能加载静态的黑名单,更能深度整合 Fail2ban 的动态封禁能力,将临时发现的攻击者自动转化为永久屏蔽。
- ✨ 核心功能
- 🤔 工作原理:为什么这样更优秀?
- ⚙️ 系统要求
- 🚀 快速上手指南
- ✅ 如何验证结果
- 🤖 自动化运行 (Cron)
⚠️ 风险与重要注意事项- 🔧 故障排查 (Troubleshooting)
- ❌ 如何撤销所有屏蔽
- 自动化依赖管理: 自动检测并安装
iptables,ipset,curl,fail2ban及规则持久化工具。 - Fail2ban 深度整合:
- 自动安装、启动并启用
fail2ban服务。 - 自动读取
fail2ban当前封禁的所有 IP,并将其加入ipset黑名单。 - 高级日志分析: 优先使用
journalctl(适用于现代 systemd 系统) 查询 Fail2ban 全部历史日志。若不可用,则自动回退到文件系统,智能查找并解析所有轮转和压缩的日志文件 (.log,.log.1,.log.gz等),确保不遗漏任何历史封禁记录。
- 自动安装、启动并启用
- 批量文件读取: 自动处理脚本目录下的所有
.txt文件作为静态黑名单补充。 - 智能格式识别: 在
.txt文件中可混合处理独立 IP、IP 段 (CIDR) 和 ASN 编号。 - 高效屏蔽: 利用
ipset创建地址集合,仅用两条iptables规则即可屏蔽成千上万的 IP,性能极高。 - 支持 IPv4 和 IPv6: 自动创建并管理
blacklist_ipv4和blacklist_ipv6两个独立的黑名单集合。 - 规则持久化: 确保服务器重启后所有屏蔽规则(包括
ipset集合)依然有效。 - 幂等性设计: 脚本可安全地重复运行。自动去重,只进行增量更新。
- 详细日志记录: 所有关键操作都会记录到
/var/log/autoban.log文件中,便于审计和跟踪。 - 非破坏性: 尊重用户现有环境,不会卸载已安装的
fail2ban,并能为其自动创建基础配置。
传统的 fail2ban 为每一个被封禁的 IP 都创建一条独立的 iptables 规则。当封禁列表增长到数千个时,这会轻微影响网络性能。
本脚本采用 ipset 解决了这个问题:
- 性能提升:脚本将所有要屏蔽的 IP 添加到一个
ipset集合中。iptables只需一条规则:“凡是源地址在这个集合里的,全部丢弃”。查询ipset的效率远高于遍历成百上千条iptables规则。 - 自动学习与持久化:
fail2ban是出色的实时攻击检测器,但其封禁通常是暂时的。本脚本会定期扫描fail2ban的日志,将其发现的攻击者IP永久加入到ipset黑名单中,实现了防火墙的“自我学习”和“记忆强化”。
- 操作系统: 基于 Debian/Ubuntu 或 CentOS/RHEL 的 Linux 发行版。
- 权限: 需要
root或sudo权限。 - 网络: 需要互联网连接,用于下载软件包和查询 ASN 信息。
将脚本内容保存为 blocklist.sh,并赋予执行权限。
chmod +x blocklist.sh本脚本会安装 fail2ban,但不会配置它。一个最基础的配置是防护 SSH 暴力破解。
-
创建本地配置文件(避免升级时被覆盖):
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
-
编辑新创建的文件:
sudo nano /etc/fail2ban/jail.local
-
在文件中找到
[sshd]部分,确保其被启用且后端设置为systemd(这是最兼容的方式):[sshd] enabled = true backend = systemd
如果
jail.local是空的,直接将以上内容粘贴进去即可。 -
保存文件并重启
fail2ban服务:sudo systemctl restart fail2ban
现在,fail2ban 就会开始监控 SSH 登录失败,并自动封禁攻击者。
在与 blocklist.sh 相同的目录下,创建任意数量的以 .txt 结尾的文本文件(例如 scanners.txt, my_blocklist.txt)。
在文件中,每行输入一个您想屏蔽的条目。您可以将 IP、IP 段和 ASN 编号混合在一起。
示例 scanners.txt 文件内容:
# === Shodan Scanners ===
198.20.64.0/22
AS204996
# === A malicious IP I found ===
123.123.123.123
# === An IPv6 range to block ===
2602:80d:1000::/80以 root 权限执行脚本:
sudo ./blocklist.sh脚本将自动完成所有操作。
所有操作的摘要都会记录在这里:
tail -f /var/log/autoban.log您会看到类似这样的输出,清晰地标明了每个被添加 IP 的来源:
2025-09-13 10:30:01 - [实时封禁] 发现IP: 192.0.2.1 (来自Jail: sshd)
2025-09-13 10:30:02 - [历史日志] 发现IP: 198.51.100.10
2025-09-13 10:30:05 - [静态列表] 处理条目: AS12345
- 查看 IPv4 黑名单:
sudo ipset list blacklist_ipv4 - 查看 IPv6 黑名单:
sudo ipset list blacklist_ipv6
- IPv4:
sudo iptables -L INPUT -v -n --line-numbers - IPv6:
sudo ip6tables -L INPUT -v -n --line-numbers
您应该能在输出的第一行看到指向相应 ipset 集合的 DROP 规则。
将此脚本加入 cron 定时任务,即可实现黑名单的自动、增量更新。
- 打开
crontab编辑器:sudo crontab -e - 在文件末尾添加一行,例如设置每天凌晨3点运行:
请务必将
0 3 * * * /path/to/your/blocklist.sh/path/to/your/blocklist.sh替换为您脚本的绝对路径。
-
严重警告:ASN 封禁是一把双刃剑 屏蔽一个 ASN 意味着您会拒绝该 ASN 旗下的所有 IP 地址。这对于屏蔽扫描器非常高效,但也存在误伤的风险。例如,屏蔽了某个大型云服务商(如 AWS, Google Cloud)的 ASN,可能会导致您自己无法访问托管在该平台上的正常网站。请仅在明确了解后果的情况下屏蔽 ASN。
-
SSH 远程连接风险 操作防火墙时请务必保持一个备用的 SSH 连接,或通过物理控制台访问,以防意外将自己锁定。
-
防火墙冲突 在 CentOS/RHEL 系统上,本脚本会自动尝试禁用
firewalld。请确保您的服务器没有依赖firewalld的特殊配置。
- Fail2ban 无法启动: 运行
sudo journalctl -xeu fail2ban.service查看详细错误日志,通常是jail.local配置文件有语法错误。 - ASN 查询失败: 检查服务器的网络连接,并尝试手动
curl api.hackertarget.com看是否能通。
如果您想完全移除此脚本添加的屏蔽,请按以下步骤操作:
- 从
INPUT链中删除规则:# IPv4 sudo iptables -D INPUT -m set --match-set blacklist_ipv4 src -j DROP # IPv6 sudo ip6tables -D INPUT -m set --match-set blacklist_ipv6 src -j DROP
- 清空
ipset集合 (清除所有IP):sudo ipset flush blacklist_ipv4 sudo ipset flush blacklist_ipv6
- 销毁
ipset集合 (删除集合本身):sudo ipset destroy blacklist_ipv4 sudo ipset destroy blacklist_ipv6
- 持久化空规则 (重要):
# Debian/Ubuntu sudo netfilter-persistent save # CentOS/RHEL sudo service iptables save sudo service ip6tables save