讓 fail2ban 可以設定永久 ban 名單

小蛙重啟 fail2ban 的時候,發現重啟要非常久,一開始不怎麼了解 fail2ban 的運作,後來從 /var/log/fail2ban.log 看見,每次重啟都會先把所有的 IP unban,重啟完成之後再去掃描 log,把符合的加入 ban 清單中。

小蛙一直有一個疑問,貌似 fail2ban 重啟之後加回 ban 清單的 IP 列表,是重新從目前的 log 中掃出來的,對小蛙來說,這些「不速之客」就是應該被永久 ban 掉,如果不小心自己被 ban 了,也可以透過 自己被 Fail2ban 封鎖的解決方法 來解救自己,但是 fail2ban 重啟或重開機之後,得到的 ban 清單卻是當下的 log,而小蛙的 log 會自己截斷,也就是幾天前、上周、上月 … 等被 ban 的 IP,因為重開機之後又起死回生了 … ( 小蛙沒有實際測試,不過看起來沒有地方儲存這些資料,有很大的這種可能性 )

於是在網路上找到了這篇 Configure Fail2Ban for permanent and persistent bans 教學,這裡強調需要修改的東西很簡單,小蛙實際做了也很簡單,閱讀英文沒有問題的朋友可直接點過去,這邊小蛙記錄作法跟遇到的問題。

設定永久封鎖

以小蛙的 Ubuntu 16.04 為例,fail2ban 設定檔放在 /etc/fail2ban/jail.conf,在 [DEFAULT] 以下,直到下一個區塊(例如:[sshd]) 之前都是屬於上面區塊的設定,而下方區塊的設定會覆蓋上方區塊的,例如:[DEFAULT]設定了 bantime = -1,但是在 [sshd]區塊中又設定 bantime = 60,則 sshd 服務中會以該區塊地為主,總之[DEFAULT]就是所有的基礎設定,要設定永久封鎖很簡單,只要設定 bantime = -1 就可以了。

建立永久封鎖清單

上面提到說只要重啟或是重新開機,所有的封鎖清單就會 unban 掉,也就是下次開啟之後,封鎖清單是空白的,fail2ban 再依照設定的時間、服務類型、log 位置 … 等資訊慢慢一個一個 ban 回去,該文章使用的方式是在 ban 的當下,讓 fail2ban 多寫一個叫做persistent.bans的檔案,這樣下次重開機或是重啟 fail2ban 的時候,雖然原本 ban 的會先 unban,但是手上還是有封鎖清單,再讓 fail2ban 把它們 ban 回去就好了,雖不完美,但是的確可以達到小蛙的需求,確定之後就著手設定。

首先,建立 /etc/fail2ban/persistent.bans 檔案,要改別的名字或放別的地方也可以,只是後面的路徑要記得跟著改就是了。

設定載入及增加清單

fail2ban 是透過 /etc/fail2ban/action.d/iptables-multiport.conf 來做 ban IP 的,我們需要做

  • 在 fail2ban 啟動時呼叫的 actionstart 中加載永久封鎖清單
  • 在 fail2ban 做 ban IP 動作的時候,將該 IP 寫入永久封鎖清單中

在上述檔案中找到 actionstart 在既有的動作下,加入 4, 5 兩行

actionstart = <iptables> -N f2b-<name>
			  <iptables> -A  f2b-<name> -j <returntype>
			  <iptables> -I <chain> -p <protocol> -m multiport --dports  <port> -j <name> cat  /etc/fail2ban/persistent.bans | awk '/^fail2ban-<name>/ {print $2}' \ | while read IP; do iptables -I fail2ban-<name> 1 -s $IP -j <blocktype>; done

接著在 actionban 既有動作下,加入第二行

actionban = <iptables> -I f2b-<name> 1 -s <ip> -j <blocktype> echo "fail2ban-<name> <ip>" >> /etc/fail2ban/persistent.bans

再來重啟 fail2ban 就大功告成了,小蛙這邊之前一直測試都失敗 … 後來才發現 … 自己加錯加到 actionunban 後面 … 難怪怎麼樣 persistent.bans 都不會有內容啊 …

後續更新

2018-11-19 發現會有重複 IP 的問題,找到解決方法後會再更新上來。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *