在使用 Fail2Ban + ipset + iptables 的伺服器環境中,
很多人只備份了 iptables,卻忽略了 ipset。
結果在災難還原時發現:
- ✅ 規則還在
- ❌ 被封鎖的 IP 全部消失
這篇教學會完整說明:
- 為什麼要同時備份 iptables 與 ipset
- 正確備份方式
- 正確還原順序
- 建議自動化備份腳本
🔎 一、iptables 與 ipset 差在哪?
在 Fail2Ban 環境中實際架構是:
Fail2Ban
↓
ipset(存放被封鎖 IP 清單)
↓
iptables(引用 ipset)
↓
Linux Kernel 防火牆
✅ iptables 負責「規則」
例如:
-m set --match-set f2b-http-404-scan src -j DROP
意思是:
如果來源 IP 在這個 set 裡 → 就 DROP
✅ ipset 負責「IP 名單」
例如:
add f2b-http-404-scan 65.20.67.134
真正被封鎖的 IP 存在 ipset 裡。
🚨 二、常見錯誤
很多人只做:
iptables-save > /root/iptables.backup
但這只會備份規則,不會備份 ipset 內的 IP。
結果:
- 重開機後
- 或手動 restore 後
IP 清單消失。
✅ 三、正確完整備份方式
必須備份兩個部分。
✅ 1️⃣ 備份 iptables
bash
iptables-save > /root/iptables.backup
✅ 2️⃣ 備份 ipset
bash
ipset save > /root/ipset.backup
這個檔案會包含:
sql_more
create f2b-http-404-scan hash:ip
add f2b-http-404-scan 65.20.67.134
add f2b-http-404-scan 1.2.3.4
這才是真正的封鎖名單。
✅ 四、正確還原方式(非常重要)
⚠️ 還原順序不能錯。
✅ Step 1:先還原 ipset
bash
ipset restore < /root/ipset.backup
✅ Step 2:再還原 iptables
bash
iptables-restore < /root/iptables.backup
❗ 為什麼順序不能反?
因為:
iptables 規則會引用 ipset。
如果 ipset 不存在,會出現錯誤:
iptables: Set f2b-http-404-scan doesn't exist
✅ 五、建議每日自動備份
可以建立一個腳本:
nano /root/backup-firewall.sh
內容如下:
bash
#!/bin/bash
DATE=$(date +%F)
iptables-save > /root/fw-$DATE.iptables
ipset save > /root/fw-$DATE.ipset
給執行權限:
bash
chmod +x /root/backup-firewall.sh
加入 crontab:
bash
crontab -e
每天凌晨 3 點備份:
basic
0 3 * * * /root/backup-firewall.sh
✅ 六、如果發生誤封全站怎麼辦?
假設錯誤規則導致:
0.0.0.0/0 tcp dpt:80 DROP
網站全部無法連線。
只要執行:
bash
ipset restore < /root/ipset.backup
iptables-restore < /root/iptables.backup
30 秒內救回網站。
✅ 七、關於 Fail2Ban 的補充
如果你使用:
banaction = iptables-ipset-proto6-allports
Fail2Ban 重啟後會自動重建 ipset。
因此:
✅ 一般重開機不會遺失封鎖
✅ 但手動清空 firewall 會遺失
所以備份仍然是好習慣。
✅ 八、總結
| 項目 | 是否需要備份 |
|---|---|
| iptables | ✅ 必須 |
| ipset | ✅ 必須 |
| 只備份 iptables | ❌ 不完整 |
🎯 最重要一句話
iptables 只是規則
ipset 才是黑名單
兩個都要備份,才算完整防火牆備份。