自從Raspberry Pi 的SSH暴露在公網上,天天有駭客暴力破解密碼,光顧到很煩人的程度,是時候研究fail2ban提升資安等級了。
安裝和設定
先用以下指令安裝 fail2ban 和 iptables:
sudo apt-get update sudo apt-get install -y fail2ban #安裝 fail2ban sudo apt-get install -y iptables #安裝 iptables
執行 sudo nano /etc/fail2ban/jail.d/defaults-debian.conf ,在該文件增加backend = systemd,使結果如下:
[sshd] backend = systemd enabled = true
#這非常重要,不然會啟動失敗~
*由於原開發者提示我們不要修改 /etc/fail2ban/filter.d/sshd.conf 文件,所以要新增其他文件客製化規則的設定。
執行 sudo nano /etc/fail2ban/jail.local 建立檔案,將以下內容複貼上:
[DEFAULT] ignoreip = 127.0.0.1 192.168.1.0/24 [sshd] enabled = true port = 22 logpath = /var/log/auth.log backend = systemd maxretry = 5 bantime = 1h findtime = 10m
#注意!其他Linux發行版不一定適用。
- ignoreip:不會被封鎖的IP,網段用空白字元分割,可以加入本機、區網電腦或公司的固定IP
- maxretry:錯誤嘗試次數
- bantime:封鎖時間,只有數字單位是秒,【-1】代表永久封鎖
- findtime:在多少時間以內,只有數字單位是秒
以此範例說明,某IP若在10分鐘內嘗試帳密錯誤達到5次,IP將被封鎖1小時。
然後:
sudo systemctl restart fail2ban
到這裡就大功告成~
此時, fail2ban就會將亂猜密碼的IP新增到iptables的規則裡,將其封鎖。
進階
1.加嚴規則
預設只針對短時間攻擊,但有些 bot 會避開 findtim,隔幾分鐘再試,為了專門鎖慣犯IP,可以加這個 jail.local再加入:
[recidive] enabled = true logpath = /var/log/fail2ban.log bantime = 7d findtime = 1d maxretry = 5
效果:一天內被鎖超過5次 → 直接鎖7天
用以下指令確認 [recidive] 規則是否啟用成功
sudo fail2ban-client status recidive
2.修改日誌時間
jail.local 在 [Recidive] 的運作依賴查看日誌 (/var/log/fail2ban.log),但Linux 對各套件的日誌有個預設打包時間,時間到了 fail2ban.log 就被系統給收走了,[Recidive] 規則也就失效;因此,可依需求調整日誌的保留時間。
sudo nano /etc/logrotate.d/fail2ban

weekly:可以改成 monthly(每月)、daily(每天),
rotate:保留多少份日志
如果以上文件改成 monthly和 rotate 2:保留2個月,一個月一份。
操作
1.查詢 fail2ban 運作情況
依據 → jail.local 建立的規則
sudo fail2ban-client status
#查看jail.local下的運作規則,例如:[sshd]
sudo fail2ban-client status sshd
#查看[sshd]過濾器和封鎖的結果
sudo fail2ban-client
#介紹指令的各種用法
sudo fail2ban-client get sshd banip
#查詢被封的IP
sudo fail2ban-client set sshd unbanip 192.168.100.104
#移除被封的IP
sudo fail2ban-client set sshd unbanip --all
#一次解封所有IP
sudo fail2ban-client get sshd ignoreip
#查詢白名單IP
sudo fail2ban-client set sshd addignoreip 192.168.100.20
#增加白名單IP
sudo fail2ban-client set sshd delignoreip 192.168.100.77
#移除白名單IP
sudo fail2ban-client start|stop
#啟動|停止所有 jail.local的規則
sudo fail2ban-client set sshd idle on|off
#啟用|停用 jail.local 裡的[sshd]規則
2. 管理 iptables
sudo iptables -L
#查看封鎖規則
sudo iptables -L --line-numbers
#查看封鎖規則(含編號)
sudo iptables -D f2b-sshd 1
#手動移除f2b-sshd下的1號規則(放行該IP)
3. 滾動日誌
sudo tail -f /var/log/fail2ban.log
#即時滾動日誌
即時監看訊息,可以看到入侵者一直亂猜密碼,然後被封鎖<-給你看心情好
4. 列出登入失敗資訊
sudo lastb -n 30
#列出近30筆登入失敗的資訊
看看入侵者用什麼帳號和IP嘗試登入
5. 開關 fail2ban
sudo systemctl start fail2ban
#開啟服務
sudo systemctl stop fail2ban
#停止服務
sudo systemctl restart fail2ban
#重啟服務
sudo systemctl disable fail2ban
#開機不啟動服務
sudo systemctl enable fail2ban
#開機自啟服務
後記
這裡就是一些觀念和我踩到的雷,如果你沒踩到可以不用看。
jail.local 規則順序/繼承
[DEFAULT]
↓(基礎規則)
[sshd]
↓(有寫就覆蓋,沒寫就繼承)
*可以想作[DEFAULT]是刑法這類的基本法條,而[sshd]是特別法
jail 檔案讀取順序
jail.conf → jail.local → jail.d/*.conf
jail.conf → 不要動(系統用)
jail.local → 只放「你要修改的部分」
踩到雷
我剛安裝好fail2ban居然無法順利運作,結果出現以下啟動失敗:

錯誤原因根據文獻[4],因為它將使用 systemd 作為後端,而不是 SSH 日誌檔案。請於/etc/fail2ban/jail.d/defaults-debian.conf 文件增加 backend = systemd ,這樣就能正常運作了。
參考資料
[1] How to fix fail2ban on Raspberry Pi OS


