🛡️ 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
手動解除封鎖 IPsudo fail2ban-client set sshd unbanip 1.2.3.4
手動封鎖 IPsudo fail2ban-client set sshd banip 1.2.3.4
查看被封鎖的 IPsudo 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