🔐 Fail2Ban + iptables 防暴力破解實戰(SSH 與常見服務)
暴力破解(Brute-force)攻擊是常見的入侵手法,特別針對 SSH、FTP、和各種網路服務。本文用實務操作教你如何用 Fail2Ban 搭配 iptables 快速建立防護機制,含設定範例、測試方式與注意事項,適用於伺服器管理者與資安維運人員。
📌 文章重點(快速導覽)
- Fail2Ban 是什麼,以及如何與 iptables 整合
- 安裝與基本設定(Debian/Ubuntu 與 RHEL/CentOS 範例)
- 範例 jail 與自訂 action(block via iptables)
- 測試攻擊、查看封鎖記錄與解除封鎖
- 部署建議與進階防護要點
1️⃣ Fail2Ban 與 iptables:簡短說明
Fail2Ban 會監控日誌(如 /var/log/auth.log、/var/log/secure),當偵測到重複失敗登錄或可疑行為時,透過「action」呼叫系統防火牆(例如 iptables)把攻擊來源 IP 暫時封鎖。這種「即時偵測+動態封鎖」對抗暴力破解非常有效。
2️⃣ 安裝(快速指令)
以下提供 Debian/Ubuntu 與 RHEL/CentOS 的安裝指令:
# Debian / Ubuntu
sudo apt update
sudo apt install -y fail2ban iptables
# RHEL / CentOS / AlmaLinux
sudo yum install -y epel-release
sudo yum install -y fail2ban iptables
sudo systemctl enable --now iptables # 若使用 legacy iptables
3️⃣ 基本設定檔位置與工作流程
/etc/fail2ban/jail.conf:預設樣板(不要直接改,改用 jail.local)/etc/fail2ban/jail.local:放你的自訂 jail 與參數/etc/fail2ban/action.d/:定義封鎖方式(iptables、firewalld、ufw 等)
4️⃣ 範例:針對 SSH 的 jail.local
把以下內容加入 /etc/fail2ban/jail.local(或在 jail.d/ 建檔):
[DEFAULT]
# 全域預設
bantime = 3600 # 封鎖時間(秒)— 1 小時
findtime = 600 # 在多少秒內計算失敗次數 — 10 分鐘
maxretry = 5 # 超過失敗次數則封鎖
backend = auto
usedns = no
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 5
bantime = 3600
action = iptables-multiport[name=SSH, port="ssh", protocol=tcp]
5️⃣ iptables action 範例(預設通常已存在)
Fail2Ban 會使用 action.d/ 下的動作。系統通常已提供 iptables-multiport。若你想確認或自訂,可參考:
# 範例動作片段(簡化)
/sbin/iptables -I f2b- 1 -s -j DROP
# 或使用 REJECT
/sbin/iptables -I f2b- 1 -s -j REJECT --reject-with icmp-port-unreachable
6️⃣ 建立專用 iptables chain(Fail2Ban 自動建立)
啟用 Fail2Ban 並啟動 jail 後,Fail2Ban 會自動建立像是 f2b-sshd 的鏈(chain),並把對應規則加入 INPUT。你可以用以下指令檢視:
sudo iptables -L -n --line-numbers
sudo iptables -L f2b-sshd -n --line-numbers # 檢查 f2b 封鎖清單
7️⃣ 針對多服務(HTTP / vsftpd / postfix)範例 jail
[apache-auth]
enabled = true
port = http,https
filter = apache-auth
logpath = /var/log/apache2/error.log
maxretry = 3
bantime = 86400
[vsftpd]
enabled = true
port = ftp
filter = vsftpd
logpath = /var/log/vsftpd.log
maxretry = 5
bantime = 7200
[postfix]
enabled = true
port = smtp
filter = postfix
logpath = /var/log/mail.log
maxretry = 5
bantime = 7200
8️⃣ 測試與除錯
測試封鎖可以用模擬失敗登入或直接用測試 IP 觸發:
# 重啟 fail2ban 後檢查狀態
sudo systemctl restart fail2ban
sudo systemctl status fail2ban
# 查看 jail 狀態
sudo fail2ban-client status
sudo fail2ban-client status sshd
# 查看某 jail 的封鎖 IP 列表
sudo fail2ban-client status sshd
# 手動封鎖 / 解封
sudo fail2ban-client set sshd banip 1.2.3.4
sudo fail2ban-client set sshd unbanip 1.2.3.4
9️⃣ 進階:自訂 filter(範例為 SSH)
Filter 定義在 /etc/fail2ban/filter.d/sshd.conf。若要加入自訂偵測,可建立自訂 filter:
# /etc/fail2ban/filter.d/custom-ssh.conf
[Definition]
failregex = ^%(__prefix_line)s(?:error: PAM: )?Authentication failure for .* from (?: port \d*)?(?: ssh\d*)?$
^%(__prefix_line)sFailed password for .* from port \d+
ignoreregex =
🔟 測試攻擊(安全測試步驟)
請只在你自己的測試環境或取得許可的系統上執行模擬攻擊。下面示範如何用 sshpass 做多次錯誤密碼嘗試(會被封鎖):
# 安裝測試工具(測試環境)
sudo apt install -y sshpass
# 模擬錯誤登入 6 次(會觸發 maxretry)
for i in {1..6}; do
sshpass -p "wrongpassword" ssh -o StrictHostKeyChecking=no user@your-server.example.com exit
done
1️⃣1️⃣ 日誌與追蹤
Fail2Ban 的活動會寫入系統日誌(通常是 /var/log/fail2ban.log),同時會在 systemd journal 中有相關紀錄:
sudo tail -n 200 /var/log/fail2ban.log
sudo journalctl -u fail2ban -f
1️⃣2️⃣ 部署注意事項與最佳實務
- 避免誤封鎖內部 IP:對於可信任的內部網段可在
ignoreip中加入,如ignoreip = 127.0.0.1/8 10.0.0.0/8。 - 整合 fail2ban 與 firewalld / nftables:若系統使用 firewalld 或 nftables,請選擇相容的 action(如
firewalldaction 或 nftables action),避免同時混用 iptables legacy 與 nft。 - 監控與告警:把 fail2ban log 與封鎖事件推到集中化日誌或監控(如 ELK / Grafana Loki),以便統計攻擊來源與趨勢。
- 調整 bantime 與 maxretry:根據服務的重要性與流量模式決定封鎖時間;對於高風險服務可採長時間封鎖。
- 搭配多因素認證 (MFA):Fail2Ban 是阻擋自動化攻擊的好工具,但應與 SSH key + 2FA 一起使用,才能達到更強的保護。
1️⃣3️⃣ 常見問題(FAQ)
- Q:Fail2Ban 無效或不封鎖?
A:檢查 logpath 與 filter 的 failregex 是否對日誌格式匹配,並確認 fail2ban 有權讀取 log 檔。 - Q:如何永久封鎖特定 IP?
A:可直接在防火牆加入 DROP 規則,或在 fail2ban action 改為永久封鎖(bantime = -1)。 - Q:使用 cloud provider(如 AWS)時怎麼做?
A:在 cloud 中建議搭配 security group、WAF、以及集中化防護,fail2ban 適用於 instance 層面的即時封鎖。
📘 結語
Fail2Ban 與 iptables 的搭配能快速建立對抗暴力破解的第一道防線。這套方案部署成本低、回饋快,是大多數 Linux 伺服器的必備防護工具。下一步可考慮結合集中日誌、WAF 與 IAM 最佳實務,建立多層次的資安防護。
🔗 延伸閱讀
— WWFandy・系統安全與維運筆記
沒有留言: