次の設定があります。これは、レート制限接続で問題なく機能します。乱用者が認証され、定義された正規表現の場所にも1分あたり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
この構成により、乱用者が1分あたり30を超えるリクエストを行うことができなくなりますが、1分を超えて完全にブロックすることはありません。さて、次に達成したいのは、虐待者がレート制限されてから1時間完全にブロックすることですが、私の調査では、この追加の手順が可能かどうかさえわかりません。
アンディ、秘訣は、追加のスティックテーブルにのみ使用する別のバックエンドを追加することです。バックエンドごとに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)