Linux 命令工具 fail2ban 使用指南
目錄
- Linux 命令工具 fail2ban 使用指南
- 一、工具概述
- 二、安裝方式
- 1. 包管理器安裝(推薦)
- Debian/Ubuntu 系統
- CentOS/RHEL 系統
- Arch Linux 系統
- 2. 手動編譯安裝(適用于自定義需求)
- 三、核心功能
- 四、基礎用法
- 1. 配置文件結構
- 2. 啟用 SSH 防護(示例)
- 步驟 1:編輯服務配置
- 步驟 2:啟動服務
- 步驟 3:驗證狀態
- 五、進階操作
- 1. 自定義過濾規則
- 場景:防護 Web 服務(Nginx 惡意請求)
- 2. 自定義動作(郵件報警)
- 3. 多服務批量配置
- 六、實戰案例:防護 WordPress 登錄暴力破解
- 步驟 1:配置 WordPress 日志
- 步驟 2:創建過濾規則 `/etc/fail2ban/filters.d/wordpress.conf`
- 步驟 3:配置服務規則 `jail.d/wordpress.conf`
- 步驟 4:重啟服務使配置生效
- 案例二:防護 SSHD 服務暴力破解
- 步驟 1:檢查和調整默認配置
- 步驟 2:重啟 fail2ban 服務
- 步驟 3:驗證防護效果
- 七、注意事項
一、工具概述
fail2ban 是一款基于 Python 的 Linux 安全工具,主要用于監控系統日志文件,通過分析日志中的失敗登錄嘗試(如 SSH、FTP、Web 服務等),自動封禁頻繁嘗試登錄的 IP 地址,從而有效抵御暴力破解攻擊。其核心原理是通過正則表達式匹配日志中的失敗記錄,結合預設的過濾規則和動作(如調用 iptables
防火墻封禁 IP),實現自動化的安全防護。
二、安裝方式
1. 包管理器安裝(推薦)
Debian/Ubuntu 系統
sudo apt update
sudo apt install fail2ban
CentOS/RHEL 系統
sudo yum install epel-release # 若未安裝 EPEL 源
sudo yum install fail2ban
Arch Linux 系統
sudo pacman -S fail2ban
2. 手動編譯安裝(適用于自定義需求)
wget https://github.com/fail2ban/fail2ban/archive/refs/tags/v1.0.0.tar.gz # 替換為最新版本號
tar -zxvf v1.0.0.tar.gz
cd fail2ban-1.0.0
sudo python3 setup.py install
三、核心功能
功能模塊 | 說明 |
---|---|
日志監控 | 實時掃描指定日志文件(如 /var/log/sshd.log ),匹配失敗登錄模式。 |
過濾規則 | 通過正則表達式定義失敗登錄的匹配規則,支持自定義規則文件(.filter )。 |
動作執行 | 觸發封禁動作(如調用 iptables 、firewalld 或發送郵件報警),支持自定義動作(.action )。 |
封禁管理 | 支持設置封禁時間(bantime )、最大失敗次數(maxretry )和檢測間隔(findtime )。 |
多服務支持 | 內置常見服務(SSH、HTTP、FTP 等)的默認規則,可快速啟用防護。 |
四、基礎用法
1. 配置文件結構
/etc/fail2ban/
├── fail2ban.conf # 全局配置(一般不修改)
├── jail.conf # 服務配置模板(修改此文件或創建自定義文件)
├── jail.d/ # 自定義服務配置目錄(優先級高于 jail.conf)
├── filters.d/ # 過濾規則目錄
└── actions.d/ # 動作定義目錄
2. 啟用 SSH 防護(示例)
步驟 1:編輯服務配置
sudo nano /etc/fail2ban/jail.conf
在 [sshd]
部分取消注釋并配置參數:
[sshd]
enabled = true # 啟用服務
port = ssh # 監控端口(默認 22)
filter = sshd # 使用內置過濾規則
logpath = /var/log/sshd.log # 日志路徑
maxretry = 3 # 最大失敗次數
bantime = 3600 # 封禁時間(秒,默認 10 分鐘)
findtime = 600 # 檢測時間窗口(秒,默認 10 分鐘內)
步驟 2:啟動服務
sudo systemctl start fail2ban
sudo systemctl enable fail2ban # 開機自啟
步驟 3:驗證狀態
sudo fail2ban-client status sshd # 查看 SSH 服務防護狀態
sudo fail2ban-client banned # 查看當前封禁的 IP 列表
五、進階操作
1. 自定義過濾規則
場景:防護 Web 服務(Nginx 惡意請求)
- 創建過濾規則文件
/etc/fail2ban/filters.d/nginx-malicious.conf
:
[Definition]
failregex = ^<HOST> - .* "(GET|POST) /(admin|login|api) HTTP/1.1" 403
ignoreregex = # 可選:忽略特定模式
2. 自定義動作(郵件報警)
- 修改動作文件
/etc/fail2ban/actions.d/mail-action.conf
:
[Definition]
actionstart = sendmail -t <<EOF
From: fail2ban <alert@example.com>
To: admin@example.com
Subject: fail2ban startedService: <service>
EOFactionban = sendmail -t <<EOF
From: fail2ban <alert@example.com>
To: admin@example.com
Subject: [Banned] <ip> tried to attack <service>IP: <ip>
Service: <service>
Time: < bantime >
EOF
3. 多服務批量配置
在 jail.conf
中添加通用配置:
[DEFAULT]
bantime = 28800 # 全局封禁時間(8 小時)
findtime = 3600 # 全局檢測窗口(1 小時)[ssh]
enabled = true
port = 22,2222 # 監控多個端口[ftp]
enabled = true
port = ftp,ftps
logpath = /var/log/xferlog
六、實戰案例:防護 WordPress 登錄暴力破解
步驟 1:配置 WordPress 日志
確保 WordPress 啟用調試日志(在 wp-config.php
中添加):
define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
步驟 2:創建過濾規則 /etc/fail2ban/filters.d/wordpress.conf
[Definition]
failregex = ^.*POST /wp-login.php.*(Invalid username|The password you entered for the username).*IP: <HOST>
ignoreregex =
步驟 3:配置服務規則 jail.d/wordpress.conf
[wordpress]
enabled = true
port = http,https
filter = wordpress
logpath = /var/www/wordpress/wp-content/debug.log
maxretry = 5
bantime = 43200 # 封禁 12 小時
步驟 4:重啟服務使配置生效
sudo systemctl restart fail2ban
案例二:防護 SSHD 服務暴力破解
假設服務器近期頻繁遭受 SSHD 服務的暴力破解嘗試,導致系統負載升高,為保障服務器安全,利用 fail2ban 進行防護。
步驟 1:檢查和調整默認配置
一般情況下,fail2ban 安裝后對 SSHD 服務有默認配置,但可能需根據實際情況調整。打開 /etc/fail2ban/jail.conf
或 /etc/fail2ban/jail.d/sshd.conf
(若存在)文件。
sudo nano /etc/fail2ban/jail.d/sshd.conf
確認或修改以下關鍵參數:
\[sshd]enabled = true port = ssh filter = sshd logpath = /var/log/sshd.log maxretry = 3 bantime = 3600 findtime = 600 
這里將 maxretry
設置為 3,表示 600 秒(findtime
)內,若同一 IP 地址登錄失敗超過 3 次,該 IP 將被封禁 3600 秒(bantime
)。
步驟 2:重啟 fail2ban 服務
配置完成后,重啟 fail2ban 服務使新配置生效。
sudo systemctl restart fail2ban
步驟 3:驗證防護效果
使用另一臺主機模擬錯誤的 SSH 登錄嘗試,故意輸入錯誤密碼多次。隨后,通過以下命令查看 SSHD 服務的 fail2ban 狀態:
sudo fail2ban-client status sshd
若配置生效,可看到 Currently failed
(當前失敗次數)和 Total failed
(總失敗次數)增加,當達到 maxretry
設定值后,該 IP 會被封禁,Currently banned
(當前封禁數)和 Banned IP list
(封禁 IP 列表)中會出現對應信息。若需解除對某個 IP 的封禁,可使用以下命令:
sudo fail2ban-client set sshd unbanip \<ip\_address>
將 <ip_address>
替換為實際被封禁的 IP 地址。通過上述配置和操作,可有效利用 fail2ban 防護 SSHD 服務,抵御暴力破解攻擊,保障服務器安全。
七、注意事項
-
誤封處理:
- 使用
sudo fail2ban-client set sshd unbanip <ip>
解封指定 IP。 - 添加白名單:在
jail.conf
中配置ignoreip = 192.168.1.0/24 10.0.0.0/8
(允許內網 IP)。
- 使用
-
性能優化:
- 避免監控過大的日志文件,可通過
logrotate
定期切割日志。 - 減少正則表達式復雜度,避免過度消耗 CPU 資源。
- 避免監控過大的日志文件,可通過
-
規則測試:
- 使用
fail2ban-regex <logfile> <filterfile>
驗證規則匹配效果:fail2ban-regex /var/log/sshd.log /etc/fail2ban/filters.d/sshd.conf
- 使用
-
防火墻依賴:
- 確保
iptables
或firewalld
已啟用,且 fail2ban 有權限操作防火墻。 - 若使用
firewalld
,需在動作中指定action = firewallcmd-ipset
。
- 確保
-
日志權限:
- 確保 fail2ban 服務用戶(默認
fail2ban
)有讀取日志文件的權限。
- 確保 fail2ban 服務用戶(默認
通過合理配置 fail2ban,可顯著提升系統抵御暴力破解的能力,同時結合定期審計封禁日志和優化過濾規則,能進一步增強安全防護的準確性和有效性。