Fail2ban是一款用來阻擋使用暴力破解法登入伺服器的工具,最常被應用在SSH伺服器上。它會去檢查伺服器的日誌(Log),並將登入失敗的IP位址記錄下來,如果該IP在一段時間內錯了超過規定的次數,就會自動添加規則至防火牆中,阻擋該IP一段時間的連入。



安裝 Fail2ban

基於Debian的Linux發行版可以使用以下指令來安裝Fail2ban:

sudo apt install fail2ban

紅帽系的Linux發行版可以使用以下指令來安裝Fail2ban:

sudo dnf install fail2ban

執行以下指令在開機時自動啟動Fail2ban服務:

sudo systemctl enable fail2ban

執行以下指令立刻啟動Fail2ban服務:

sudo fail2ban-client start

設定 Fail2ban

如果您是使用基於Debian的Linux發行版,安裝完fail2ban套件後就已經啟用sshd的保護功能了。但還是可以參考這小節的說明來作設定。

Fail2ban的設定檔位於/etc/fail2ban目錄,設定檔支援的副檔名為.conf.local。副檔名.conf是預設的設定檔,副檔名.local是我們要修改設定值時要自行添加的設定檔。撰寫在.local設定檔的設定會覆寫掉.conf設定檔內原先的設定。

要設定sshd的保護,可以新增一個檔案,路徑為/etc/fail2ban/jail.d/sshd.local,檔案內容如下:

[sshd]
enabled = true

bantime = 10m
bantime.increment = true
bantime.maxtime = 1d

findtime = 10m

maxretry = 5

fail2ban-ssh

以上設定檔中,[sshd]是指這個區塊的欄位是用來設定sshd這個「jail」(一種稱呼某種用來限制存取的機制的常用名稱)。enabled = true表示要啟用這個jail。bantime是每次要封鎖的基本持續時間,m表示分鐘、h表示小時、d表示天,如果不寫單位的話,單位會是秒。bantime.increment = true是讓先前被封鎖過的IP再下一次被封鎖的時候拉長它的封鎖時間。bantime.maxtime是設定最大的封鎖時間。在findtime的時間內,如果有同樣的IP的錯誤嘗試次數超過maxretry所規定的次數,這個IP就會被封鎖。

設定好後可以執行以下指令讓Fail2ban重新載入設定檔:

sudo fail2ban-client reload

以下指令可以查看Fail2ban的狀態:

sudo fail2ban-client status

fail2ban-ssh

如上圖,可以看到sshd這個jail被啟用了。

解封IP

以下指令可以查看被關進sshd這個jail的IP有哪些:

sudo fail2ban-client status sshd

fail2ban-ssh

如上圖,可以看到192.168.56.1這個IP被封鎖了。如果要手動即時解封它,可以執行以下指令:

sudo fail2ban-client set sshd unbanip 192.168.56.1

或是用以下指令解封也可以,不過這個指令是把某個IP從所有jail中釋放出來:

sudo fail2ban-client unban 192.168.56.1

fail2ban-ssh

以下指令可以查看所有被Fail2ban封鎖的IP:

sudo fail2ban-client banned

以下指令可以解封所有被Fail2ban封鎖的IP:

sudo fail2ban-client unban --all

寄信通知

當有IP被封鎖的時候,Fail2ban可以主動發出電子郵件通知系統管理員,看要不要做什麼後續的處理。

如果要啟動寄信通知功能,可以編輯/etc/fail2ban/jail.d/sshd.local,進行如下的修改:

[sshd]
enabled = true

bantime = 10m
bantime.increment = true
bantime.maxtime = 1d

findtime = 10m

maxretry = 7

destemail = yourname@example.com
action = %(action_mwl)s

destemail可以設定要寄到的電子郵件信箱。action = %(action_mwl)s用來設定封鎖之後寄信。

注意,您的Linux作業系統必須要有寄信的能力,才能讓Fail2ban寄信。可以參考這篇文章來設定:

https://magiclen.org/linux-sendmail

設定完成後,使用以下指令重啟Fail2ban:

sudo fail2ban-client restart

如果只是使用fail2ban-client reload重新載入設定檔,貌似對寄信的設定是無效的。重啟Fail2ban後,如果Fail2ban能成功寄出信件,您應該會收到一封Fail2ban寄出的sshd這個jail被啟動的通知信,有收到的話表示Fail2ban的寄信通知功能可以正常使用。