Haproxy
HAProxy 速率限制 - 禁止濫用者 30 分鐘
我有以下配置,適用於速率限制連接。如果濫用者經過身份驗證並且他每分鐘訪問定義的正則表達式位置超過 30 次,則會啟動速率限制並將他轉發到 rate_limiting 後端,在那裡他會收到一條錯誤消息:
frontend http_in bind xx.xx.xx.xx:80 mode http default_backend backend_nodes tcp-request inspect-delay 5s acl location_request path_reg ^/(.*)/(.*)/ acl too_many_requests sc0_gpc0_rate(context) ge 30 acl mark_seen sc0_inc_gpc0 gt 0 stick-table type string size 100k store gpc0_rate(60s) tcp-request content track-sc0 cookie(authValidation) if location_request use_backend rate_limiting if mark_seen too_many_requests backend backend_nodes mode http balance roundrobin option http-server-close server srv1 192.168.0.1:80 weight 5 server srv2 192.168.0.2:80 weight 5 backend rate_limiting mode http timeout tarpit 2s errorfile 500 /etc/haproxy/errorfiles/429.http http-request tarpit
此配置確保濫用者每分鐘不能發出超過 30 個請求,但是,它不會完全阻止他超過一分鐘。現在,我接下來想要實現的是在施虐者受到速率限制後將其完全阻止 1 小時,但據我的研究顯示,我什至不知道這個額外的步驟是否可能。
安迪,訣竅是添加另一個後端,您只用於額外的棍子表。每個後端只能有一張桌子 - 但你可以在任何前端/後端使用它們……所以我只添加一個名為 Abuse 的東西,然後你可以將其用作任何後端的全球 60 分鐘禁令……你會需要改變我的例子,但嘗試這樣的事情:
# ABUSE SECTION works with http mode dependent on src ip tcp-request content reject if { src_get_gpc0(Abuse) gt 0 } acl abuse src_http_req_rate(Abuse) ge 10 acl flag_abuser src_inc_gpc0(Abuse) ge 0 acl scanner src_http_err_rate(Abuse) ge 10 # Returns a 403 to the abuser and flags for tcp-reject next time http-request deny if abuse flag_abuser http-request deny if scanner flag_abuser backend Abuse stick-table type ip size 1m expire 60m store conn_rate(3s),conn_cur,gpc0,http_req_rate(10s),http_err_rate(20s)