雖然所有的網頁都套了 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 壞訪問更多一點,比搜尋引擎的爬蟲還要勤快。