Linux 服务器安全加固:使用 Firewalld 结合 IPSet 高效批量封禁恶意 IP 黑名单

2026-09-16 14:31 技术文章 76 阅读 分享


  在互联网上暴露的服务器,每天都会遭受来自全球各种扫描器、暴力破解工具和恶意 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 之外,网络上还有很多公开、高质量的威胁情报源。以下是主流的几类列表及其官方获取网址:

  1. FireHOL Level 1 (综合威胁源)

  2. FireHOL Level 2 (高频攻击源)

  3. Blocklist.de (暴力破解专杀)

  4. CI Army (恶意木马与扫描)

三、 实战:在 Firewalld 中初始化并导入黑名单

  我们可以通过 firewalld 的 ipset 功能将外部列表一网打尽。

步骤 1:创建一个专用的 ipset 集合

执行以下命令创建一个名为 firehol_lvl1 的网段哈希表:

Bash
firewall-cmd --permanent --new-ipset=firehol_lvl1 --type=hash:net

步骤 2:在防火墙中关联该集合并直接拒绝

  将整个 ipset 集合加入到系统防火墙的 drop(丢弃)区域中:

Bash
firewall-cmd --permanent --zone=drop --add-source=ipset:firehol_lvl1

四、 自动化维护脚本(清空、清洗、重新导入)

  由于威胁情报列表是实时变动的,我们需要定期拉取更新。为了防止下载的原始文件中包含 # 注释或空行导致导入报错,我们需要先对数据进行清洗。

创建一个名为 /root/update_blocklist.sh 的维护脚本:

Bash
#!/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 ==="

赋予脚本执行权限:

Bash
chmod +x /root/update_blocklist.sh

五、 设置定时自动更新 (Crontab)

  威胁情报具有时效性。为了让黑名单保持最新,可以通过系统的 crontab 定时任务让脚本每隔几天自动执行一次。

编辑定时任务:

Bash
crontab -e

  在文件末尾添加一行(例如设置为每隔 3 天的凌晨 3 点自动更新一次):

Code snippet
0 3 */3 * * /bin/bash /root/update_blocklist.sh >/dev/null 2>&1

  保存退出后,系统便会在后台静默维护这数千条安全防线,既解放了人工,又极大地净化了服务器的网络运行环境。


更多文章 下一页