在实际运维中,Fail2ban 不只是一个防护工具,它还是一台服务器长期遭受攻击后形成的“安全记忆库”。当更换或迁移 VPS 时,如果只重新安装 Fail2ban 而不迁移其历史状态,就等于让攻击者从零开始重新测试新服务器的防御边界。
本文介绍一种可验证、可复现、可迁移的 Fail2ban 完整状态迁移方法。
一、Fail2ban 的真实数据在哪里
Fail2ban 的运行状态由两部分构成:
| 类型 | 目录 |
|---|---|
| 配置与规则 | /etc/fail2ban |
| 封禁状态与历史 | /var/lib/fail2ban |
其中 /var/lib/fail2ban 通常包含一个 SQLite 数据库,用于存储:
- 当前被封禁的 IP
- 各 jail 的失败计数
- 封禁时间与解封时间
这是 Fail2ban 最重要的“资产”。
二、为什么不能在运行时备份
Fail2ban 在运行中会持续写入数据库:
- 新 IP 被封
- 旧 IP 解封
- 失败次数更新
如果在运行中直接复制数据库文件,极容易得到:
- 半写入的数据库
- 未合并的 WAL
- 不一致的 SQLite 状态
这会导致迁移后 Fail2ban 启动失败或悄然失效。
因此,正确做法是:
先停服务,再备份数据。
三、确认 Fail2ban 运行模式
Fail2ban 有两种运行模型:
| 模式 | 特征 |
|---|---|
| root 模式 | 系统中没有 fail2ban 用户 |
| 非 root 模式 | 存在 fail2ban 用户,systemd 中有 User=fail2ban |
可以通过以下方式确认:
getent passwd fail2ban
ps -eo user,group,comm | grep fail2ban
systemctl cat fail2ban | grep -i user
在某些云 VPS 或老系统中,Fail2ban 以 root 身份运行,这是完全合法且安全的配置。
四、正确备份方式
在源服务器上:
systemctl stop fail2ban
tar -czvf /root/fail2ban-full-backup.tar.gz \
/etc/fail2ban \
/var/lib/fail2ban
这个压缩包包含了:
- 所有 jail 规则
- 所有过滤器
- 所有封禁 IP
- 所有失败计数
等同于 Fail2ban 的“完整灵魂”。
五、在新 VPS 上恢复
在新服务器上安装 Fail2ban 后:
systemctl stop fail2ban
tar -xzvf fail2ban-full-backup.tar.gz -C /
然后根据运行模式设置权限:
如果是 root 模式
chown -R root:root /etc/fail2ban /var/lib/fail2ban
如果是 fail2ban 用户模式
chown -R root:root /etc/fail2ban
chown -R fail2ban:fail2ban /var/lib/fail2ban
最后启动:
systemctl start fail2ban
验证:
fail2ban-client status
如果看到原有 jail 和原有 banned IP 数量,说明迁移成功。
六、这种迁移方式的意义
大多数 VPS 迁移流程是:
换机器 → 重新安装 Fail2ban → 攻击者重新开始扫描
而完整迁移 Fail2ban 的方式是:
换机器 → 直接继承原服务器的攻击历史 → 攻击者立刻被旧黑名单拦截
这相当于把一台“经历过真实互联网攻击的服务器防御体系”整体复制到新环境,是生产级运维中非常少见但极其高价值的做法。