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的情況,這就是為什麼我說大站不要使用這個方法。當然,小部落格無所謂啦。