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 час после того, как он ограничен в скорости, но, насколько мне показало мое исследование, я даже не знаю, возможен ли этот дополнительный шаг.

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)
Другие вопросы по тегам