在互联网上暴露的服务器,每天都会遭受来自全球各种扫描器、暴力破解工具和恶意 IP 的骚扰。利用开源的恶意 IP 威胁情报列表(如 FireHOL 集合)在网络层直接拦截,是一种简单且极其高效的防御手段。 
本文将带你揭秘 Linux 内核的底层机制,并手把手教你如何通过 firewalld + ipset 实现高效的自动化黑名单封禁与更新。
一、 性能迷思:几千条甚至上万条 IP 规则会影响系统性能吗?
结论:完全不会。
在早期的老旧 iptables 时代,如果把几千个 IP 写成一条条平铺的规则,防火墙需要对每个进来的数据包进行线性遍历(一条一条比对),这确实会导致 CPU 飙升。
但现代 Linux 系统(配合 firewalld)在处理大批量 IP 名单时,底层默认采用的是 ipset(内核级哈希表 Hash Map)。
-
O(1) 查找复杂度:哈希表的检索性能与条目数量几乎无关。无论你的列表里是 4,000 条还是 400,000 条 IP,内核查找的时间开销都是恒定的。
-
极低的内存占用:几千条网段(CIDR)或 IP 在内存中通常仅占用几兆空间,对于现代云服务器而言可以说是九牛一毛。
二、 常见的开源恶意 IP 列表(Threat Feeds)与获取网址
除了常用的 firehol_level1.netset 之外,网络上还有很多公开、高质量的威胁情报源。以下是主流的几类列表及其官方获取网址:
-
FireHOL Level 1 (综合威胁源)
-
特点:聚合了数十个高信誉威胁源(如 DShield、Blocklist.de 等)中近期最活跃的恶意 IP 和网段,误报率极低。
-
官方网址 / 下载地址:https://github.com/firehol/blocklist-ipsets/blob/master/firehol_level1.netset
-
-
FireHOL Level 2 (高频攻击源)
-
特点:追踪过去 48 小时内频繁发起攻击的 IP 集合,比 Level 1 更激进,适合近期遭受密集扫描的业务。
-
官方网址 / 下载地址:https://github.com/firehol/blocklist-ipsets/blob/master/firehol_level2.netset
-
-
Blocklist.de (暴力破解专杀)
-
特点:专注于收集针对 SSH、FTP、Mail、Web(如 WordPress、phpMyAdmin)进行暴力破解和密码爆破的主机 IP。
-
官方网址 / 下载地址:https://raw.githubusercontent.com/firehol/blocklist-ipsets/master/blocklist_de.ipset
-
-
CI Army (恶意木马与扫描)
-
特点:集中收集各类恶意攻击、网络扫描器、木马控制端(C&C)的 IP 地址。
-
官方网址 / 下载地址:https://raw.githubusercontent.com/firehol/blocklist-ipsets/master/ciarmy.ipset
-
三、 实战:在 Firewalld 中初始化并导入黑名单
我们可以通过 firewalld 的 ipset 功能将外部列表一网打尽。
步骤 1:创建一个专用的 ipset 集合
执行以下命令创建一个名为 firehol_lvl1 的网段哈希表:
firewall-cmd --permanent --new-ipset=firehol_lvl1 --type=hash:net
步骤 2:在防火墙中关联该集合并直接拒绝
将整个 ipset 集合加入到系统防火墙的 drop(丢弃)区域中:
firewall-cmd --permanent --zone=drop --add-source=ipset:firehol_lvl1
四、 自动化维护脚本(清空、清洗、重新导入)
由于威胁情报列表是实时变动的,我们需要定期拉取更新。为了防止下载的原始文件中包含 # 注释或空行导致导入报错,我们需要先对数据进行清洗。
创建一个名为 /root/update_blocklist.sh 的维护脚本:
#!/bin/bash
# 1. 定义配置变量
IPSET_NAME="firehol_lvl1"
URL="https://raw.githubusercontent.com/firehol/blocklist-ipsets/master/firehol_level1.netset"
TMP_FILE="/tmp/firehol_level1.txt"
CLEAN_FILE="/tmp/clean_ips.txt"
# 2. 下载最新的 IP/网段列表
echo "正在下载最新恶意 IP 列表..."
curl -s -L "$URL" -o "$TMP_FILE"
if [ $? -ne 0 ]; then
echo "错误:IP 列表下载失败!"
exit 1
fi
# 3. 过滤掉注释行(#)和空行,生成干净的纯 IP/CIDR 列表
grep -vE "^#|^$" "$TMP_FILE" > "$CLEAN_FILE"
TOTAL_IPS=$(wc -l < "$CLEAN_FILE")
# 4. 原子化更新:清空旧的永久 ipset 规则条目,并批量导入新条目
echo "正在更新防火墙 ipset 规则,共计 $TOTAL_IPS 条..."
firewall-cmd --permanent --ipset=$IPSET_NAME --flush
firewall-cmd --permanent --ipset=$IPSET_NAME --add-entries-from-file="$CLEAN_FILE"
# 5. 重新加载防火墙使规则立即生效
firewall-cmd --reload
# 6. 清理临时文件
rm -f "$TMP_FILE" "$CLEAN_FILE"
echo "=== Firehol Level 1 黑名单同步完成!当前条目数: $TOTAL_IPS ==="
赋予脚本执行权限:
chmod +x /root/update_blocklist.sh
五、 设置定时自动更新 (Crontab)
威胁情报具有时效性。为了让黑名单保持最新,可以通过系统的 crontab 定时任务让脚本每隔几天自动执行一次。
编辑定时任务:
crontab -e
在文件末尾添加一行(例如设置为每隔 3 天的凌晨 3 点自动更新一次):
0 3 */3 * * /bin/bash /root/update_blocklist.sh >/dev/null 2>&1
保存退出后,系统便会在后台静默维护这数千条安全防线,既解放了人工,又极大地净化了服务器的网络运行环境。