megrxu

Fail2ban with Cloudflare

Feb 19, 2021  「DevOps」  

雖然所有的網頁都套了 Cloudflare,仍然無法避免一直被掃。看著 nginx log 裡的一大堆 40X Errors,又看了看 fail2ban-client status sshd 中那一大堆因為嘗試爆破 SSH 密碼而被 ban 的的 IP,決定抽空把這些惡意爬蟲處理一下。

獲取真實訪問者的 IP

因為網頁在 Cloudflare 免費計劃的保護下,未經配置的 nginx 預設獲取到的 IP 顯然是 Cloudflare 的 IP。當然,作為成熟的商業公司, Cloudflare 已經提供了有關如何恢復原始訪問者 IP 的詳細指南

簡單按照自己的 Web Server 配置一下即可。

使用 fail2ban 的內建 filter

fail2ban 本身內建了很多 filter 可以應用於讀取 Web 伺服器輸出的 log,並按照規則進行處理。例如處理 basic auth 的 nginx-http-auth,nginx-badbots,nginx-noscript 等等。一般都位於 /etc/fail2ban/filter.d/ 的目錄下。 如果想要對其中的內容進行修改,只需要新建一個 ${name}.local 的檔案即可將 ${name}.conf 的檔案按需覆蓋。當然也可以自己新建新的過濾器。

使用 fail2ban-regex 可以對 filter 中的配置進行測試。例如:fail2ban-regex /var/log/nginx/error.log /etc/fail2ban/filter.d/webexploits.conf -D

如果覺得匹配得還算滿意,就可以進入下一步了。

聯動 Cloudflare

在獲取到違規的 IP 之後,就需要進行處理,在 fail2ban 的名詞中稱作 action。對應地,一大堆檔案都在 /etc/fail2ban/action.d/ 下面等待人們來使用。常用的有 iptables,各種防火牆等等。由於目的是想要不讓這些 IP 來訪問Cloudflare 保護的網頁,僅在本機上配置是不夠的,還需要告訴 Cloudflare 不要接受他們的請求。

cloudflare.conf 就是用來做這件事的。只要編輯相關檔案(cloudflare.local),填寫上自己的 cftoken 和 cfuser (Email)就可以了。

至此,再編輯 /etc/fail2ban/jail.local 將這些 filter 啟用,配置好對應的觸發閾值和行為,重啟 fail2ban 服務,就可以看到那麼一大堆的 IP 全部都被 ban 掉了。真舒服。

手動處理個別 IP

有時候,有些漏網之魚,單獨寫個規則又麻煩。不如直接 ban 掉。

fail2ban-client set ${filtername} banip ${ip}

誤報率

測試下來,透過 nali-cli 看了一下歸屬地,似乎還是國內某些地區的 IP 壞訪問更多一點,比搜尋引擎的爬蟲還要勤快。