🛡️ Fail2ban
自動封鎖暴力破解登入嘗試
Fail2ban 持續監控系統日誌,當偵測到同一 IP 在短時間內多次認證失敗,自動新增 iptables/UFW 規則封鎖該 IP,保護 SSH、Nginx、Postfix 等服務。
安裝
$ sudo apt update && sudo apt install -y fail2ban
sudo systemctl enable --now fail2ban設定說明
Fail2ban 採用「不要修改 .conf,改用 .local 覆蓋」的設計:
$ sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo vim /etc/fail2ban/jail.local[DEFAULT]
# 封鎖 IP 的時間(秒,-1 = 永久封鎖)
bantime = 3600
# 計算失敗次數的時間視窗(秒)
findtime = 600
# 在 findtime 內允許的最大失敗次數
maxretry = 5
# 永不封鎖的 IP 或子網路
ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24
# 使用 UFW 或 iptables 封鎖(依系統選擇)
banaction = ufw常用 Jail 設定
[sshd]
enabled = true
port = 22 # 若 SSH 改了 port,在這裡修改
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 86400 # SSH 失敗封鎖 24 小時
[nginx-http-auth]
enabled = true
filter = nginx-http-auth
logpath = /var/log/nginx/error.log
maxretry = 5
[nginx-req-limit]
enabled = true
filter = nginx-req-limit
logpath = /var/log/nginx/error.log
maxretry = 10
findtime = 60
bantime = 7200$ sudo systemctl restart fail2ban管理與操作
| 操作 | 指令 |
|---|---|
| 查看所有 jail 狀態 | sudo fail2ban-client status |
| 查看 SSH jail 詳細 | sudo fail2ban-client status sshd |
| 手動解除封鎖 IP | sudo fail2ban-client set sshd unbanip 1.2.3.4 |
| 手動封鎖 IP | sudo fail2ban-client set sshd banip 1.2.3.4 |
| 查看被封鎖的 IP | sudo fail2ban-client status sshd | grep "Banned IP" |
| 查看日誌 | sudo tail -f /var/log/fail2ban.log |
| 測試正規表示式 | sudo fail2ban-regex /var/log/auth.log sshd |
自訂 Jail(以 Nginx 暴力登入為例)
$ sudo vim /etc/fail2ban/filter.d/nginx-login.conf[Definition]
failregex = ^ -.*POST /login HTTP/\d\.\d" (401|403)
ignoreregex = $ # 在 jail.local 加入
sudo vim /etc/fail2ban/jail.local[nginx-login]
enabled = true
filter = nginx-login
logpath = /var/log/nginx/access.log
maxretry = 10
findtime = 120
bantime = 3600$ # 測試 filter 是否正確抓到失敗記錄
sudo fail2ban-regex /var/log/nginx/access.log /etc/fail2ban/filter.d/nginx-login.conf