Назад | Перейти на главную страницу

Может ли Haproxy отклонить запрос по IP, если его таблица стикеров заполнена?

В моих конфигурациях haproxy я устанавливаю таблицу размеров 5, в которой хранятся все входящие IP-адреса (в течение 1 минуты), и она установлена ​​как nopurge поэтому новые записи не будут храниться в таблице. Я бы хотел, чтобы им отказали, но этого не происходит.

Линия палки-стола:

stick-table type ip size 5 expire 1m nopurge store gpc0

А целые конфиги такие:

global
        maxconn 30000
        ulimit-n 65536
        log     127.0.0.1 local0
        log     127.0.0.1 local1 debug
        stats socket /var/run/haproxy.stat mode 600 level operator

defaults
        mode http
        timeout connect 5000ms
        timeout client 50000ms
        timeout server 50000ms

backend fragile_backend
        tcp-request content  track-sc2 src
        stick-table type ip size 5 expire 1m nopurge store gpc0
        server fragile_backend1 A.B.C.D:80

frontend http_proxy
        bind *:80
        mode http
        option forwardfor
        default_backend fragile_backend

Я подтвердил (подключение к статистике haproxy с помощью socat readline /var/run/haproxy.stat), что таблица стикеров заполняется 5 IP-адресами, но затем каждый последующий запрос с нового IP просто проходит напрямую - он не добавляется в таблицу стикеров, ничего не удаляется из таблицы стикеров и запрос не отклонен.

Что я хотел бы сделать, так это отклонить запрос, если таблица Stick заполнена. Это возможно?

Я использую haproxy 1.5.

Как я уже говорил в другом потоке, для этого требуется добавление очень простого ACL, чтобы сообщить количество записей, используемых в таблице. Думаю, это не более 10 строк кода, включая объявление функции, но нам нужно его добавить. У меня сейчас нет времени, поэтому я добавляю это в список TODO и приму взнос, если кто-то найдет для этого время.

Похоже, что это не то поведение, которое должно происходить из-за того, как сформулирована документация. Но, может быть, вы можете увеличить GPC для каждого IP в таблице и отрицать, если он равен нулю ?:

src_get_gpc0(table) <integer>
  Returns the value of the first General Purpose Counter associated to the
  connection's source IPv4 address in the current proxy's stick-table or in
  the designated stick-table. If the address is not found, zero is returned.
  See also sc1/sc2_get_gpc0 and src_inc_gpc0.

При этом ваш бэкэнд называется «fragile_backend». Если вы пытаетесь ограничить количество подключений к серверу, поскольку сервер может обрабатывать только определенное количество подключений одновременно, вы можете захотеть использовать maxconn параметр в определении вашего сервера. Используя это, HAPRoxy будет ставить в очередь соединения сверх этого количества. Вам также может быть интересно:

be_conn <integer>
be_conn(backend) <integer>
  Applies to the number of currently established connections on the backend,
  possibly including the connection being evaluated. If no backend name is
  specified, the current one is used. But it is also possible to check another
  backend. It can be used to use a specific farm when the nominal one is full.
  See also the "fe_conn", "queue" and "be_sess_rate" criteria.