本篇文章更新時間:2022/06/05
如有資訊過時或語誤之處,歡迎使用 Contact 功能通知。
一介資男的 LINE 社群開站囉!歡迎入群聊聊~
如果本站內容對你有幫助,歡迎使用 BFX Pay 加密貨幣 或 新台幣 贊助支持。
前篇 [VPS] WordPress 網站主機群防護升級的作法 一文中提到有使用 CLoudflare CDN 的網站可以透過同步帳號間的封鎖 IP 來達到全代管帳號下的跨站跨主機間保護。
寫文當前已經累積 4505 個惡意封鎖的 IP 了
但礙於篇幅,把「Fail2ban 同步封鎖 IP 清單的方法」拆成這篇來筆記。
原本理想的做法會是 日誌分析工具-> Cloudflare WAF -> Fail2ban 像直連通道,一氣呵成!
但 Fail2ban 這邊並沒有找到程式語言直接呼叫(但要避開System call)的方法來處理封鎖機制,所以實際上會有一點「繞路」。
方法一
讓日誌分析工具產生 Shell Script 語法,像是 fail2ban-client set jail_name banip xx.xx.xx.xx
來定期(Cronjob)呼叫匯入封鎖。
好處是直覺,但壞處就是這個操作會讓系統附載變得很高,尤其如果這個清單已經高達幾千筆的時候,更是本末倒置,搞得像是自己攻擊自己主機一樣,不推薦XD
額外資源參考: Centralize Fail2Ban Part-1 與 Part-2 的完整作法,建立一個資料庫系統來管理這個封鎖的 IP,不過不適用我的玩法,我的封鎖 IP 清單已經同步在 Cloudflare 上了。
方法二
原理是透過原本 Fail2ban 讀取日誌資料的方式來封鎖這些 IP。
實作部分則是把原本的惡意 IP 清單,「包裝」成一個日誌 log 格式的資料來餵。
95.163.255.181 - - [05/Jun/2022:14:52:40 +0800]
95.163.255.183 - - [05/Jun/2022:14:52:40 +0800]
95.163.255.184 - - [05/Jun/2022:14:52:40 +0800]
95.163.255.186 - - [05/Jun/2022:14:52:40 +0800]
95.163.255.191 - - [05/Jun/2022:14:52:40 +0800]
95.163.255.196 - - [05/Jun/2022:14:52:40 +0800]
95.163.255.197 - - [05/Jun/2022:14:52:40 +0800]
95.163.255.5 - - [05/Jun/2022:14:52:40 +0800]
95.163.255.8 - - [05/Jun/2022:14:52:40 +0800]
95.163.36.19 - - [05/Jun/2022:14:52:40 +0800]
95.163.36.4 - - [05/Jun/2022:14:52:40 +0800]
95.167.178.158 - - [05/Jun/2022:14:52:40 +0800]
95.181.237.28 - - [05/Jun/2022:14:52:40 +0800]
95.211.187.229 - - [05/Jun/2022:14:52:40 +0800]
95.211.197.162 - - [05/Jun/2022:14:52:40 +0800]
95.217.109.26 - - [05/Jun/2022:14:52:40 +0800]
95.217.226.248 - - [05/Jun/2022:14:52:40 +0800]
95.91.104.181 - - [05/Jun/2022:14:52:40 +0800]
95.91.15.184 - - [05/Jun/2022:14:52:40 +0800]
95.91.74.119 - - [05/Jun/2022:14:52:40 +0800]
96.44.142.254 - - [05/Jun/2022:14:52:40 +0800]
97.74.93.31 - - [05/Jun/2022:14:52:40 +0800]
99.226.233.69 - - [05/Jun/2022:14:52:40 +0800]
作法是編輯 jail.local
檔案,加入
[autoban]
enabled = true
port = 0:65535 #全部的 Ports 封鎖
filter = auto-ban
logpath = /root/cloudflare_waf/fail2ban_list.log #客製化日誌的路徑
maxretry = 1
bantime = 300 #封鎖5分鐘
findtime = 30 #30秒內的紀錄
新增 /etc/fail2ban/filter.d/auto-ban.conf
檔案,內容:
[Definition]
failregex = ^.*
然後就是重新載入設定: fail2ban-client reload
完成!(記得日誌要先產生好)
產生日誌的方法也非常簡單,如下:
$fail2ban_list = '';
foreach ($clean_list as $index => $ip) {
$fail2ban_list .= $ip . " - - [" . date('d/M/Y:H:i:s') . " +0800]" . PHP_EOL;
}
file_put_contents(dirname(__FILE__) . '/fail2ban_list.log', $fail2ban_list);
每一次同步惡意 IP 清單時,就會把這清單輸出一份日誌,然後觸發 Fail2ban 去讀取這份清單的變化,把這清單中的IP通通都丟去封鎖。
透過這內建的方式完成,效率快很多,又不太吃資源,是我目前的解法(有更好解歡迎推薦)
如有興趣使用這方式,可以參考前篇我內文中放出的持續更新 IP 清單,或者網路上其他人搜集的清單來實作本機的防火牆預先惡意排除。