本篇文章更新時間:2022/06/05
如有資訊過時或語誤之處,歡迎使用 Contact 功能通知。
一介資男的 LINE 社群開站囉!歡迎入群聊聊~
如果本站內容對你有幫助,歡迎使用 BFX Pay 加密貨幣新台幣 贊助支持。


前篇 [VPS] WordPress 網站主機群防護升級的作法 一文中提到有使用 CLoudflare CDN 的網站可以透過同步帳號間的封鎖 IP 來達到全代管帳號下的跨站跨主機間保護。

Cloudflare WAF

寫文當前已經累積 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-1Part-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 清單,或者網路上其他人搜集的清單來實作本機的防火牆預先惡意排除。


Share:

作者: Chun

資訊愛好人士。主張「人人都該為了偷懶而進步」。期許自己成為斜槓到變進度條 100% 的年輕人。[///////////____36%_________]

參與討論

1 則留言

  1. 自動引用通知: [WordPress] 搭配 Cloudflare WAF 規則減少網站被攻擊的幾個做法 – 一介資男

發佈留言

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


文章
Filter
Apply Filters
Mastodon