fail2ban配合cloudflare cdn使用

xiaobingch發表於2024-07-22

Fail2ban的工作原理很簡單:讀取日誌,使用正規表示式匹配IP地址,只要在規定時間內達到預先設定的訪問次數,就會執行ban action。也可以設定在封禁一段時間之後,自動解除封禁。總之這是一款比較靈活的軟體。

當我們沒有使用CloudFlare的時候,通常會把匹配到的ip地址提交給本機的iptables,而使用了CloudFlare之後,我們就可以直接用api把IP地址提交給CloudFlare的防火牆。

問題一: 如何讓fail2ban獲取真實IP

想要透過fail2ban來封禁ip, 那麼先要獲取到使用者(或駭客)的ip, 如果不進行處理, 那麼大機率你獲取到的是cloudflare請求你用的ip, 封禁這個ip是沒有意義的…

我的服務架構是 cloudflare –> nginx –> 後端服務

在nginx上面配置

server {
  ...

  # 這裡設定一下Real_IP變數, 用於儲存真實IP
  set $Real_IP $http_x_forwarded_for;


  # 設定代理 Header
  proxy_set_header X-Real-IP $Real_IP;

  location / {
    proxy_pass http://xxx;
  }
}

後端也要配置列印在日誌裡的ip欄位為 X-Real-IP, 如果讀取的是Nginx日誌, 那配置一下Nginx的日誌格式即可.

問題2: 封禁了使用者ip, 但是請求是透過cloudflare請求過來的, 封禁沒有效果

可以使用jail配置

[vaultwarden]
enabled = true
filter = vaultwarden
logpath = /home/ubuntu/quickstart/vaultwarden/vaultwarden_data/vaultwarden.log
maxretry = 5
bantime = 1d
findtime = 1h
action = cloudflare

修改cloudflare 的action配置

/etc/fail2ban/action.d/cloudflare.conf

cftoken  =  cloudflare全域性key
cfuser   =  你的郵箱

全部設定完成後,執行“fail2ban-client reload”重新載入配置檔案,後續封禁是在cloudflare上封禁的, 可以在WAF-工具 檢視。

說說這套系統的幾個缺點:
第一就是CloudFlare的IP防火牆有延遲,新IP新增進去,大概半分鐘左右才會生效。因此我建議在Nginx中設定limit_req_zone,防火牆生效之前能起到臨時的防護。
第二,單位時間內的訪問量一定要設定合理,網站第一次開啟通常會載入大量靜態檔案,如果設定不合理,很可能會遮蔽正常訪客。這裡還有一個方法,就是在“http-get-dos.conf”檔案中修改正規表示式,只匹配引起高負載的動態檔案,這就需要各位自己發揮了。
第三,現在存在許多使用者共用一個IP的情況,這就是為什麼我說大站不要使用這個方法。當然,小部落格無所謂啦。

相關文章