Перейти к содержанию

7. ACL и извлечение образцов

Сопоставление ACL, условия, преобразователи, извлечение образцов и предопределённые ACL

HAProxy может извлекать данные из потоков запросов или ответов, сведений о клиенте или сервере, таблиц, сведений об окружении и т. д. Извлечение таких данных называется извлечением образца. Полученные образцы могут использоваться для разных целей, например как ключ таблицы привязок, но чаще всего их сопоставляют с предопределёнными постоянными данными, называемыми шаблонами.

7.1. Основы ACL

Списки контроля доступа (ACL) позволяют объявить именованный метод сравнения любых данных со списком предопределённых шаблонов. Их следует считать практически эквивалентными функциям в большинстве языков программирования: объявление делает их доступными для последующего вызова по мере необходимости. Результат вычисления — только совпадение или несовпадение, что сопоставимо с логическими значениями во многих языках программирования. В отличие от функций в языках программирования, ACL можно перегружать сколько угодно раз, определяя дополнительные методы сопоставления для одного и того же имени. В этом случае они будут вычисляться в порядке объявления до первого совпадения.

ACL предоставляют гибкий способ переключения содержимого и, в более общем случае, принятия решений на основе данных, извлечённых из запроса, ответа или сведений о состоянии окружения. Принцип прост:

  • извлечь образец данных из потока, таблицы или окружения
  • при необходимости преобразовать формат извлечённого образца
  • применить к образцу один или несколько методов сопоставления с шаблонами
  • выполнить действия, только если шаблон совпадает с образцом

Действия обычно заключаются в блокировке запроса, выборе бэкенда или добавлении заголовка.

Для определения проверки используется ключевое слово “acl”. Синтаксис:

acl <aclname> <criterion> [flags] [operator] [<value>] ...

Эта запись создаёт новый ACL <aclname> или дополняет существующий новыми проверками. Проверки применяются к части запроса или ответа, указанной в <criterion>, и могут уточняться необязательными флагами [flags]. Некоторые критерии также поддерживают оператор, который можно указать перед набором значений. При необходимости к образцу можно применить операторы преобразования: они задаются списком ключевых слов через запятую сразу после первого ключевого слова. Значения должны иметь тип, поддерживаемый критерием, и разделяются пробелами.

Имена ACL должны состоять из прописных и строчных букв, цифр, ‘-’ (дефиса), ‘_’ (подчёркивания), ‘.’ (точки) и ‘:’ (двоеточия). Имена ACL чувствительны к регистру, поэтому “my_acl” и “My_Acl” — два разных ACL.

Число ACL не ограничено. Неиспользуемые ACL не влияют на производительность и лишь занимают небольшой объём памяти.

Критерий обычно представляет собой имя метода извлечения образца или одного из его вариантов для ACL. Метод проверки по умолчанию определяется типом результата этого метода извлечения образца. Варианты для ACL могут задавать другие методы сопоставления для одного и того же метода извлечения образца. Преобразования поддерживают только методы извлечения образцов.

Методы извлечения образцов возвращают данные следующих типов:

  • логическое значение
  • целое число (со знаком или без знака)
  • адрес IPv4 или IPv6
  • строка
  • блок данных

Преобразователи преобразуют данные любого из этих типов в любой из них. Например, одни преобразователи могут привести строку к нижнему регистру, а другие — преобразовать строку в адрес IPv4 или применить сетевую маску к IP-адресу. Тип итогового образца определяется последним преобразователем в списке; по умолчанию это тип результата метода извлечения образца.

Каждый образец или преобразователь возвращает данные определённого типа, указанного в этой документации рядом с его ключевым словом. При объявлении ACL с помощью стандартного метода извлечения образца для некоторых типов автоматически выбирается метод сопоставления по умолчанию; эти соответствия приведены в таблице ниже:

   +------------------------+------------------------+
   | Выходной тип образца   | Метод сопоставления    |
   | или преобразователя    | по умолчанию           |
   +------------------------+------------------------+
   | boolean                | bool                   |
   +------------------------+------------------------+
   | integer                | int                    |
   +------------------------+------------------------+
   | ip                     | ip                     |
   +------------------------+------------------------+
   | string                 | str                    |
   +------------------------+------------------------+
   | binary                 | нет, используйте "-m"  |
   +------------------------+------------------------+

Для сопоставления двоичных образцов обязательно нужно указать метод сопоставления; см. ниже.

Механизм ACL может сопоставлять эти типы с шаблонами следующих типов:

  • логическое значение
  • целое число или диапазон целых чисел
  • IP-адрес / сеть
  • строка (точное совпадение, подстрока, суффикс, префикс, подкаталог, домен)
  • регулярное выражение
  • блок шестнадцатеричных данных

В настоящее время поддерживаются следующие флаги ACL:

-i: игнорировать регистр при сопоставлении всех последующих шаблонов.
-f: загрузить шаблоны из списка.
-m: использовать указанный метод сопоставления с шаблоном
-n: запретить разрешение имён DNS
-M: загрузить файл, указанный с помощью -f, как карту.
-u: принудительно задать уникальный идентификатор ACL
--: принудительно завершить список флагов. Полезно, если строка похожа на один из флагов.

После флага “-f” указывается имя, которое должно соответствовать формату имён карт и ACL, описанному в разделе 2.7. Если шаблоны нужно загрузить из нескольких списков, можно передать несколько аргументов “-f”. При ссылке на существующий файл каждая его строка считывается как отдельное значение. Пустые строки и строки, начинающиеся с решётки (’#’), игнорируются. Все начальные пробелы и символы табуляции удаляются. Если необходимо указать допустимый шаблон, начинающийся с решётки, перед ним достаточно добавить пробел, чтобы строка не считалась комментарием. В зависимости от типа данных и метода сопоставления HAProxy может загружать строки в двоичное дерево, что обеспечивает очень быстрый поиск. Это применяется к IPv4 и точному сопоставлению строк. В таком случае дубликаты автоматически удаляются.

Флаг “-M” позволяет ACL использовать карту. Если этот флаг задан, список разбирается как записи из двух столбцов. Первый столбец содержит шаблоны, используемые ACL, а второй — образцы. Образец впоследствии может использоваться картой. Это полезно в некоторых редких случаях, когда ACL нужен лишь для проверки наличия шаблона в карте перед применением отображения.

Флаг “-u” принудительно задаёт уникальный идентификатор ACL. Этот идентификатор используется через сокетный интерфейс для идентификации ACL и динамического изменения его значений. Обратите внимание: файл всегда идентифицируется по имени, даже если задан идентификатор.

Также обратите внимание: флаг “-i” применяется к последующим записям, но не к записям, загруженным из файлов, указанных перед ним. Например:

acl valid-ua hdr(user-agent) -f exact-ua.lst -i -f generic-ua.lst test

В этом примере каждая строка из “exact-ua.lst” точно сопоставляется с заголовком “user-agent” запроса. Затем каждая строка из “generic-ua” сопоставляется без учёта регистра. После этого слово “test” также сопоставляется без учёта регистра.

Флаг “-m” выбирает конкретный метод сопоставления входного образца с шаблонами. Все критерии, специфичные для ACL, подразумевают определённый метод сопоставления и обычно не требуют этого флага. Однако он полезен с универсальными методами извлечения образцов, поскольку задаёт, как их результаты будут сопоставляться с шаблонами. Это необходимо для методов извлечения, возвращающих данные типа, для которого нет очевидного метода сопоставления (например, строки или двоичные данные). Если после “-m” указано имя метода сопоставления с шаблоном, этот метод используется вместо метода по умолчанию для данного критерия. Это позволяет сопоставлять содержимое способами, которые изначально не предусматривались, или использовать методы извлечения образцов, возвращающие строку. Метод сопоставления также влияет на разбор шаблонов. Поэтому его нельзя использовать с методами извлечения образцов, имеющими суффикс сопоставления (_beg, _end, _sub…). Кроме того, нельзя задавать несколько методов сопоставления с помощью “-m”.

Флаг “-n” запрещает разрешение имён DNS. Он используется при загрузке файлов с IP-адресами. По умолчанию, если парсер не может разобрать IP-адрес, он предполагает, что строка может быть доменным именем, и пытается выполнить разрешение DNS. Флаг “-n” отключает разрешение имён. Это полезно для выявления некорректных списков IP-адресов. Обратите внимание: если сервер DNS недоступен, разбор конфигурации HAProxy может длиться много минут в ожидании тайм-аута. В это время сообщения об ошибках не выводятся. Флаг “-n” отключает такое поведение. Также следует учитывать, что при динамическом изменении ACL во время выполнения разрешение имён отключено.

Однако есть ограничения. Не все методы сопоставления можно использовать со всеми методами извлечения образцов. Кроме того, если “-m” используется вместе с “-f”, он должен быть указан первым. Метод сопоставления с шаблонами должен быть одним из следующих:

  • “found”: только проверить, найден ли запрошенный образец в потоке, без сравнения с каким-либо шаблоном. Чтобы избежать путаницы, рекомендуется не указывать шаблоны. Этот метод сопоставления особенно полезен для обнаружения определённого содержимого, например заголовков, cookie и т. д., даже если они пусты, без сравнения с чем-либо и без подсчёта.

  • “bool” : проверить значение как логическое. Применяется только к методам извлечения, возвращающим логическое или целочисленное значение, и не принимает шаблон. Ноль и false не совпадают; все остальные значения совпадают.

  • “int” : сопоставить значение как целое число. Можно использовать с целочисленными и логическими образцами. Логическому false соответствует целое число 0, а true — целое число 1.

  • “ip” : сопоставить значение как адрес IPv4 или IPv6. Совместим только с образцами IP-адресов, поэтому подразумевается и никогда не требует явного указания.

  • “bin” : сопоставить содержимое с шестнадцатеричной строкой, представляющей двоичную последовательность. Можно использовать с двоичными или строковыми образцами.

  • “len” : сопоставить длину образца как целое число. Можно использовать с двоичными или строковыми образцами.

  • “str” : точное сопоставление: сопоставить содержимое со строкой. Можно использовать с двоичными или строковыми образцами.

  • “sub” : сопоставление по подстроке: найти в содержимом хотя бы один из заданных строковых шаблонов. Можно использовать с двоичными или строковыми образцами.

  • “reg” : сопоставление по регулярному выражению: сопоставить содержимое со списком регулярных выражений. Можно использовать с двоичными или строковыми образцами.

  • “beg” : сопоставление по префиксу: проверить начало содержимого на совпадение с заданными строковыми шаблонами. Можно использовать с двоичными или строковыми образцами.

  • “end” : сопоставление по суффиксу: проверить окончание содержимого на совпадение с заданными строковыми шаблонами. Можно использовать с двоичными или строковыми образцами.

  • “dir” : сопоставление по подкаталогу: проверить, совпадает ли часть содержимого, ограниченная косыми чертами, в точности с одним из заданных строковых шаблонов. Можно использовать с двоичными или строковыми образцами.

  • “dom” : сопоставление по домену: проверить, совпадает ли часть содержимого, ограниченная точками, в точности с одним из заданных строковых шаблонов. Можно использовать с двоичными или строковыми образцами.

Например, чтобы быстро проверить наличие cookie “JSESSIONID” в запросе HTTP, можно записать:

acl jsess_present req.cook(JSESSIONID) -m found

Чтобы применить регулярное выражение к первым 500 байтам данных в буфере, используется следующий ACL:

acl script_tag req.payload(0,500) -m reg -i <script>

В системах, где библиотека регулярных выражений значительно медленнее работает с “-i”, образец можно перед сопоставлением привести к нижнему регистру:

acl script_tag req.payload(0,500),lower -m reg <script>

Все критерии, специфичные для ACL, подразумевают метод сопоставления по умолчанию. Чаще всего такие критерии образуются объединением имени исходного метода извлечения образца и имени метода сопоставления. Например, “hdr_beg” применяет сопоставление “beg” к образцам, полученным методом извлечения “hdr”. Такой метод сопоставления применяется, только когда ключевое слово используется само по себе, без преобразователей. Если после такого ключевого слова ACL применяется преобразователь, метод сопоставления по умолчанию из ключевого слова ACL просто игнорируется: значение имеет тип результата последнего преобразователя. Поскольку все критерии, специфичные для ACL, основаны на методе извлечения образца, вместо них всегда можно использовать исходный метод извлечения и явно указать метод сопоставления с помощью “-m”.

Если для критерия, специфичного для ACL, с помощью “-m” задан другой метод сопоставления, он просто применяется к лежащему в основе критерия методу извлечения образца. Например, все следующие ACL в точности эквивалентны:

acl short_form  hdr_beg(host)        www.
acl alternate1  hdr_beg(host) -m beg www.
acl alternate2  hdr_dom(host) -m beg www.
acl alternate3  hdr(host)     -m beg www.

В таблице ниже приведена матрица совместимости типов образцов или преобразователей с типами шаблонов для сопоставления. Для каждой совместимой комбинации указано имя необходимого метода сопоставления. Угловые скобки “>” и “<” вокруг имени означают, что этот метод используется по умолчанию и работает без “-m”.

                           +-------------------------------------------------+
                           | Тип входного образца                            |
    +----------------------+---------+---------+---------+---------+---------+
    | Тип шаблона          | boolean | integer |   ip    | string  | binary  |
    +----------------------+---------+---------+---------+---------+---------+
    | нет (только наличие) |  found  |  found  |  found  |  found  |  found  |
    +----------------------+---------+---------+---------+---------+---------+
    | нет (логич. знач.)   |>  bool <|   bool  |         |   bool  |         |
    +----------------------+---------+---------+---------+---------+---------+
    | целое (значение)     |   int   |>  int  <|   int   |   int   |         |
    +----------------------+---------+---------+---------+---------+---------+
    | целое (длина)        |   len   |   len   |   len   |   len   |   len   |
    +----------------------+---------+---------+---------+---------+---------+
    | IP-адрес             |         |         |>   ip  <|    ip   |    ip   |
    +----------------------+---------+---------+---------+---------+---------+
    | точная строка        |   str   |   str   |   str   |>  str  <|   str   |
    +----------------------+---------+---------+---------+---------+---------+
    | префикс              |   beg   |   beg   |   beg   |   beg   |   beg   |
    +----------------------+---------+---------+---------+---------+---------+
    | суффикс              |   end   |   end   |   end   |   end   |   end   |
    +----------------------+---------+---------+---------+---------+---------+
    | подстрока            |   sub   |   sub   |   sub   |   sub   |   sub   |
    +----------------------+---------+---------+---------+---------+---------+
    | подкаталог           |   dir   |   dir   |   dir   |   dir   |   dir   |
    +----------------------+---------+---------+---------+---------+---------+
    | домен                |   dom   |   dom   |   dom   |   dom   |   dom   |
    +----------------------+---------+---------+---------+---------+---------+
    | регулярное выражение |   reg   |   reg   |   reg   |   reg   |   reg   |
    +----------------------+---------+---------+---------+---------+---------+
    | шестнадцатерич. блок |         |         |         |   bin   |   bin   |
    +----------------------+---------+---------+---------+---------+---------+

7.1.1. Сопоставление логических значений

Для сопоставления логического значения указывать значение не требуется; все заданные значения игнорируются. Логическое сопоставление используется по умолчанию для всех методов извлечения типа “boolean”. При таком сопоставлении извлечённое значение возвращается без изменений: логическое “true” всегда даёт совпадение, а логическое “false” — никогда.

Логическое сопоставление также можно принудительно задать с помощью “-m bool” для методов извлечения, возвращающих целое число. В этом случае целое число 0 преобразуется в логическое “false”, а все остальные значения — в “true”.

7.1.2. Сопоставление целых чисел

Целочисленное сопоставление применяется по умолчанию к методам извлечения целых чисел. Его также можно принудительно задать для методов извлечения логических значений с помощью “-m int”. В этом случае “false” преобразуется в целое число 0, а “true” — в целое число 1.

Целочисленное сопоставление также поддерживает диапазоны целых чисел и операторы. Обратите внимание: целочисленное сопоставление применяется только к положительным значениям. Диапазон задаётся нижней и верхней границами, разделёнными двоеточием; обе границы необязательны.

Например, “1024:65535” — допустимый диапазон непривилегированных портов; запись “1024:” также подходит. “0:1023” — допустимое представление привилегированных портов; запись “:1023” также подходит.

В качестве особого случая некоторые функции ACL поддерживают десятичные числа, которые фактически представляют собой два целых числа, разделённых точкой. Это используется, например, в некоторых проверках версий. К таким десятичным числам применимы все свойства целых чисел, в том числе диапазоны и операторы.

Для удобства также поддерживаются операторы сравнения. Обратите внимание: использование операторов с диапазонами не имеет особого смысла и настоятельно не рекомендуется. Аналогично, сравнение на больше или меньше с набором значений также не имеет особого смысла.

Для целочисленного сопоставления доступны следующие операторы:

eq: true, если проверяемое значение равно хотя бы одному значению
ge: true, если проверяемое значение больше или равно хотя бы одному значению
gt: true, если проверяемое значение больше хотя бы одного значения
le: true, если проверяемое значение меньше или равно хотя бы одному значению
lt: true, если проверяемое значение меньше хотя бы одного значения

Например, следующий ACL соответствует любому отрицательному значению заголовка Content-Length:

acl negative-length req.hdr_val(content-length) lt 0

Этот ACL соответствует версиям SSL от 3.0 до 3.1 включительно:

acl sslv3 req.ssl_ver 3:3.1

7.1.3. Сопоставление строк

Строковое сопоставление применяется к методам извлечения строк или двоичных данных и существует в 6 формах:

  • точное сопоставление (-m str): извлечённая строка должна в точности совпадать с шаблонами;

  • сопоставление по подстроке (-m sub): шаблоны ищутся внутри извлечённой строки; ACL совпадает, если найден хотя бы один из них;

  • сопоставление по префиксу (-m beg): шаблоны сравниваются с началом извлечённой строки; ACL совпадает, если совпал хотя бы один из них.

  • сопоставление по суффиксу (-m end): шаблоны сравниваются с концом извлечённой строки; ACL совпадает, если совпал хотя бы один из них.

  • сопоставление по подкаталогу (-m dir): шаблоны ищутся в любом месте извлечённой строки, с границами в виде косых черт ("/"), начала или конца строки. ACL совпадает, если совпал хотя бы один из них. Таким образом, строка “/images/png/logo/32x32.png” совпадёт с “/images”, “/images/png”, “images/png”, “/png/logo”, “logo/32x32.png” или “32x32.png”, но не с “png” и не с “32x32”.

  • сопоставление по домену (-m dom): шаблоны ищутся в любом месте извлечённой строки, с границами в виде точек ("."), двоеточий (":"), косых черт ("/"), вопросительных знаков ("?"), начала или конца строки. Этот метод предназначен для URL. Начальные и конечные разделители в шаблоне игнорируются. ACL совпадает, если совпал хотя бы один из шаблонов. Например, со строкой “http://www1.dc-eu.example.com:80/blah ” совпадут шаблоны “http”, “www1”, “.www1”, “dc-eu”, “example”, “com”, “80”, “dc-eu.example”, “blah”, “:www1:”, “dc-eu.example:80”, но не “eu” и не “dc”. Использовать этот метод для сопоставления доменных суффиксов при фильтрации или маршрутизации обычно нежелательно: маршрутизацию легко обмануть, например добавив совпадающий префикс перед другим доменом.

При строковом сопоставлении строки используются буквально, в том виде, в каком переданы, за исключением обратной косой черты ("\"), позволяющей экранировать некоторые символы, например пробел. Если перед первой строкой указан флаг “-i”, сопоставление выполняется без учёта регистра. Для сопоставления со строкой “-i” нужно либо указать её второй, либо перед первой строкой передать флаг “–”. То же, разумеется, относится и к сопоставлению со строкой “–”.

Не используйте строковое сопоставление для двоичных образцов, которые могут содержать нулевые байты (0x00): сравнение останавливается на первом нулевом байте. Вместо этого сначала преобразуйте двоичный образец в шестнадцатеричную строку с помощью преобразователя hex.

Пример:

# matches if the string <tag> is present in the binary sample
acl tag_found req.payload(0,0),hex -m sub 3C7461673E

7.1.4. Сопоставление по регулярным выражениям (regex)

Как и при строковом сопоставлении, при сопоставлении по регулярным выражениям строки используются буквально, в том виде, в каком переданы, за исключением обратной косой черты ("\"), позволяющей экранировать некоторые символы, например пробел. Если перед первым регулярным выражением указан флаг “-i”, сопоставление выполняется без учёта регистра. Для сопоставления со строкой “-i” нужно либо указать её второй, либо перед первой строкой передать флаг “–”. Тот же принцип, разумеется, применяется и к сопоставлению со строкой “–”.

7.1.5. Сопоставление произвольных блоков данных

Извлечённые образцы можно сопоставлять с двоичным блоком, который не всегда можно безопасно представить строкой. Для этого при двоичном методе сопоставления шаблоны должны передаваться последовательностью из чётного числа шестнадцатеричных цифр. Каждая пара цифр представляет байт. Шестнадцатеричные цифры можно записывать в верхнем или нижнем регистре.

Пример:

# match "Hello\n" in the input stream (\x48 \x65 \x6c \x6c \x6f \x0a)
acl hello req.payload(0,6) -m bin 48656c6c6f0a

7.1.6. Сопоставление адресов IPv4 и IPv6

Значения адресов IPv4 можно задавать как обычные адреса или с сетевой маской. Во втором случае адрес IPv4 совпадает, если находится в указанной сети. Вместо обычного адреса можно также указать разрешаемое имя узла, но обычно это не рекомендуется, поскольку затрудняет чтение и отладку конфигурации. Если используются имена узлов, следует как минимум обеспечить их наличие в /etc/hosts, чтобы конфигурация не зависела от случайного результата DNS в момент её разбора.

Поддерживается как обычная точечная запись адреса IPv4, так и сокращённая форма, в которой опущены октеты со значением 0:

    +------------------+------------------+------------------+
    |   Пример 1       |     Пример 2     |     Пример 3     |
    +------------------+------------------+------------------+
    |  192.168.0.1     |   10.0.0.12      |   127.0.0.1      |
    |  192.168.1       |   10.12          |   127.1          |
    |  192.168.0.1/22  |   10.0.0.12/8    |   127.0.0.1/8    |
    |  192.168.1/22    |   10.12/8        |   127.1/8        |
    +------------------+------------------+------------------+

Обратите внимание: это отличается от записи адресов CIDR по RFC 4632, в которой 192.168.42/24 эквивалентно 192.168.42.0/24.

Адреса IPv6 можно вводить в обычном виде, с сетевой маской или без неё. Для масок IPv6 допускается только количество битов. Чтобы исключить риск проблем со случайным результатом разрешения IP-адресов, имена узлов в шаблонах IPv6 никогда не допускаются.

HAProxy также может сопоставлять адреса IPv4 с адресами IPv6 в следующих случаях:

  • проверяемый адрес — IPv4, адрес шаблона — IPv4: сопоставление выполняется в IPv4 с указанной маской, если она задана.
  • проверяемый адрес — IPv6, адрес шаблона — IPv6: сопоставление выполняется в IPv6 с указанной маской, если она задана.
  • проверяемый адрес — IPv6, адрес шаблона — IPv4: сопоставление выполняется в IPv4 с маской шаблона, если адрес IPv6 соответствует 2002:IPV4::, ::IPV4 или ::ffff:IPV4; иначе совпадения нет.
  • проверяемый адрес — IPv4, адрес шаблона — IPv6: адрес IPv4 сначала преобразуется в IPv6 добавлением префикса ::ffff:, после чего сопоставление выполняется в IPv6 с указанной маской IPv6.

7.2. Использование ACL для построения условий

Некоторые действия выполняются только при выполнении условия. Условие — это комбинация ACL с операторами. Поддерживаются 3 оператора:

  • AND (неявный)
  • OR (явный, с ключевым словом “or” или оператором “||”)
  • отрицание с восклицательным знаком ("!")

Условие задаётся в дизъюнктивной форме:

[!]acl1 [!]acl2 ... [!]acln  { or [!]acl1 [!]acl2 ... [!]acln } ...

Такие условия обычно используются после “if” или “unless”, указывающих, когда условие запускает действие.

Например, чтобы заблокировать запросы HTTP к URL “*” с методами, отличными от “OPTIONS”, а также запросы POST без content-length, запросы GET или HEAD с content-length больше 0 и, наконец, все запросы, метод которых не входит в GET/HEAD/POST/OPTIONS!

acl missing_cl req.hdr_cnt(Content-length) eq 0
http-request deny if HTTP_URL_STAR !METH_OPTIONS || METH_POST missing_cl
http-request deny if METH_GET HTTP_CONTENT
http-request deny unless METH_GET or METH_POST or METH_OPTIONS

Чтобы выбрать другой бэкенд для запросов статического содержимого сайта “www”, а также для всех запросов к узлам “img”, “video”, “download” и “ftp”:

acl url_static  path_beg         /static /images /img /css
acl url_static  path_end         .gif .png .jpg .css .js
acl host_www    hdr_beg(host) -i www
acl host_static hdr_beg(host) -i img. video. download. ftp.
# now use backend "static" for all static-only hosts, and for static URLs
# of host "www". Use backend "www" for the rest.
use_backend static if host_static or host_www url_static
use_backend www    if host_www

Также можно составлять правила с помощью «анонимных ACL». Это безымянные выражения ACL, создаваемые на месте без предварительного объявления. Они должны заключаться в фигурные скобки, с пробелом перед каждой скобкой и после неё: скобки должны восприниматься как отдельные слова. Пример:

Следующее правило:

    acl missing_cl req.hdr_cnt(Content-length) eq 0
    http-request deny if METH_POST missing_cl

Можно записать и так:

    http-request deny if METH_POST { req.hdr_cnt(Content-length) eq 0 }

Обычно использовать эту конструкцию не рекомендуется: при такой записи гораздо легче оставить в конфигурации ошибки. Однако для очень простых правил, например сопоставляющих только один IP-адрес источника, она может быть уместнее, чем объявление ACL с произвольными именами. Ещё один пример подходящего применения:

С именованными ACL:

     acl site_dead nbsrv(dynamic) lt 2
     acl site_dead nbsrv(static)  lt 2
     monitor fail  if site_dead

С анонимными ACL:

     monitor fail if { nbsrv(dynamic) lt 2 } || { nbsrv(static) lt 2 }

Подробное описание ключевых слов “http-request deny” и “use_backend” см. в разделе 4.2 .

7.3. Извлечение образцов

Исторически методы извлечения образцов использовались только для получения данных, сопоставляемых с шаблонами посредством ACL. С появлением таблиц привязок возник новый класс методов извлечения образцов, обычно с тем же синтаксисом, что и их аналоги для ACL. Эти методы также называют «методами извлечения» (fetches). Сейчас ACL и методы извлечения сблизились: все методы извлечения ACL доступны как обычные методы извлечения, а ACL, в свою очередь, могут использовать любой метод извлечения образцов.

В этом разделе подробно описаны все доступные методы извлечения образцов и типы их результатов. У некоторых методов есть устаревшие псевдонимы, сохраняемые для совместимости с существующими конфигурациями. Они явно помечены как устаревшие, и их не следует использовать в новых конфигурациях.

У образцов есть тип. Он определяет, с какими шаблонами можно сопоставлять образец, какие преобразователи к нему применимы и как он преобразуется, когда ожидается другой тип. Используются следующие типы:

  • boolean: истинное или ложное значение, возвращаемое методами извлечения, которые сообщают только о выполнении условия. Такие образцы сопоставляются без параметра “-m”. Целое число считается истинным, если оно не равно нулю; строка сначала разбирается как целое число.

  • integer: знаковое 64-битное целое число, то есть значение от -2^63 до 2^63-1 (-9223372036854775808 и 9223372036854775807). При преобразовании строки в целое число разбор останавливается на первом символе, который не является цифрой или начальным знаком (’+’ либо ‘-’). Используется число, составленное из прочитанных цифр; если их не было, получается ноль, однако пустые строки не преобразуются. Значения вне допустимого диапазона ограничиваются наименьшим или наибольшим представимым целым числом.

  • адрес IPv4 и адрес IPv6: это два разных типа, хотя большинство мест, принимающих один из них, принимают и другой и описаны просто как принимающие адрес. Адрес IPv4 можно преобразовать в целое число, получив 32-битное значение адреса, либо в адрес IPv6 в форме IPv4-mapped ("::ffff:a.b.c.d"). Обратные преобразования более ограничены: у адреса IPv6 нет целочисленной формы, а преобразование в IPv4 возможно только для адресов IPv4-mapped, IPv4-compatible или 6to4.

  • string: последовательность байтов, заканчивающаяся первым символом NUL (0x00), который не входит в строку. Если нужен встроенный символ NUL, используйте тип binary. Кодировка не определяется: HAProxy не пытается трактовать байты как символы. Представляют ли они текст, в какой кодировке и как он отображается, зависит только от использования строки. Поэтому явное или неявное преобразование образца binary в строку без предупреждения отбрасывает всё начиная с первого символа NUL.

  • binary: блок байтов известной длины, в котором каждый байт может иметь любое значение от 0 до 255, включая NUL. Этот тип возвращают методы извлечения необработанных данных, например тела запроса или содержимого двоичного протокола. Такой образец нельзя преобразовать в boolean, целое число или адрес. Его нужно либо сопоставлять как двоичный блок с помощью “-m bin” (см. раздел 7.1.5 ), либо сначала переводить в печатный вид, например преобразователем “hex”. Обратное преобразование ничем не ограничено, поскольку строка всегда является допустимым двоичным блоком.

  • method: метод HTTP. Известные HAProxy методы представлены идентификатором; остальные сохраняют исходную строку.

В таблице преобразователей ниже также используется “any” для обозначения преобразователей, принимающих любой тип входных данных.

Также, если они существуют, указаны производные варианты ACL с соответствующими методами сопоставления. Для всех таких вариантов однозначно определён метод сопоставления с шаблонами по умолчанию, поэтому передавать параметр “-m”, чтобы указать способ сопоставления образца в ACL, никогда не требуется, хотя это и разрешено.

Как показано выше в матрице совместимости типов образцов и методов сопоставления, при использовании универсального метода извлечения образца в ACL параметр “-m” обязателен, кроме случаев, когда тип образца — логическое значение, целое число, IPv4 или IPv6. Если одно и то же ключевое слово существует и для ACL, и для обычного метода извлечения, механизм ACL по умолчанию автоматически выбирает вариант, предназначенный только для ACL.

Некоторые из этих ключевых слов поддерживают один или несколько обязательных и один или несколько необязательных аргументов. Аргументы имеют строгие типы и проверяются при разборе конфигурации, поэтому риска запуска с некорректным аргументом, например неразрешённым именем бэкенда, нет. Аргументы функции извлечения передаются в круглых скобках и разделяются запятыми. Необязательные аргументы ниже обозначаются квадратными скобками (’[ ]’). Если все аргументы необязательны, круглые скобки можно опустить.

Таким образом, стандартный метод извлечения образца имеет один из следующих вариантов синтаксиса:

  • name
  • name(arg1)
  • name(arg1,arg2)

7.3.1. Преобразователи

Методы извлечения образцов можно сочетать с преобразованиями, применяемыми к извлечённому образцу; такие преобразования также называются «преобразователями». Эти сочетания образуют «выражения образцов», а их результатом является «образец». Изначально это поддерживалось только в директивах “stick on” и “stick store-request”, но теперь доступно везде, где можно использовать образцы: ACL, log-format, unique-id-format, add-header и т. д.

Преобразования перечисляются в виде определённых ключевых слов после метода извлечения образца. Эти ключевые слова также можно добавлять непосредственно после аргумента ключевого слова извлечения, отделяя их запятой. Они тоже могут принимать аргументы, например сетевую маску, которые должны передаваться в круглых скобках.

Отдельную категорию преобразователей составляют побитовые и арифметические операторы, позволяющие выполнять основные операции над целыми числами. Поддерживаются некоторые побитовые операции (and, or, xor, cpl) и арифметические операции (add, sub, mul, div, mod, neg). Также доступны операции сравнения (odd, even, not, bool), позволяющие получить результат сопоставления без написания ACL.

Поддерживаются следующие ключевые слова:

   Ключевое слово                                  Входной тип  Выходной тип
------------------------------------------------+-------------+----------------
51d.single(prop[,prop*])                           string       string
add(value)                                         integer      integer
add_item(delim[,var[,suff]])                       string       string
aes_cbc_dec(bits,nonce,key[,<aad>])                binary       binary
aes_cbc_enc(bits,nonce,key[,<aad>])                binary       binary
aes_gcm_dec(bits,nonce,key,aead_tag[,aad])         binary       binary
aes_gcm_enc(bits,nonce,key,aead_tag[,aad])         binary       binary
and(value)                                         integer      integer
b64dec                                             string       binary
base2                                              binary       string
base64                                             binary       string
be2dec(separator,chunk_size[,truncate])            binary       string
le2dec(separator,chunk_size[,truncate])            binary       string
be2hex([separator[,chunk_size[,truncate]]])        binary       string
bool                                               integer      boolean
bytes(offset[,length])                             binary       binary
capture-req(id)                                    string       string
capture-res(id)                                    string       string
concat([start[,var[,end]]])                        string       string
cpl                                                integer      integer
crc32([avalanche])                                 binary       integer
crc32c([avalanche])                                binary       integer
cut_crlf                                           string       string
da-csv-conv(prop[,prop*])                          string       string
date                                               string       integer
debug([prefix][,destination])                       any          same
-- Ключевое слово -----------------------------+- Входной тип + Выходной тип -
digest(algorithm)                                  binary       binary
div(value)                                         integer      integer
djb2([avalanche])                                  binary       integer
eth.data                                           binary       binary
eth.dst                                            binary       binary
eth.hdr                                            binary       binary
eth.proto                                          binary       integer
eth.src                                            binary       binary
eth.vlan                                           binary       integer
even                                               integer      boolean
fe_exists                                          string       boolean
field(index,delimiters[,count])                    string       string
fix_is_valid                                       binary       boolean
fix_tag_value(tag)                                 binary       binary
has_ctl([mask])                                    binary       boolean
hex                                                binary       string
hex2i                                              binary       integer
hmac(algorithm,key)                                binary       binary
host_only                                          string       string
htonl                                              integer      integer
http_date([offset[,unit]])                         integer      string
iif(true,false)                                    boolean      string
in_table([table])                                  any          boolean
ip.data                                            binary       binary
ip.df                                              binary       integer
ip.dst                                             binary       address
ip.fp                                              binary       binary
ip.hdr                                             binary       binary
ip.proto                                           binary       integer
ip.src                                             binary       address
ip.tos                                             binary       integer
ip.ttl                                             binary       integer
ip.ver                                             binary       integer
ipmask(mask4[,mask6])                              address      address
json([input-code])                                 string       string
json_query(json_path[,output_type])                string       _outtype_
jwt_decrypt_jwk(<jwk>)                             string       binary
jwt_decrypt_cert(<cert>)                           string       binary
jwt_decrypt_secret(<secret>)                       string       binary
jwt_header_query([json_path[,output_type]])        string       string
jwt_payload_query([json_path[,output_type]])       string       string
-- Ключевое слово -----------------------------+- Входной тип + Выходной тип -
jwt_verify(alg,key)                                string       integer
jwt_verify_cert(alg,cert)                          string       integer
language(value[,default])                          string       string
length                                             string       integer
lower                                              string       string
ltime(format[,offset])                             integer      string
ltrim(chars)                                       string       string
map(map_name[,default_value])                      string       string
map_match(map_name[,default_value])                _match_      string
map_match_output(map_name[,default_value])         _match_      _output_
mod(value)                                         integer      integer
mqtt_field_value(pkt_type,fieldname_or_prop_ID)    binary       binary
mqtt_is_valid                                      binary       boolean
ms_ltime(format[,offset])                          integer      string
ms_utime(format[,offset])                          integer      string
mul(value)                                         integer      integer
nbsrv                                              string       integer
neg                                                integer      integer
not                                                integer      boolean
odd                                                integer      boolean
or(value)                                          integer      integer
-- Ключевое слово -----------------------------+- Входной тип + Выходной тип -
param(name[,delim])                                string       string
port_only                                          string       integer
protobuf(field_number[,field_type])                binary       binary
regsub(regex,subst[,flags])                        string       string
reverse                                            string       string
reverse_dom                                        string       string
rfc7239_field(field)                               string       string
rfc7239_is_valid                                   string       boolean
rfc7239_n2nn                                       string       address / str
rfc7239_n2np                                       string       integer / str
rfc7239_nn                                         address/str  string
rfc7239_np                                         integer/str  string
rtrim(chars)                                       string       string
sdbm([avalanche])                                  binary       integer
secure_memcmp(var)                                 string       boolean
set-var(var[,cond...])                              any          same
sha1                                               binary       binary
sha2([bits])                                       binary       binary
srv_is_up                                          string       boolean
srv_queue                                          string       integer
strcmp(var)                                        string       boolean
sub(value)                                         integer      integer
table_bytes_in_rate([table])                       any          integer
table_bytes_out_rate([table])                      any          integer
table_clr_gpc(idx[,table])                         any          integer
table_clr_gpc0([table])                            any          integer
table_clr_gpc1([table])                            any          integer
table_conn_cnt([table])                            any          integer
-- Ключевое слово -----------------------------+- Входной тип + Выходной тип -
table_conn_cur([table])                            any          integer
table_conn_rate([table])                           any          integer
table_expire([table[,default_value]])              any          integer
table_glitch_cnt([table])                          any          integer
table_glitch_rate([table])                         any          integer
table_gpc(idx[,table])                             any          integer
table_gpc0([table])                                any          integer
table_gpc0_rate([table])                           any          integer
table_gpc1([table])                                any          integer
table_gpc1_rate([table])                           any          integer
table_gpc_rate(idx[,table])                        any          integer
table_gpt(idx[,table])                             any          integer
table_gpt0([table])                                any          integer
table_http_err_cnt([table])                        any          integer
table_http_err_rate([table])                       any          integer
table_http_fail_cnt([table])                       any          integer
table_http_fail_rate([table])                      any          integer
table_http_req_cnt([table])                        any          integer
table_http_req_rate([table])                       any          integer
table_idle([table[,default_value]])                any          integer
table_inc_gpc(idx[,table])                         any          integer
table_inc_gpc0([table])                            any          integer
table_inc_gpc1([table])                            any          integer
table_kbytes_in([table])                           any          integer
-- Ключевое слово -----------------------------+- Входной тип + Выходной тип -
table_kbytes_out([table])                          any          integer
table_server_id([table])                           any          integer
table_sess_cnt([table])                            any          integer
table_sess_rate([table])                           any          integer
table_trackers([table])                            any          integer
tcp.dst                                            binary       integer
tcp.flags                                          binary       integer
tcp.options.mss                                    binary       integer
tcp.options.sack                                   binary       integer
tcp.options.tsopt                                  binary       integer
tcp.options.tsval                                  binary       integer
tcp.options.wscale                                 binary       integer
tcp.options.wsopt                                  binary       integer
tcp.options_list                                   binary       binary
tcp.seq                                            binary       integer
tcp.src                                            binary       integer
tcp.win                                            binary       integer
ub64dec                                            string       string
ub64enc                                            string       string
ungrpc(field_number[,field_type])                  binary       binary / int
unset-var(var)                                      any          same
upper                                              string       string
url_dec([in_form])                                 string       string
url_enc([enc_type])                                string       string
us_ltime(format[,offset])                          integer      string
us_utime(format[,offset])                          integer      string
utime(format[,offset])                             integer      string
when(condition)                                     any          same
word(index,delimiters[,count])                     string       string
wt6([avalanche])                                   binary       integer
x509_v_err_str                                     integer      string
xor(value)                                         integer      integer
-- Ключевое слово -----------------------------+- Входной тип + Выходной тип -
xxh3([seed])                                       binary       integer
xxh32([seed])                                      binary       integer
xxh64([seed])                                      binary       integer

Далее приведён подробный список ключевых слов преобразователей:

51d.single(<prop>[,<prop>*])

51d.single(<prop>[,<prop>*])

Возвращает значения запрошенных свойств строкой, разделяя их разделителем, заданным параметром “51degrees-property-separator”. Устройство определяется по заголовку User-Agent, переданному преобразователю. Функции можно передать до пяти имён свойств; если имя свойства не найдено, возвращается значение “NoData”.

Пример:

# Here the header "X-51D-DeviceTypeMobileTablet" is added to the request,
# containing values for the three properties requested by using the
# User-Agent passed to the converter.
frontend http-in
  bind *:8081
  default_backend servers
  http-request set-header X-51D-DeviceTypeMobileTablet \
    %[req.fhdr(User-Agent),51d.single(DeviceType,IsMobile,IsTablet)]

add(<value>)

add(<value>)

Прибавляет <value> к входному значению типа целого числа со знаком и возвращает результат как целое число со знаком. <value> может быть числом или именем переменной. Подробности о переменных см. в разделе 2.8 .

add_item(<delim>[,<var>[,<suff>]])

add_item(<delim>[,<var>[,<suff>]])

Присоединяет к текущему образцу от 2 до 3 полей, после чего образец преобразуется в строку. Первое поле, <delim>, — постоянная строка, добавляемая сразу после существующего образца, если он не пуст и при этом хотя бы одно из полей <var> или <suff> не пусто. Второе поле, <var>, — имя переменной. Переменная ищется, её содержимое преобразуется в строку и добавляется сразу после части <delim>. Если переменная не найдена, ничего не добавляется. Этот аргумент необязателен; после него можно также указать постоянную строку <suff>. Однако если <var> опущен, <suff> обязателен. Преобразователь похож на concat и позволяет создавать новые переменные из последовательности других переменных. Основное отличие в том, что он проверяет, имеет ли смысл добавлять разделитель: например, это не нужно, если текущий образец пуст. С преобразователем concat в таком случае потребовались бы 2 отдельных правила, причём первое должно было бы проверять, пуста ли строка текущего образца, прежде чем добавлять разделитель. Если разделителем должна быть запятая или закрывающая круглая скобка, её нужно защитить кавычками или обратными косыми чертами. Сами эти символы также должны быть защищены от удаления парсером первого уровня; о кавычках и экранировании см. раздел 2.2 . Примеры приведены ниже.

Пример:

http-request set-var(req.tagged) 'var(req.tagged),add_item(",",req.score1,"(site1)") if src,in_table(site1)'
http-request set-var(req.tagged) 'var(req.tagged),add_item(",",req.score2,"(site2)") if src,in_table(site2)'
http-request set-var(req.tagged) 'var(req.tagged),add_item(",",req.score3,"(site3)") if src,in_table(site3)'
http-request set-header x-tagged %[var(req.tagged)]

http-request set-var(req.tagged) 'var(req.tagged),add_item(",",req.score1),add_item(",",req.score2)'
http-request set-var(req.tagged) 'var(req.tagged),add_item(",",,(site1))' if src,in_table(site1)

aes_cbc_dec(<bits>,<nonce>,<key>[,<aad>])

aes_cbc_dec(<bits>,<nonce>,<key>[,<aad>])

Расшифровывает входные необработанные байты алгоритмом AES128-CBC, AES192-CBC или AES256-CBC в зависимости от параметра <bits>. Все остальные параметры должны быть закодированы в base64, а результат возвращается в виде необработанных байтов. Параметр <aad> необязателен. Если проверка <aad> не проходит, преобразователь не возвращает данных. <nonce>, <key> и <aad> могут быть строками или переменными. Для этого преобразователя требуется OpenSSL версии не ниже 1.0.1.

Пример:

http-response set-header X-Decrypted-Text %[var(txn.enc),\
  aes_cbc_dec(128,txn.nonce,Zm9vb2Zvb29mb29wZm9vbw==)]

aes_cbc_enc(<bits>,<nonce>,<key>[,<aad>])

aes_cbc_enc(<bits>,<nonce>,<key>[,<aad>])

Шифрует входные необработанные байты алгоритмом AES128-CBC, AES192-CBC или AES256-CBC в зависимости от параметра <bits>. Параметры <nonce>, <key> и <aad> должны быть закодированы в base64. Параметр <aad> необязателен. Результат возвращается в виде необработанных байтов. <nonce>, <key> и <aad> могут быть строками или переменными. Для этого преобразователя требуется OpenSSL версии не ниже 1.0.1.

Пример:

http-response set-header X-Encrypted-Text %[var(txn.plain),\
  aes_cbc_enc(128,txn.nonce,Zm9vb2Zvb29mb29wZm9vbw==)]

aes_gcm_dec(<bits>,<nonce>,<key>,<aead_tag>[,<aad>])

aes_gcm_dec(<bits>,<nonce>,<key>,<aead_tag>[,<aad>])

Расшифровывает входные необработанные байты алгоритмом AES128-GCM, AES192-GCM или AES256-GCM в зависимости от параметра <bits>. Все остальные параметры должны быть закодированы в base64, а результат возвращается в виде необработанных байтов. Если проверка <aead_tag> или <aad> не проходит, преобразователь не возвращает данных. Параметр <aad> необязателен. <nonce>, <key>, <aead_tag> и <aad> могут быть строками или переменными. Для этого преобразователя требуется OpenSSL версии не ниже 1.0.1.

Пример:

http-response set-header X-Decrypted-Text %[var(txn.enc),\
  aes_gcm_dec(128,txn.nonce,Zm9vb2Zvb29mb29wZm9vbw==,txn.aead_tag)]

aes_gcm_enc(<bits>,<nonce>,<key>,<aead_tag>[,<aad>])

aes_gcm_enc(<bits>,<nonce>,<key>,<aead_tag>[,<aad>])

Шифрует входные необработанные байты алгоритмом AES128-GCM, AES192-GCM или AES256-GCM в зависимости от параметра <bits>. Параметры <nonce>, <key> и <aad> должны быть закодированы в base64. Параметр <aead_tag> должен быть переменной: в неё будет сохранён тег AEAD, закодированный в base64. Параметр <aad> необязателен. Результат возвращается в виде необработанных байтов. <nonce>, <key> и <aad> могут быть строками или переменными. Для этого преобразователя требуется OpenSSL версии не ниже 1.0.1.

Пример:

http-response set-header X-Encrypted-Text %[var(txn.plain),\
  aes_gcm_enc(128,txn.nonce,Zm9vb2Zvb29mb29wZm9vbw==,txn.aead_tag)]

and(<value>)

and(<value>)

Выполняет побитовое “AND” между <value> и входным значением типа целого числа со знаком; результат возвращается как целое число со знаком. <value> может быть числом или именем переменной. Подробности о переменных см. в разделе 2.8 .

b64dec

b64dec

Преобразует (декодирует) входную строку, закодированную в base64, в двоичное представление. Это операция, обратная base64(). Для варианта base64url(“URL and Filename Safe Alphabet” (RFC 4648)) см. “ub64dec”.

base2

base2

Преобразует входной двоичный образец в строку двоичных цифр, содержащую восемь цифр на каждый входной байт. Используется для сопоставления по самому длинному префиксу с типами, чьё собственное представление не допускает сопоставления по префиксу, например с IP-префиксами.

base64

base64

Преобразует входной двоичный образец в строку base64. Используется для записи в журнал или передачи двоичного содержимого в виде, пригодном для надёжной передачи; например, идентификатор SSL можно скопировать в заголовок. Для варианта base64url(“URL and Filename Safe Alphabet” (RFC 4648)) см. “ub64enc”.

be2dec(<separator>,<chunk_size>[,<truncate>])

be2dec(<separator>,<chunk_size>[,<truncate>])

Преобразует входной двоичный образец с порядком байтов от старшего к младшему в строку, содержащую по одному беззнаковому целому числу на каждые <chunk_size> входных байтов. Если указан <separator>, он вставляется через каждые <chunk_size> двоичных входных байтов. Флаг <truncate> определяет, усекаются ли входные двоичные данные по границам <chunk_size>. Максимальное значение <chunk_size> ограничено размером long long int (8 байт).

Пример:

bin(01020304050607),be2dec(:,2)   # 258:772:1286:7
bin(01020304050607),be2dec(-,2,1) # 258-772-1286
bin(01020304050607),be2dec(,2,1)  # 2587721286
bin(7f000001),be2dec(.,1)         # 127.0.0.1

le2dec(<separator>,<chunk_size>[,<truncate>])

le2dec(<separator>,<chunk_size>[,<truncate>])

Преобразует входной двоичный образец с порядком байтов от младшего к старшему в строку, содержащую по одному беззнаковому целому числу на каждые <chunk_size> входных байтов. Если указан <separator>, он вставляется через каждые <chunk_size> двоичных входных байтов. Флаг <truncate> определяет, усекаются ли входные двоичные данные по границам <chunk_size>. Максимальное значение <chunk_size> ограничено размером long long int (8 байт).

Пример:

bin(01020304050607),le2dec(:,2)   # 513:1284:2055:7
bin(01020304050607),le2dec(-,2,1) # 513-1284-2055
bin(01020304050607),le2dec(,2,1)  # 51312842055
bin(7f000001),le2dec(.,1)         # 127.0.0.1

be2hex([<separator>[,<chunk_size>[,<truncate>]]])

be2hex([<separator>[,<chunk_size>[,<truncate>]]])

Преобразует входной двоичный образец с порядком байтов от старшего к младшему в шестнадцатеричную строку, содержащую по две цифры на каждый входной байт. Используется для записи в журнал или передачи шестнадцатеричных дампов двоичных входных данных в виде, пригодном для надёжной передачи; например, идентификатор SSL можно скопировать в заголовок. Если указан <separator>, он вставляется через каждые <chunk_size> двоичных входных байтов. Флаг <truncate> определяет, усекаются ли входные двоичные данные по границам <chunk_size>.

Пример:

bin(01020304050607),be2hex         # 01020304050607
bin(01020304050607),be2hex(:,2)    # 0102:0304:0506:07
bin(01020304050607),be2hex(--,2,1) # 0102--0304--0506
bin(0102030405060708),be2hex(,3,1) # 010203040506

bool

bool

Возвращает логическое TRUE, если входное значение типа целого числа со знаком ненулевое, иначе возвращает FALSE. Совместно с and() может использоваться для получения true/false при проверке битов входного значения, например для проверки наличия флага.

bytes(<offset>[,<length>])

bytes(<offset>[,<length>])

Извлекает несколько байтов из входного двоичного образца. Результат — двоичный образец, начинающийся с указанного смещения (в байтах) относительно исходного образца и при необходимости усечённый до заданной длины. <offset> и <length> могут быть числами или именами переменных. Преобразователь возвращает пустой образец, если <offset> или <length> недопустимо. Недопустимое <offset> — отрицательное значение или значение >= длины входного образца. Недопустимое <length> — отрицательное значение.

Пример:

http-request set-var(txn.input) req.hdr(input) # let's say input is "012345"

http-response set-header bytes_0 "%[var(txn.input),bytes(0)]"  # outputs "012345"
http-response set-header bytes_1_3 "%[var(txn.input),bytes(1,3)]"  # outputs "123"

http-response set-var(txn.var_start) int(1)
http-response set-var(txn.var_length) int(3)
http-response set-header bytes_var1_var3    "%[var(txn.input),bytes(txn.var_start,txn.var_length)]"  # outputs "123"

capture-req(<id>)

capture-req(<id>)

Сохраняет строковое значение в слоте запроса <id> и возвращает его без изменений. Если слот не существует, захват завершается неудачей без сообщения об ошибке.

См. также: “declare capture”, “http-request capture”, “http-response capture”, “capture.req.hdr” и “capture.res.hdr” (методы извлечения образцов).

capture-res(<id>)

capture-res(<id>)

Сохраняет строковое значение в слоте ответа <id> и возвращает его без изменений. Если слот не существует, захват завершается неудачей без сообщения об ошибке.

См. также: “declare capture”, “http-request capture”, “http-response capture”, “capture.req.hdr” и “capture.res.hdr” (методы извлечения образцов).

concat([<start>[,<var>[,<end>]]])

concat([<start>[,<var>[,<end>]]])

Присоединяет к текущему образцу до 3 полей, после чего образец преобразуется в строку. Первое поле, <start>, — постоянная строка, добавляемая сразу после существующего образца. Если она не нужна, поле можно опустить. Второе поле, <var>, — имя переменной. Переменная ищется, её содержимое преобразуется в строку и добавляется сразу после части <first>. Если переменная не найдена, ничего не добавляется. Это поле тоже можно опустить. Третье поле, <end>, — постоянная строка, добавляемая после переменной; её также можно опустить. Вместе эти элементы позволяют присоединять переменные с разделителями к уже существующему набору переменных. Так можно создавать новые переменные из последовательности других переменных, например со значениями, разделёнными двоеточиями. Если разделителем должна быть запятая или закрывающая круглая скобка, её нужно защитить кавычками или обратными косыми чертами. Сами эти символы также должны быть защищены от удаления парсером первого уровня. Это часто используется для создания составных переменных из других, хотя иногда удобнее использовать строку формата с несколькими полями. Примеры приведены ниже.

Пример:

tcp-request session set-var(sess.src) src
tcp-request session set-var(sess.dn)  ssl_c_s_dn
tcp-request session set-var(txn.sig) str(),concat(<ip=,sess.ip,>),concat(<dn=,sess.dn,>)
tcp-request session set-var(txn.ipport) "str(),concat('addr=(',sess.ip),concat(',',sess.port,')')"
tcp-request session set-var-fmt(txn.ipport) "addr=(%[sess.ip],%[sess.port])"  ## does the same
http-request set-header x-hap-sig %[var(txn.sig)]

cpl

cpl

Вычисляет обратный код входного целого числа со знаком (инвертирует все биты) и возвращает результат как целое число со знаком.

crc32([<avalanche>])

crc32([<avalanche>])

Хэширует двоичный входной образец в беззнаковое 32-битное значение с использованием хэш-функции CRC32. К результату можно дополнительно применить хеш-функцию с полным лавинным эффектом, если необязательный аргумент <avalanche> равен 1. Этот преобразователь использует те же функции, что и различные алгоритмы балансировки нагрузки на основе хэширования, поэтому обеспечивает точно такие же результаты. Предназначен для совместимости с другими программными продуктами, которым требуется вычисление CRC32 на основе входных ключей, следуя наиболее распространённой реализации, как в Ethernet, Gzip, PNG и т.д. Он медленнее других алгоритмов, но может обеспечить лучшее или по крайней мере менее предсказуемое распределение. Не должен использоваться в целях безопасности, так как хэш размером 32 бит легко взломать. См. также “djb2”, “sdbm”, “wt6”, “crc32c” и директиву “hash-type”.

crc32c([<avalanche>])

crc32c([<avalanche>])

Хэширует двоичный входной образец в беззнаковое 32-битное значение с использованием хэш-функции CRC32C. К результату можно дополнительно применить хеш-функцию с полным лавинным эффектом, если необязательный аргумент <avalanche> равен 1. Этот преобразователь использует те же функции, что описаны в RFC4960, Приложение B [8]. Предназначен для совместимости с другими программными продуктами, которым требуется вычисление CRC32C на основе входных ключей. Он медленнее других алгоритмов и не должен использоваться в целях безопасности, так как хэш размером 32 бит легко взломать. См. также “djb2”, “sdbm”, “wt6”, “crc32” и директиву “hash-type”.

cut_crlf

cut_crlf

Обрезает строковое представление входного образца по первому символу возврата каретки (’\r’) или новой строки (’\n’). Изменяется только длина строки.

da-csv-conv(<prop>[,<prop>*])

da-csv-conv(<prop>[,<prop>*])

Вызывает преобразователь DeviceAtlas для распознавания переданной на вход строки User Agent и возвращает строку из объединённых свойств, перечисленных в аргументе. Они разделяются символом, заданным глобальным ключевым словом “deviceatlas-property-separator”, а по умолчанию — вертикальной чертой (’|’). Язык конфигурации HAProxy ограничивает число различных свойств значением 12.

Пример:

frontend www
  bind *:8881
  default_backend servers
  http-request set-header X-DeviceAtlas-Data %[req.fhdr(User-Agent),da-csv(primaryHardwareType,osName,osVersion,browserName,browserVersion,browserRenderingEngine)]

date

date

Этот преобразователь используется для преобразования даты из заголовка HTTP. Это может быть дата в формате IMF, ASCTIME или RFC850. Выводит метку времени в формате UNIX.

Пример:

http-request return lf-string "%[str('Sun, 06 Nov 1994 08:49:37 GMT'),date]\n" content-type text/plain

debug([<prefix][,<destination>])

debug([<prefix][,<destination>])

Этот преобразователь используется для отладки. Он захватывает входной образец и отправляет его в приёмник событий <destination>, который может обозначать кольцевой буфер, например “buf0”, а также “stdout” или “stderr”. Доступные приёмники можно посмотреть во время работы командой “show events” в CLI. Если приёмник не указан, вывод направляется в “buf0”, который можно просмотреть командой CLI “show events”. Чтобы различать вывод нескольких выражений, можно передать необязательный префикс <prefix>. Он появится перед двоеточием в выводимом сообщении. Входной образец передаётся на выход без изменений, поэтому преобразователь debug можно безопасно вставить в любое место цепочки, даже для образцов непечатаемых типов.

Пример:

tcp-request connection track-sc0 src,debug(track-sc)

digest(<algorithm>)

digest(<algorithm>)

Преобразует входной двоичный образец в хеш сообщения. Результат — двоичный образец. <algorithm> должен быть именем хеш-функции OpenSSL, например sha256.

Обратите внимание: этот преобразователь доступен только в том случае, если HAProxy собран с USE_OPENSSL.

div(<value>)

div(<value>)

Делит входное целое число со знаком на <value> и возвращает результат как целое число со знаком. Если <value> равен нулю, возвращается наибольшее беззнаковое целое число, обычно 2^63-1. <value> может быть числом или именем переменной. Подробности о переменных см. в разделе 2.8 .

djb2([<avalanche>])

djb2([<avalanche>])

Хэширует двоичный входной образец в беззнаковое 32-битное значение с использованием хэш-функции DJB2. К результату можно дополнительно применить хеш-функцию с полным лавинным эффектом, если необязательный аргумент <avalanche> равен 1. Этот преобразователь использует те же функции, что и различные алгоритмы балансировки нагрузки на основе хэширования, поэтому обеспечивает точно такие же результаты. В основном предназначен для отладки, но может использоваться как запись в таблице привязок для сбора приблизительной статистики. Не должен использоваться в целях безопасности, так как хэш размером 32 бит легко взломать. См. также “crc32”, “sdbm”, “wt6”, “crc32c” и директиву “hash-type”.

eth.data

eth.data

Используется с входным образцом, представляющим двоичный кадр Ethernet, который возвращает “fc_saved_syn”, когда параметр “tcp-ss” директивы bind равен “2”. Пропускает весь заголовок Ethernet, включая возможные VLAN, и возвращает блок двоичных данных, начинающийся с протокола уровня 3 (обычно IPv4 или IPv6). См. также “fc_saved_syn” и “tcp-ss”.

eth.dst

eth.dst

Используется с входным образцом, представляющим двоичный кадр Ethernet, который возвращает “fc_saved_syn”, когда параметр “tcp-ss” директивы bind равен “2”. Возвращает 6 байт заголовка Ethernet, соответствующих адресу назначения кадра, как двоичный блок. См. также “fc_saved_syn” и “tcp-ss”.

eth.hdr

eth.hdr

Используется с входным образцом, представляющим двоичный кадр Ethernet, который возвращает “fc_saved_syn”, когда параметр “tcp-ss” директивы bind равен “2”. Обрезает всё, что находится после заголовка Ethernet, но сохраняет возможные VLAN, и возвращает этот заголовок как двоичный блок. См. также “fc_saved_syn” и “tcp-ss”.

eth.proto

eth.proto

Используется с входным образцом, представляющим двоичный кадр Ethernet, который возвращает “fc_saved_syn”, когда параметр “tcp-ss” директивы bind равен “2”. Возвращает номер протокола (также известный как EtherType), найденный в заголовке Ethernet после любого необязательного VLAN, в виде целого числа. Обычно это 0x800 для IPv4 или 0x86DD для IPv6. См. также “fc_saved_syn” и “tcp-ss”.

eth.src

eth.src

Используется с входным образцом, представляющим двоичный кадр Ethernet, который возвращает “fc_saved_syn”, когда параметр “tcp-ss” директивы bind равен “2”. Возвращает 6 байт заголовка Ethernet, соответствующих адресу источника кадра, как двоичный блок. См. также “fc_saved_syn” и “tcp-ss”.

eth.vlan

eth.vlan

Используется с входным образцом, представляющим двоичный кадр Ethernet, который возвращает “fc_saved_syn”, когда параметр “tcp-ss” директивы bind равен “2”. Возвращает последний VLAN ID, найденный в заголовке Ethernet, в виде целого числа. См. также “fc_saved_syn” и “tcp-ss”.

even

even

Возвращает логическое TRUE, если входное целое число со знаком чётное, иначе возвращает FALSE. Функционально эквивалентен “not,and(1),bool”.

field(<index>,<delimiters>[,<count>])

field(<index>,<delimiters>[,<count>])

Извлекает из входной строки подстроку по заданному индексу с учётом указанных разделителей. Отсчёт ведётся от начала при положительном индексе или от конца при отрицательном. Индексы начинаются с 1 или -1, а разделители задаются списком символов в виде строки. Можно указать количество извлекаемых полей <count>; по умолчанию оно равно 1. Значение 0 означает извлечение всех оставшихся полей.

Пример:

str(f1_f2_f3__f5),field(4,_)    # <empty>
str(f1_f2_f3__f5),field(5,_)    # f5
str(f1_f2_f3__f5),field(2,_,0)  # f2_f3__f5
str(f1_f2_f3__f5),field(2,_,2)  # f2_f3
str(f1_f2_f3__f5),field(-2,_,3) # f2_f3_
str(f1_f2_f3__f5),field(-3,_,0) # f1_f2_f3

fe_exists

fe_exists

Принимает на вход имя фронтенда и возвращает логическое TRUE, если фронтенд с таким именем существует в текущей конфигурации; иначе возвращает FALSE. Может использоваться там, где полезна проверка наличия фронтенда по динамическому имени, например при поиске в таблице соответствий или ответе на внешнюю проверку.

Пример:

http-request deny unless { var(txn.fe_name),fe_exists }

fix_is_valid

fix_is_valid

Разбирает двоичную полезную нагрузку и выполняет проверки корректности для FIX (Financial Information eXchange):

  • проверяет, что все идентификаторы тегов и их значения не пустые, а идентификаторы тегов — корректные числа
  • проверяет, что тег BeginString является первым тегом с допустимой версией FIX
  • проверяет, что тег BodyLength — второй тег с правильной длиной тела
  • проверяет, что тег MsgType — третий тег
  • проверяет, что последний тег в сообщении — это тег CheckSum с корректной контрольной суммой

Из-за текущего устройства HAProxy можно разобрать только первое сообщение клиента и первое сообщение сервера.

Этот преобразователь возвращает логическое значение: true, если полезная нагрузка содержит корректное сообщение FIX, и false — в противном случае.

См. также преобразователь fix_tag_value.

Пример:

tcp-request inspect-delay 10s
tcp-request content reject unless { req.payload(0,0),fix_is_valid }

fix_tag_value(<tag>)

fix_tag_value(<tag>)

Анализирует сообщение FIX (Financial Information eXchange) и извлекает значение из тега <tag>. <tag> может быть строкой или целым числом, указывающим на нужный тег. Любое целочисленное значение допускается, но только следующие строки преобразуются в их целочисленные эквиваленты: BeginString, BodyLength, MsgType, SenderCompID, TargetCompID, CheckSum. Другие имена тегов можно легко добавить.

Из-за текущего устройства HAProxy можно разобрать только первое сообщение клиента и первое сообщение сервера. Этот преобразователь не проверяет корректность сообщения. Настоятельно рекомендуется сначала проверить сообщение преобразователем fix_is_valid.

См. также преобразователь fix_is_valid.

Пример:

tcp-request inspect-delay 10s
tcp-request content reject unless { req.payload(0,0),fix_is_valid }
# MsgType tag ID is 35, so both lines below will return the same content
tcp-request content set-var(txn.foo) req.payload(0,0),fix_tag_value(35)
tcp-request content set-var(txn.bar) req.payload(0,0),fix_tag_value(MsgType)

has_ctl([mask])

has_ctl([mask])

Проверяет входной двоичный образец на наличие управляющих символов, заданных аргументом маски. Маска — 33-битное число, десятичное или шестнадцатеричное с префиксом “0x”. В ней устанавливается бит для каждого искомого символа в диапазоне от 0x00 до 0x1F; бит 32 соответствует символу DEL (0x7F). Если маска не задана, преобразователь использует значение 0x1FFFFFDFF: оно соответствует всем управляющим символам, кроме TAB (0x09), часто используемого в заголовках HTTP. Специальная маска “any” равна 0x1FFFFFFFF и соответствует всем управляющим символам, включая TAB. Специальная маска “http” равна 0x2401 и позволяет обнаруживать только управляющие символы, запрещённые в значениях заголовков HTTP: CR (0x0D), LF (0x0A) и NUL (0x00).

Примеры:

# reject presence of DEL, CR, LF, NUL characters in the referer header
http-request deny if { req.fhdr(referer),has_ctl(0x100002401) }
# reject presence of any control char but tab in any HTTP header value
http-request deny if { req.hdr(),has_ctl }

hex

hex

Преобразует двоичный образец в шестнадцатеричную строку, содержащую по две шестнадцатеричные цифры на каждый байт входных данных. Используется для ведения журнала или передачи шестнадцатеричных дампов некоторых двоичных данных таким образом, чтобы их можно было надёжно передавать (например, идентификатор SSL может быть скопирован в заголовок).

hex2i

hex2i

Преобразует шестнадцатеричную строку, содержащую по две шестнадцатеричные цифры на каждый байт входных данных, в целое число. Если входное значение содержит символ, не являющийся шестнадцатеричной цифрой, преобразователь завершается неуспешно и ничего не возвращает. Это позволяет отличить некорректные входные данные от допустимого нулевого значения.

hmac(<algorithm>,<key>)

hmac(<algorithm>,<key>)

Преобразует двоичный образец в код аутентификации сообщения с заданным ключом. Результат — двоичный образец. Параметр <algorithm> должен быть одним из зарегистрированных имён хеш-функций OpenSSL (например, sha256). Параметр <key> должен быть закодирован в base64 и может быть строкой или переменной.

Обратите внимание: этот преобразователь доступен только в том случае, если HAProxy собран с USE_OPENSSL.

host_only

host_only

Преобразует строку, содержащую значение заголовка Host, и удаляет из неё порт. Входные данные должны соответствовать формату значения заголовка Host (rfc9110#section-7.2). Поддерживаются следующие форматы: hostname, hostname:80, 127.0.0.1, 127.0.0.1:80, [::1], [::1]:80.

Этот преобразователь также приводит строку к нижнему регистру.

См. также преобразователь “port_only”, который вернёт порт.

htonl

htonl

Преобразует входное целое число в его 32-битное двоичное представление с сетевым порядком байтов. Поскольку методы извлечения образцов используют 64-битные целые числа со знаком, этот преобразователь сначала приводит входное число к беззнаковому 32-битному целому.

http_date([<offset[,<unit>]])

http_date([<offset[,<unit>]])

Преобразует целое число, рассматриваемое как дата, отсчитанная от начала эпохи, в строку с этой датой в формате, пригодном для полей заголовков HTTP. Если задано смещение, оно прибавляется к дате до преобразования. Это особенно полезно для формирования заголовка Date, значений Expires в ответах при положительном смещении или значений Last-Modified при отрицательном. Если задана единица измерения, временная метка трактуется как число секунд от начала эпохи при “s” (по умолчанию), миллисекунд при “ms” или микросекунд при “us”. Смещение считается заданным в тех же единицах, что и входная временная метка.

iif(<true>,<false>)

iif(<true>,<false>)

Возвращает строку <true>, если входное значение истинно. В противном случае возвращает строку <false>.

Пример:

http-request set-header x-forwarded-proto %[ssl_fc,iif(https,http)]

in_table([<table>])

in_table([<table>])

Использует входной образец для поиска в таблице привязок текущего прокси или в указанной таблице привязок. Если ключ не найден в таблице, возвращается логическое значение false. В противном случае — логическое значение true. Может использоваться для проверки наличия определённого ключа в таблице, отслеживающей некоторые элементы (например, был ли уже виден IP-адрес источника или заголовок Authorization).

ip.data

ip.data

Используется с входным образцом, представляющим двоичный кадр Ethernet, который возвращает “fc_saved_syn”, когда параметр “tcp-ss” директивы bind равен “1”, либо с результатом “eth.data”. Пропускает заголовок IP и любые необязательные опции или расширения, и возвращает блок двоичных данных, начинающийся с транспортного протокола (обычно TCP или UDP). См. также “fc_saved_syn”, “tcp-ss” и “eth.data”.

ip.df

ip.df

Используется с входным образцом, представляющим двоичный кадр Ethernet, который возвращает “fc_saved_syn”, когда параметр “tcp-ss” директивы bind равен “1”, либо с результатом “eth.data”. Возвращает целое значение 1, если установлен флаг DF (не фрагментировать) в заголовке IP, иначе — 0. У протокола IPv6 нет флага DF, и он по умолчанию не фрагментирует, поэтому всегда возвращает 1. См. также “fc_saved_syn”, “tcp-ss” и “eth.data”.

ip.dst

ip.dst

Используется с входным образцом, представляющим двоичный кадр Ethernet, который возвращает “fc_saved_syn”, когда параметр “tcp-ss” директивы bind равен “1”, либо с результатом “eth.data”. Возвращает адрес назначения IPv4 или IPv6 из заголовка IPv4/v6. См. также “fc_saved_syn”, “tcp-ss” и “eth.data”.

ip.fp([<mode>])

ip.fp([<mode>])

Используется с входным образцом, представляющим двоичный кадр Ethernet, который возвращает “fc_saved_syn”, когда параметр “tcp-ss” директивы bind равен “1”, либо с результатом “eth.data”. Анализирует различные части заголовков IP и TCP, чтобы построить своего рода отпечаток их неизменных частей. Он позволяет различать несколько внешне одинаковых узлов. На практике это применяется для более точного определения узлов с некорректным поведением за общим IP-адресом, чтобы не блокировать легитимных пользователей, когда некорректно ведёт себя и требует блокировки только один узел. На основе входных данных преобразователь строит двоичный блок размером не менее 8 байт. Байты отпечатка расположены следующим образом: - байт 0: поле IP TOS (см. ip.tos) - байт 1: - бит 7: IPv6 (1) / IPv4 (0) - бит 6: ip.df - биты 5..4: 0:ip.ttl<=32; 1:ip.ttl<=64; 2:ip.ttl<=128; 3:ip.ttl<=255 - бит 3: опции IP присутствуют (1) / отсутствуют (0) - бит 2: данные TCP присутствуют (1) / отсутствуют (0) - бит 1: в TCP.flags установлен CWR (1) / сброшен (0) - бит 0: в TCP.flags установлен ECE (1) / сброшен (0) - байт 2: - биты 7..4: длина заголовка TCP в 4-байтных словах - биты 3..0: масштаб окна TCP + 1 (1..15) / 0 (WS не объявлен) - байты 3..4: tcp.win - байты 5..6: tcp.options.mss или ноль, если отсутствует - байт 7: по 1 биту на каждую присутствующую опцию TCP; опции от 2 до 8 соответствуют битам 0..6, а бит 7 обозначает наличие любой опции от 9 до 255.

Аргумент <mode> позволяет добавить в отпечаток дополнительную информацию. По умолчанию, если <mode> не задан или равен нулю, отпечаток состоит только из описанных выше 8 байт. Если <mode> задан другим значением, оно означает сумму следующих значений; соответствующие компоненты присоединяются к отпечатку в указанном порядке: - 1: к отпечатку добавляется полученное значение TTL (1 байт) - 2: к отпечатку добавляется список видов опций TCP, возвращаемый “tcp.options_list” и занимающий от 0 до 40 дополнительных байт - 4: к отпечатку добавляется IP-адрес источника, что увеличивает его на 4 байта для IPv4 или на 16 для IPv6.

Пример: создать отпечаток размером 13..25 байт, используя базовый FP, TTL и адрес источника (1+4=5):

frontend test
    mode http
    bind :4445 tcp-ss 1
    tcp-request connection set-var(sess.syn) fc_saved_syn
    http-request return status 200 content-type text/plain lf-string &#92;
          "src=%[var(sess.syn),ip.src] fp=%[var(sess.syn),ip.fp(5),hex]&#92;n"

См. также “fc_saved_syn”, “tcp-ss”, “eth.data”, “ip.df”, “ip.ttl”, “tcp.win”, “tcp.options.mss” и “tcp.options_list”.

ip.hdr

ip.hdr

Используется с входным образцом, представляющим двоичный кадр Ethernet, который возвращает “fc_saved_syn”, когда параметр “tcp-ss” директивы bind равен “1”, либо с результатом “eth.data”. Возвращает блок двоичных данных, начинающийся с заголовка IP и заканчивающийся после последней опции или расширения, до начала заголовка транспортного протокола. См. также “fc_saved_syn”, “tcp-ss” и “eth.data”.

ip.proto

ip.proto

Используется с входным образцом, представляющим двоичный кадр Ethernet, который возвращает “fc_saved_syn”, когда параметр “tcp-ss” директивы bind равен “1”, либо с результатом “eth.data”. Возвращает номер транспортного протокола, обычно 6 для TCP или 17 для UDP. См. также “fc_saved_syn”, “tcp-ss” и “eth.data”.

ip.src

ip.src

Используется с входным образцом, представляющим двоичный кадр Ethernet, который возвращает “fc_saved_syn”, когда параметр “tcp-ss” директивы bind равен “1”, либо с результатом “eth.data”. Возвращает адрес источника IPv4 или IPv6 из заголовка IPv4/v6. См. также “fc_saved_syn”, “tcp-ss” и “eth.data”.

ip.tos

ip.tos

Используется с входным образцом, представляющим двоичный кадр Ethernet, который возвращает “fc_saved_syn”, когда параметр “tcp-ss” директивы bind равен “1”, либо с результатом “eth.data”. Возвращает целое число, соответствующее значению поля type-of-service (TOS) в заголовке IPv4 или поля traffic class (TC) в заголовке IPv6. Обратите внимание, что в современной интернет-инфраструктуре это поле чаще всего содержит значение DSCP (Differentiated Services Codepoint) в старших 6 битах, а два младших бита либо не используются, либо используются механизмом IP ECN. См. RFC2474 и RFC8436 для значений DSCP, и RFC3168 для полей IP ECN. См. также “fc_saved_syn”, “tcp-ss” и “eth.data”.

ip.ttl

ip.ttl

Используется с входным образцом, представляющим двоичный кадр Ethernet, который возвращает “fc_saved_syn”, когда параметр “tcp-ss” директивы bind равен “1”, либо с результатом “eth.data”. Возвращает целое число, соответствующее полю TTL (Time To Live) или HL (Hop Limit) в заголовке IPv4/IPv6. Обычно этому полю присваивается фиксированное начальное значение и уменьшается на каждом маршрутизаторе, через который проходит пакет. Если начальное значение известно, это помогает оценить, с какого расстояния подключается клиент. Обратите внимание, что большинство современных операционных систем начинают с начального значения 64. См. также “fc_saved_syn”, “tcp-ss” и “eth.data”.

ip.ver

ip.ver

Используется с входным образцом, представляющим двоичный кадр Ethernet, который возвращает “fc_saved_syn”, когда параметр “tcp-ss” директивы bind равен “1”, либо с результатом “eth.data”. Возвращает версию IP из заголовка IP, обычно 4 или 6. Обратите внимание, что не проверяется соответствие номера протокола в кадре Ethernet вышележащего уровня, но поскольку ожидается использование с корректными пакетами, предполагается, что операционная система уже выполнила эту проверку. См. также “fc_saved_syn”, “tcp-ss” и “eth.data”.

ipmask(<mask4>[,<mask6>])

ipmask(<mask4>[,<mask6>])

Применяет маску к IP-адресу и использует результат для поиска и хранения. Это позволяет всем узлам в пределах заданной маски использовать общие записи таблицы и, следовательно, один сервер. mask4 можно задать в записи с точками, например 255.255.255.0, или в форме CIDR, например 24. mask6 можно задать группами из четырёх шестнадцатеричных цифр, например ffff:ffff::, или в форме CIDR, например 64. Если mask6 не задана, преобразование адресов IPv6 завершается неудачей по соображениям обратной совместимости.

json([<input-code>])

json([<input-code>])

Экранирует входную строку и формирует выходную строку ASCII, готовую к использованию как строка JSON. Преобразователь пытается декодировать входную строку в соответствии с параметром <input-code>. Он может принимать значения “ascii”, “utf8”, “utf8s”, “utf8p” или “utf8ps”. Декодер “ascii” никогда не завершается с ошибкой. Декодер “utf8” обнаруживает 3 типа ошибок:

  • некорректная последовательность UTF-8: одиночный байт продолжения, неверное число байтов продолжения и т. п.;
  • недопустимый диапазон: декодированное значение попадает в запрещённый диапазон UTF-8;
  • избыточное кодирование: значение закодировано большим числом байтов, чем требуется.

Кодирование UTF-8 в JSON может вызвать ошибку “too long value”, если символ UTF-8 имеет значение больше 0xffff: спецификация экранирования строк JSON допускает только 4 шестнадцатеричные цифры для кодирования значения. Декодер UTF-8 существует в 4 вариантах, обозначаемых сочетанием двух буквенных суффиксов: “p” — разрешающий режим, “s” — игнорирование без сообщений. Декодеры ведут себя следующим образом:

  • “ascii”: никогда не завершается с ошибкой;
  • “utf8”: завершается с ошибкой при обнаружении любой ошибки;
  • “utf8s”: никогда не завершается с ошибкой, но удаляет символы, соответствующие ошибкам;
  • “utf8p”: принимает и исправляет ошибки избыточного кодирования, но завершается с ошибкой при любой другой ошибке;
  • “utf8ps”: никогда не завершается с ошибкой, принимает и исправляет ошибки избыточного кодирования, но удаляет символы, соответствующие другим ошибкам.

Этот преобразователь особенно полезен для формирования правильно экранированного JSON при отправке журналов трафика на серверы, принимающие их в формате JSON.

Пример:

capture request header Host len 15
capture request header user-agent len 150
log-format '{"ip":"%[src]","user-agent":"%[capture.req.hdr(1),json(utf8s)]"}'

Входящий запрос от клиента 127.0.0.1:

GET / HTTP/1.0
User-Agent: Very "Ugly" UA 1/2

Полученная запись журнала:

{"ip":"127.0.0.1","user-agent":"Very \"Ugly\" UA 1\/2"}

json_query(<json_path>[,<output_type>])

json_query(<json_path>[,<output_type>])

Преобразователь json_query поддерживает типы JSON string, boolean, number и array. Числа с плавающей точкой возвращаются строкой. Если задать output_type ‘int’, значение преобразуется в целое число. Массивы возвращаются строкой, которая начинается и заканчивается квадратными скобками. Содержимое имеет формат CSV. В зависимости от типа данных значения массива могут заключаться в кавычки. Если значения массива имеют сложные типы, строка содержит полное представление JSON каждого значения через запятую. Пример результата запроса ролей к JWT:

["manage-account","manage-account-links","view-profile"]

Если преобразование невозможно, преобразователь json_query завершается с ошибкой.

<json_path> должен быть корректной строкой JSON Path, определённой в https://datatracker.ietf.org/doc/draft-ietf-jsonpath-base/

Примечание: в зависимости от контекста и реализации результат извлечения повторяющихся ключей JSON не определён: может быть возвращено первое, последнее или любое другое вхождение одного ключа во входном содержимом. Если имена ключей переданы в закодированном виде, они не всегда будут сопоставлены. Таким образом, этот преобразователь не подходит для очистки содержимого.

Пример:

# get a integer value from the request body
# "{"integer":4}" => 5
http-request set-var(txn.pay_int) req.body,json_query('$.integer','int'),add(1)

# get a key with '.' in the name
# {"my.key":"myvalue"} => myvalue
http-request set-var(txn.pay_mykey) req.body,json_query('$.my\\.key')

# {"boolean-false":false} => 0
http-request set-var(txn.pay_boolean_false) req.body,json_query('$.boolean-false')

# get the value of the key 'iss' from a JWT Bearer token
http-request set-var(txn.token_payload) req.hdr(Authorization),word(2,.),ub64dec,json_query('$.iss')

jwt_decrypt_cert(<cert>)

jwt_decrypt_cert(<cert>)

Выполняет проверку подписи веб-токена JSON в формате JSON Web Encryption (см. RFC 7516) на входе и возвращает его содержимое, расшифрованное с помощью предоставленного сертификата. Параметр <cert> должен быть путём к уже загруженному сертификату (который можно выгрузить с помощью команды “dump ssl cert” CLI). Сертификат должен иметь опцию “jwt”, явно установленную в значение “on” (см. опцию crt-list “jwt”). Путь можно указать напрямую или через переменную. На данный момент поддерживаются только токены, использующие формат компактной сериализации (пять строк base64-url, разделённых точками).

Преобразователь можно использовать для токенов с одним из следующих алгоритмов в поле “alg” заголовка JOSE: RSA-OAEP, RSA-OAEP-256, ECDH-ES, ECDH-ES+A128KW, ECDH-ES+A192KW или ECDH-ES+A256KW. Алгоритм RSA1_5 реализован, но по умолчанию отключён согласно рекомендации раздела 3.2 RFC 8725. При необходимости его можно снова включить глобальным параметром ‘jwt.decrypt_alg_list’.

Поддерживаемые алгоритмы и алгоритмы шифрования, задаваемые соответственно полями “alg” и “enc” заголовка JOSE, можно изменить глобальными параметрами ‘jwt.decrypt_alg_list’ и ‘jwt.decrypt_enc_list’.

Токен JWE должен быть предоставлен в кодировке base64url, а результат возвращается в необработанном виде. В случае ошибки при разборе токена, проверке подписи или расшифровке содержимого будет возвращена пустая строка.

Пример:

# Get a JWT from the authorization header, put its decrypted content in an
# HTTP header
http-request set-var(txn.bearer) http_auth_bearer
http-request set-header X-Decrypted %[var(txn.bearer),jwt_decrypt_cert("/foo/bar.pem")]

jwt_decrypt_jwk(<jwk>)

jwt_decrypt_jwk(<jwk>)

Проверяет подпись переданного на вход JSON Web Token в формате JSON Web Encryption (см. RFC 7516) и возвращает его содержимое, расшифрованное предоставленным JSON Web Key (RFC7517). Параметр <jwk> должен быть корректным JWK типа ‘oct’, ‘EC’ или ‘RSA’, указанного полем ‘kty’ ключа JSON. Его можно передать строкой или через переменную.

На данный момент поддерживаются только токены, использующие формат компактной сериализации (пять строк base64-url, разделённых точками).

Этот преобразователь можно использовать для декодирования токенов с одним из следующих симметричных алгоритмов в поле “alg” заголовка JOSE: A128KW, A192KW, A256KW, A128GCMKW, A192GCMKW, A256GCMKW, dir. В этом случае ожидается JWK типа ‘oct’.

Преобразователь также поддерживает токены с алгоритмом семейства RSA (RSA-OAEP или RSA-OAEP-256) в поле “alg” заголовка JOSE при передаче JWK типа ‘RSA’, либо семейства ECDH (ECDH-ES, ECDH-ES+A128KW, ECDH-ES+A192KW или ECDH-ES+A256KW) при передаче JWK типа ‘EC’. Алгоритм RSA1_5 реализован, но по умолчанию отключён согласно рекомендации раздела 3.2 RFC 8725. При необходимости его можно снова включить глобальным параметром ‘jwt.decrypt_alg_list’.

Обратите внимание, что алгоритмы A128KW и A192KW недоступны на AWS-LC, поэтому алгоритмы A128KW, A192KW, ECDH-ES+A128KW и ECDH-ES+A192KW не будут работать.

Поддерживаемые алгоритмы и алгоритмы шифрования, задаваемые соответственно полями “alg” и “enc” заголовка JOSE, можно изменить глобальными параметрами ‘jwt.decrypt_alg_list’ и ‘jwt.decrypt_enc_list’.

Токен JWE должен быть предоставлен в кодировке base64url, а результат возвращается в необработанном виде. В случае ошибки при разборе токена, проверке подписи или расшифровке содержимого будет возвращена пустая строка.

Из-за особенностей обработки кавычек, запятых и двойных кавычек в конфигурации содержимое JWK необходимо правильно экранировать для корректной работы преобразователя. Подробности см. в разделе 2.2 .

Пример:

 # Get a JWT from the authorization header, put its decrypted content in an
 # HTTP header
 http-request set-var(txn.bearer) http_auth_bearer
 http-request set-header X-Decrypted %[var(txn.bearer),jwt_decrypt_jwk(\'{\"kty\":\"oct\",\"k\":\"wAsgsg\"}\')

# or via a variable
 http-request set-var(txn.bearer) http_auth_bearer
 http-request set-var(txn.jwk) str(\'{\"kty\":\"oct\",\"k\":\"Q-NFLlghQ\"}\')
 http-request set-header X-Decrypted %[var(txn.bearer),jwt_decrypt_jwk(txn.jwk)

jwt_decrypt_secret(<secret>)

jwt_decrypt_secret(<secret>)

Выполняет проверку подписи веб-токена JSON в формате JSON Web Encryption (см. RFC 7516) на входе и возвращает его содержимое, расшифрованное с помощью предоставленного секрета, закодированного в base64. Секрет может быть указан как строка или через переменную. На данный момент поддерживаются только токены, использующие формат компактной сериализации (пять строк base64-url, разделённых точками).

Этот преобразователь можно использовать для токенов, алгоритм (“alg” поле заголовка JOSE) которых входит в следующий список: A128KW, A192KW, A256KW, A128GCMKW, A192GCMKW, A256GCMKW, dir. Обратите внимание, что алгоритмы A128KW и A192KW недоступны на AWS-LC, и расшифровка не будет работать.

Токен JWE должен быть предоставлен в кодировке base64url, а результат возвращается в необработанном виде. В случае ошибки при разборе токена, проверке подписи или расшифровке содержимого будет возвращена пустая строка.

Пример:

# Get a JWT from the authorization header, put its decrypted content in an
# HTTP header
http-request set-var(txn.bearer) http_auth_bearer
http-request set-header X-Decrypted %[var(txn.bearer),jwt_decrypt_secret("GawgguFyGrWKav7AX4VKUg")]

jwt_header_query([<json_path>[,<output_type>]])

jwt_header_query([<json_path>[,<output_type>]])

При получении на вход JSON Web Token (JWT) возвращает декодированный заголовок токена, то есть первую часть JWT в кодировке base64-url, если параметр не задан; иначе выполняет json_query для декодированного заголовка. Подробности о допустимых параметрах json_path и output_type см. в описании преобразователя “json_query”. Этот преобразователь можно использовать с токенами JWS и JWE в формате компактной сериализации.

Обратите внимание: этот преобразователь доступен только в том случае, если HAProxy собран с USE_OPENSSL.

jwt_payload_query([<json_path>[,<output_type>]])

jwt_payload_query([<json_path>[,<output_type>]])

При получении на вход JSON Web Token (JWT) в формате JSON Web Signed (JWS) возвращает декодированную полезную нагрузку токена, то есть вторую часть JWT в кодировке base64-url, если параметр не задан; иначе выполняет json_query для декодированной полезной нагрузки. Подробности о допустимых параметрах json_path и output_type см. в описании преобразователя “json_query”.

Обратите внимание: этот преобразователь доступен только в том случае, если HAProxy собран с USE_OPENSSL.

jwt_verify(<alg>,<key>)

Выполняет проверку подписи веб-токена JSON (JWT) на входе с использованием алгоритма <alg> и параметра <key>. На данный момент обрабатываются только токены JWS в формате компактной сериализации (три строки base64-url, разделённые точками). Этот преобразователь проверяет только подпись токена и не выполняет полную проверку JWT, как указано в разделе 7.2 документа RFC7519. Например, не проверяется, являются ли заголовок и полезная нагрузка после декодирования полностью корректными данными JSON; их содержимое также не проверяется.

  • <alg> может быть строкой или именем переменной (см. также “set-var”), содержащей имя алгоритма, используемого для проверки.

    Поддерживаются алгоритмы, перечисленные в разделе 3.1 RFC7518:

   +--------------+---------------------------------------------------------+
   | Значение     | Алгоритм цифровой подписи или MAC                       |
   | парам. "alg" |                                                         |
   +--------------+---------------------------------------------------------+
   | HS256        | HMAC с SHA-256                                          |
   | HS384        | HMAC с SHA-384                                          |
   | HS512        | HMAC с SHA-512                                          |
   | RS256        | RSASSA-PKCS1-v1_5 с SHA-256                             |
   | RS384        | RSASSA-PKCS1-v1_5 с SHA-384                             |
   | RS512        | RSASSA-PKCS1-v1_5 с SHA-512                             |
   | ES256        | ECDSA с P-256 и SHA-256                                 |
   | ES384        | ECDSA с P-384 и SHA-384                                 |
   | ES512        | ECDSA с P-521 и SHA-512                                 |
   | PS256        | RSASSA-PSS с SHA-256 и MGF1 с SHA-256                   |
   | PS384        | RSASSA-PSS с SHA-384 и MGF1 с SHA-384                   |
   | PS512        | RSASSA-PSS с SHA-512 и MGF1 с SHA-512                   |
   | none         | Цифровая подпись и MAC не выполняются (см. примечание ниже) |
   +--------------+---------------------------------------------------------+

Алгоритм “none” по умолчанию не разрешён согласно рекомендациям RFC8725 раздел 3.2 . Чтобы явно разрешить его, задайте глобальную опцию ‘jwt.allow_none_alg’.

  • <key> может быть строкой или именем переменной (см. также “set-var”), содержащей секрет или путь к открытому ключу.

    Секреты применимы только при использовании алгоритмов HMAC.

    Открытые ключи должны быть в формате PKCS#1 для ключей RSA, начинающемся с BEGIN RSA PUBLIC KEY, либо в формате SPKI (Subject Public Key Info), начинающемся с BEGIN PUBLIC KEY. Открытые ключи должны быть доступны при разборе конфигурации; их нельзя обновлять или загружать во время работы. Для проверки токенов JWT по полноценным сертификатам PEM см. преобразователь “jwt_verify_cert”.

    Все открытые ключи, которые могут использоваться для проверки JWT, должны быть известны при инициализации. Тогда они будут добавлены в специальный кэш, и во время работы доступ к диску не потребуется.

Возвращает 1 при успешной проверке, 0 при неуспешной проверке и строго отрицательное значение при любой другой ошибке. Из-за этих ненулевых кодов ошибок результат преобразователя никогда не следует преобразовывать в логическое значение. Полный список возможных возвращаемых значений приведён ниже.

Возможные возвращаемые значения следующие:

  +----+----------------------------------------------------------------------+
  | ID | сообщение                                                            |
  +----+----------------------------------------------------------------------+
  |  1 | "Verification success"                                               |
  |  0 | "Verification failure"                                               |
  | -1 | "Unknown algorithm (not mentioned in RFC7518)"                       |
  | -2 | "Unmanaged algorithm"                                                |
  | -3 | "Invalid token"                                                      |
  | -4 | "Out of memory"                                                      |
  | -5 | "Unknown pubkey/certificate"                                         |
  | -6 | "Internal error"                                                     |
  +----+----------------------------------------------------------------------+

Обратите внимание: этот преобразователь доступен только в том случае, если HAProxy собран с USE_OPENSSL.

Пример:

# Get a JWT from the authorization header, extract the "alg" field of its
# JOSE header and use a public key to verify a signature
http-request set-var(txn.bearer) http_auth_bearer
http-request set-var(txn.jwt_alg) var(txn.bearer),jwt_header_query('$.alg')
http-request deny unless { var(txn.jwt_alg) -m str "RS256" }
http-request deny unless { var(txn.bearer),jwt_verify(txn.jwt_alg,"/path/to/pubkey.pem") 1 }

jwt_verify_cert(<alg>,<cert>)

Выполняет проверку подписи веб-токена JSON (JWT) на входе с использованием алгоритма <alg> и параметра <cert>. На данный момент обрабатываются только токены JWS в формате компактной сериализации (три строки base64-url, разделённые точками). Этот преобразователь проверяет только подпись токена и не выполняет полную проверку JWT, как указано в разделе 7.2 документа RFC7519. Например, не проверяется, являются ли заголовок и полезная нагрузка после декодирования полностью корректными данными JSON; их содержимое также не проверяется.

  • <alg> может быть строкой или именем переменной (см. также “set-var”), содержащей имя алгоритма, используемого для проверки. В отличие от преобразователя “jwt_verify”, этот преобразователь ожидает только сертификат в качестве второго параметра, поэтому его не следует использовать для токенов, использующих алгоритмы HMAC.

    Поддерживаются алгоритмы, перечисленные в разделе 3.1 RFC7518, кроме HMAC:

   +--------------+---------------------------------------------------------+
   | Значение     | Алгоритм цифровой подписи или MAC                       |
   | парам. "alg" |                                                         |
   +--------------+---------------------------------------------------------+
   | RS256        | RSASSA-PKCS1-v1_5 с SHA-256                             |
   | RS384        | RSASSA-PKCS1-v1_5 с SHA-384                             |
   | RS512        | RSASSA-PKCS1-v1_5 с SHA-512                             |
   | ES256        | ECDSA с P-256 и SHA-256                                 |
   | ES384        | ECDSA с P-384 и SHA-384                                 |
   | ES512        | ECDSA с P-521 и SHA-512                                 |
   | PS256        | RSASSA-PSS с SHA-256 и MGF1 с SHA-256                   |
   | PS384        | RSASSA-PSS с SHA-384 и MGF1 с SHA-384                   |
   | PS512        | RSASSA-PSS с SHA-512 и MGF1 с SHA-512                   |
   | none         | Цифровая подпись и MAC не выполняются                   |
   +--------------+---------------------------------------------------------+
  • <key> может быть строкой или именем переменной (см. также “set-var”), содержащей путь к сертификату.

    Сертификаты должны быть стандартными сертификатами PEM, начинающимися с BEGIN CERTIFICATE. Их путь можно передать преобразователю напрямую или через переменную. При использовании переменной соответствующие сертификаты можно объявить в crt-store либо динамически загрузить через сокет статистики. Если путь задан напрямую и соответствующий сертификат ещё не загружен во внутреннее хранилище сертификатов, он будет загружен при разборе конфигурации. Поэтому он уже должен существовать, иначе возникнет ошибка.

    Можно использовать только те сертификаты, которые явно определены как пригодные для проверки JWT. См. опцию “jwt” crt-store.

    Сертификаты можно динамически обновлять и добавлять через сокет статистики. См. также “set ssl cert” и “new ssl cert” в руководстве по управлению.

Возвращает 1 при успешной проверке, 0 при неуспешной проверке и строго отрицательное значение при любой другой ошибке. Из-за этих ненулевых кодов ошибок результат преобразователя никогда не следует преобразовывать в логическое значение. Полный список возможных возвращаемых значений приведён ниже.

Возможные возвращаемые значения следующие:

  +----+----------------------------------------------------------------------+
  | ID | сообщение                                                            |
  +----+----------------------------------------------------------------------+
  |  1 | "Verification success"                                               |
  |  0 | "Verification failure"                                               |
  | -1 | "Unknown algorithm (not mentioned in RFC7518)"                       |
  | -2 | "Unmanaged algorithm"                                                |
  | -3 | "Invalid token"                                                      |
  | -4 | "Out of memory"                                                      |
  | -5 | "Unknown pubkey/certificate"                                         |
  | -6 | "Internal error"                                                     |
  | -7 | "Unavailable certificate" (see "jwt")                                |
  +----+----------------------------------------------------------------------+

Обратите внимание: этот преобразователь доступен только в том случае, если HAProxy собран с USE_OPENSSL.

Пример:

# Get a JWT from the authorization header, extract the "alg" field of its
# JOSE header and use a public certificate to verify a signature
http-request set-var(txn.bearer) http_auth_bearer
http-request set-var(txn.jwt_alg) var(txn.bearer),jwt_header_query('$.alg')
http-request deny unless { var(txn.jwt_alg) -m str "RS256" }
http-request deny unless { var(txn.bearer),jwt_verify_cert(txn.jwt_alg,"/path/to/cert.pem") 1 }

language(<value>[,<default>])

language(<value>[,<default>])

Возвращает значение с наибольшим коэффициентом q из списка, извлечённого из заголовка “accept-language” с помощью “req.fhdr”. Значения без коэффициента q имеют коэффициент q равный 1. Значения с коэффициентом q 0 отбрасываются. Учитываются только значения, входящие в список, разделённый точкой с запятой <values>. Синтаксис аргумента <value> — “lang[;lang[;lang[;…]]]”. Если ни одно значение не соответствует заданному списку и указано значение по умолчанию, оно возвращается. Обратите внимание, что имена языков могут содержать вариант после дефиса (’-’). Если такой вариант присутствует в списке, он будет сопоставлен, но если его нет — проверяется только базовый язык. Сопоставление чувствительно к регистру, а выходная строка всегда является одной из указанных в аргументах. Порядок аргументов не имеет значения, важен только порядок значений в запросе, поскольку при одинаковом коэффициенте q используется первое значение среди совпадающих.

Пример:

# this configuration switches to the backend matching a
# given language based on the request:

acl es req.fhdr(accept-language),language(es;fr;en) -m str es
acl fr req.fhdr(accept-language),language(es;fr;en) -m str fr
acl en req.fhdr(accept-language),language(es;fr;en) -m str en
use_backend spanish if es
use_backend french  if fr
use_backend english if en
default_backend choose_your_language

length

length

Возвращает длину строки. Этот преобразователь можно размещать только после функции извлечения строкового образца или после ключевого слова преобразования, возвращающего строку. Результат имеет целочисленный тип.

lower

lower

Приводит строковый образец к нижнему регистру. Этот преобразователь можно размещать только после функции извлечения строкового образца или после ключевого слова преобразования, возвращающего строку. Результат имеет строковый тип.

ltime(<format>[,<offset>])

ltime(<format>[,<offset>])

Преобразует целое число, рассматриваемое как дата от начала эпохи, в строку с этой датой в местном времени по формату <format> с помощью strftime(3). Это позволяет использовать в журналах любой формат даты. К входной дате можно применить необязательное положительное или отрицательное смещение <offset> в секундах. Поддерживаемый операционной системой формат описан на странице руководства strftime(). См. также преобразователь utime.

Пример:

# Emit two colons, one with the local time and another with ip:port
# e.g.  20140710162350 127.0.0.1:57325
log-format %[date,ltime(%Y%m%d%H%M%S)]\ %ci:%cp

ltrim(<chars>)

ltrim(<chars>)

Пропускает любые символы из <chars> в начале строкового представления входного образца.

map(<map_name>[,<default_value>])

map(<map_name>[,<default_value>])
map_<match_type>(<map_name>[,<default_value>])
map_<match_type>_<output_type>(<map_name>[,<default_value>])

Ищет входное значение в <map_name> с использованием метода сопоставления <match_type> и возвращает соответствующее значение, преобразованное к типу <output_type>. Если входное значение не найдено в <map_name>, преобразователь возвращает <default_value>. Если <default_value> не установлен, преобразователь завершается с ошибкой, как будто входное значение не было получено. Если <match_type> не установлен, он по умолчанию принимает значение “str”. Аналогично, если <output_type> не установлен, он по умолчанию принимает значение “str”. Для удобства ключевое слово “map” является псевдонимом для “map_str” и сопоставляет одной строке другую строку. <map_name> должен соответствовать формату, описанному в 2.7 относительно формата имён для таблиц соответствий и ACL.

Важно избегать пересечений между ключами: IP-адреса и строки хранятся в деревьях, поэтому используется первое совпадение с наибольшей точностью. Другие ключи хранятся в списках, поэтому используется первое совпадающее вхождение.

В следующей таблице перечислены все доступные функции таблиц соответствий с сортировкой по типу входных данных, методу сопоставления и типу результата.

 Входной тип | Метод сравн. | Тип выхода str  | Тип выхода int  | Тип выхода ip  | Тип выхода key
  -----------+--------------+-----------------+-----------------+----------------+----------------
    str      | str          | map_str         | map_str_int     | map_str_ip     | map_str_key
  -----------+--------------+-----------------+-----------------+----------------+----------------
    str      | beg          | map_beg         | map_beg_int     | map_beg_ip     | map_beg_key
  -----------+--------------+-----------------+-----------------+----------------+----------------
    str      | sub          | map_sub         | map_sub_int     | map_sub_ip     | map_sub_key
  -----------+--------------+-----------------+-----------------+----------------+----------------
    str      | dir          | map_dir         | map_dir_int     | map_dir_ip     | map_dir_key
  -----------+--------------+-----------------+-----------------+----------------+----------------
    str      | dom          | map_dom         | map_dom_int     | map_dom_ip     | map_dom_key
  -----------+--------------+-----------------+-----------------+----------------+----------------
    str      | end          | map_end         | map_end_int     | map_end_ip     | map_end_key
  -----------+--------------+-----------------+-----------------+----------------+----------------
    str      | reg          | map_reg         | map_reg_int     | map_reg_ip     | map_reg_key
  -----------+--------------+-----------------+-----------------+----------------+----------------
    str      | reg          | map_regm        | map_reg_int     | map_reg_ip     | map_reg_key
  -----------+--------------+-----------------+-----------------+----------------+----------------
    int      | int          | map_int         | map_int_int     | map_int_ip     | map_int_key
  -----------+--------------+-----------------+-----------------+----------------+----------------
    ip       | ip           | map_ip          | map_ip_int      | map_ip_ip      | map_ip_key
  -----------+--------------+-----------------+-----------------+----------------+----------------

Преобразователь “map_regm” ожидает группы захвата в регулярном выражении и изменяет результат, заменяя обратные ссылки, например “\1”, соответствующим совпавшим текстом.

Тип вывода “key” означает, что будет возвращён ключ найденного элемента (как он указан в файле таблицы соответствий) в виде строки вместо значения. Обратите внимание, что не поддерживается необязательный аргумент <default_value> при использовании типа вывода “key”.

Файлы, указанные в <map_name>, содержат по одной паре ключ + значение в строке. Строки, начинающиеся с ‘#’, игнорируются, как и пустые строки. Начальные табуляции и пробелы удаляются. Ключ — первое «слово», то есть последовательность символов без пробелов и табуляций. Значение — всё после следующей за ключом последовательности пробелов и табуляций до конца строки, без завершающих пробелов и табуляций.

Пример:

     # this is a comment and is ignored
        2.22.246.0/23    United Kingdom      \n
     <-><-----------><--><------------><---->
      |       |       |         |        `- конечные пробелы игнорируются
      |       |       |         `---------- значение
      |       |       `-------------------- пробелы в середине игнорируются
      |       `---------------------------- ключ
      `------------------------------------ начальные пробелы игнорируются

mod(<value>)

mod(<value>)

Делит входное целое число со знаком на <value> и возвращает остаток как целое число со знаком. Если <value> равен нулю, возвращается ноль. <value> может быть числом или именем переменной. Подробности о переменных см. в разделе 2.8 .

mqtt_field_value(<packettype>,<fieldname_or_property_ID>)

mqtt_field_value(<packettype>,<fieldname_or_property_ID>)

Возвращает значение <fieldname>, найденное во входной полезной нагрузке MQTT типа <packettype>. <packettype> может быть строкой (сопоставление без учёта регистра) или числовым значением, соответствующим типу пакета, из которого необходимо извлечь данные. Поддерживаемые строки и целые числа можно найти здесь: https://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html#_Toc398718021 https://docs.oasis-open.org/mqtt/mqtt/v5.0/os/mqtt-v5.0-os.html#_Toc3901022

<fieldname> зависит от <packettype> и может быть любым из перечисленных ниже. (Обратите внимание, что сопоставление <fieldname> не чувствительно к регистру). <property id> может быть найден только в потоках MQTT v5.0. Проверьте эту таблицу: https://docs.oasis-open.org/mqtt/mqtt/v5.0/os/mqtt-v5.0-os.html#_Toc3901029

  • CONNECT (или 1): flags, protocol_name, protocol_version, client_identifier, will_topic, will_payload, username, password, keepalive ИЛИ любой идентификатор свойства в виде числа (только для пакетов MQTT v5.0):
17: Session Expiry Interval
33: Receive Maximum
39: Maximum Packet Size
34: Topic Alias Maximum
25: Request Response Information
23: Request Problem Information
21: Authentication Method
22: Authentication Data
18: Will Delay Interval
 1: Payload Format Indicator
 2: Message Expiry Interval
 3: Content Type
 8: Response Topic
 9: Correlation Data

Ещё не поддерживается:

38: User Property
  • CONNACK (или 2): flags, protocol_version, reason_code ИЛИ любой идентификатор свойства в виде числа (только для пакетов MQTT v5.0):
17: Session Expiry Interval
33: Receive Maximum
36: Maximum QoS
37: Retain Available
39: Maximum Packet Size
18: Assigned Client Identifier
34: Topic Alias Maximum
31: Reason String
40; Wildcard Subscription Available
41: Subscription Identifiers Available
42: Shared Subscription Available
19: Server Keep Alive
26: Response Information
28: Server Reference
21: Authentication Method
22: Authentication Data

Ещё не поддерживается:

38: User Property

Из-за текущей архитектуры HAProxy можно разобрать только первый пакет, отправленный клиентом, и первый ответ, отправленный сервером. Следовательно, этот преобразователь может извлекать данные только из типов пакетов CONNECT и CONNACK. CONNECT — это первый пакет, отправленный клиентом, а CONNACK — первый ответ, отправленный сервером.

Пример:

acl data_in_buffer req.len ge 4
tcp-request content set-var(txn.username) \
        req.payload(0,0),mqtt_field_value(connect,protocol_name) \
        if data_in_buffer
# do the same as above
tcp-request content set-var(txn.username) \
        req.payload(0,0),mqtt_field_value(1,protocol_name) \
        if data_in_buffer

mqtt_is_valid

mqtt_is_valid

Проверяет, представляют ли двоичные входные данные корректный пакет MQTT. Возвращает логическое значение.

Из-за текущей архитектуры HAProxy можно разобрать только первый пакет, отправленный клиентом, и первый ответ, отправленный сервером. Следовательно, этот преобразователь может извлекать данные только из типов пакетов CONNECT и CONNACK. CONNECT — это первый пакет, отправленный клиентом, а CONNACK — первый ответ, отправленный сервером.

Поддерживаются только MQTT 3.1, 3.1.1 и 5.0.

Пример:

acl data_in_buffer req.len ge 4
tcp-request content reject unless { req.payload(0,0),mqtt_is_valid }

ms_ltime(<format>[,<offset>])

ms_ltime(<format>[,<offset>])

Работает как “ltime”, но принимает входное значение в миллисекундах. Также поддерживает спецификатор преобразования %N по образцу date(1). Преобразует целое число, рассматриваемое как дата от начала эпохи, в строку с этой датой в местном времени по формату <format> с помощью strftime(3). Это позволяет использовать в журналах любой формат даты. К входной дате можно применить необязательное положительное или отрицательное смещение <offset> в миллисекундах. Поддерживаемый операционной системой формат описан на странице руководства strftime().

Спецификатор преобразования %N позволяет вывести часть даты в наносекундах, точность ограничена, поскольку входные данные задаются в миллисекундах. (000000000..999000000). %N может принимать аргумент ширины между % и N. Полезно для отображения миллисекунд (%3N) или микросекунд (%6N). Ширина по умолчанию и максимальная — 9 (%N = %9N).

См. также преобразователь utime для UTC, а также преобразователи “ltime” и “us_ltime”.

Пример:

# Emit 3 colons, the local time, the timezone and another with ip:port
# e.g. 2023/07/24/11:53:02.196 +0200 127.0.0.1:41530
log-format %[accept_date(ms),ms_ltime("%Y/%m/%d/%H:%M:%S.%3N %z")]\ %ci:%cp

ms_utime(<format>[,<offset>])

ms_utime(<format>[,<offset>])

Работает как “utime”, но принимает входное значение в миллисекундах. Также поддерживает спецификатор преобразования %N по образцу date(1). Преобразует целое число, рассматриваемое как дата от начала эпохи, в строку с этой датой в UTC по формату <format> с помощью strftime(3). Это позволяет использовать в журналах любой формат даты. К входной дате можно применить необязательное положительное или отрицательное смещение <offset> в миллисекундах. Поддерживаемый операционной системой формат описан на странице руководства strftime().

Спецификатор преобразования %N позволяет вывести часть даты в наносекундах, точность ограничена, поскольку входные данные задаются в миллисекундах. (000000000..999000000). %N может принимать аргумент ширины между % и N. Полезно для отображения миллисекунд (%3N) или микросекунд (%6N). Ширина по умолчанию и максимальная — 9 (%N = %9N).

См. также преобразователь ltime для локального времени, а также преобразователи “utime” и “us_utime”.

Пример:

# Emit 3 colons, the UTC time, the timezone and another with ip:port
# e.g. 2023/07/24/09:53:02.196 +0000 127.0.0.1:41530
log-format %[accept_date(ms),ms_utime("%Y/%m/%d/%H:%M:%S.%3N %z")]\ %ci:%cp

mul(<value>)

mul(<value>)

Умножает входное целое число со знаком на <value> и возвращает произведение как целое число со знаком. При переполнении возвращается предельное значение для соответствующего знака, чтобы избежать циклического перехода при переполнении. <value> может быть числом или именем переменной. Подробности о переменных см. в разделе 2.8 .

nbsrv

nbsrv

Принимает на вход строку, трактует её как имя бэкенда и возвращает число пригодных к использованию серверов в этом бэкенде. Может использоваться там, где требуется найти бэкенд по динамическому имени, например по результату поиска в таблице соответствий.

neg

neg

Принимает входное целое число со знаком, вычисляет противоположное значение и возвращает остаток как целое число со знаком. 0 не изменяется. Оператор предназначен для обратного вычитания: чтобы вычесть входное значение из константы, достаточно выполнить “neg,add(value)”.

not

not

Возвращает логическое FALSE, если входное целое число со знаком ненулевое; иначе возвращает TRUE. Совместно с and() позволяет получить true/false при проверке битов входного значения, например при проверке отсутствия флага.

odd

odd

Возвращает логическое TRUE, если входное целое число со знаком нечётное; иначе возвращает FALSE. Функционально эквивалентен “and(1),bool”.

or(<value>)

or(<value>)

Выполняет побитовое “OR” между <value> и входным целым числом со знаком и возвращает результат как целое число со знаком. <value> может быть числом или именем переменной. Подробности о переменных см. в разделе 2.8 .

param(<name>[,<delim>])

param(<name>[,<delim>])

Извлекает первое вхождение параметра <name> из входной строки, в которой параметры разделены символом <delim> (по умолчанию “&”), а имя и значение параметра — знаком “=”. Если до конца сегмента параметра отсутствуют знак “=” и значение, это считается эквивалентным значению в виде пустой строки.

Это может быть полезно для извлечения параметров из строки запроса или тела в формате x-www-form-urlencoded. В частности, query,param(<name>) можно использовать как альтернативу urlp(<name>): первое выражение использует только “&” как разделитель, тогда как “urlp” также использует “?” и “;”.

Обратите внимание, что этот преобразователь не выполняет специальных действий с закодированными символами URL. Если требуется декодировать значение, можно применить преобразователь url_dec к выходным данным. Если имя параметра во входных данных может содержать закодированные символы, вероятно, стоит нормализовать входные данные перед вызовом “param”. Это можно сделать с помощью “http-request normalize-uri”, в частности, опций percent-decode-unreserved и percent-to-uppercase.

Пример:

str(a=b&c=d&a=r),param(a)   # b
str(a&b=c),param(a)         # ""
str(a=&b&c=a),param(b)      # ""
str(a=1;b=2;c=4),param(b,;) # 2
query,param(redirect_uri),urldec()

port_only

port_only

Преобразует строку со значением заголовка Host в целое число, возвращая указанный в ней порт. Входные данные должны соответствовать формату значения заголовка Host (rfc9110#section-7.2). Поддерживаются следующие варианты: hostname, hostname:80, 127.0.0.1, 127.0.0.1:80, [::1], [::1]:80.

Если во входных данных не указан порт, возвращает 0.

См. также: преобразователь “host_only”, который вернёт хост.

protobuf(<field_number>[,<field_type>])

protobuf(<field_number>[,<field_type>])

Извлекает поле сообщения protocol buffers из входного двоичного образца, представляющего такое сообщение. Номер поля задаётся аргументом <field_number> (в нотации с точками). Если <field_type> отсутствует, поле извлекается в необработанном виде; если указан — в виде целочисленного образца (см. также “ungrpc” ниже). Допустимы следующие типы: “int32”, “int64”, “uint32”, “uint64”, “sint32”, “sint64”, “bool”, “enum” для типа кодирования “varint” 0; “fixed64”, “sfixed64”, “double” для 64-битного типа кодирования 1; “fixed32”, “sfixed32”, “float” для типа кодирования 5. Тип “string” считается типом с явно заданной длиной, поэтому для его извлечения аргумент <field_type> не требуется. Дополнительные сведения о типах полей сообщений protocol buffers: https://developers.google.com/protocol-buffers/docs/encoding

regsub(<regex>,<subst>[,<flags>])

regsub(<regex>,<subst>[,<flags>])

Применяет замену на основе регулярного выражения к входной строке. Выполняет ту же операцию, что и известный инструмент “sed” с “s/<regex>/<subst>/”. По умолчанию заменяет во входной строке первое вхождение наибольшего фрагмента, соответствующего регулярному выражению <regex>, на строку замены <subst>. Возможна замена всех вхождений вместо одного, если добавить флаг “g” в третий аргумент <flags>. Также возможно сделать регулярное выражение нечувствительным к регистру, добавив флаг “i” в <flags>. Поскольку <flags> — это строка, она состоит из конкатенации всех желаемых флагов. Таким образом, если нужны и “i”, и “g”, использование “gi” или “ig” даст одинаковый результат. Первое применение этого преобразователя — замена определённых символов или последовательностей на другие.

Настоятельно рекомендуется заключать регулярное выражение в защищённые кавычки, чтобы улучшить читаемость и не спутать его закрывающую скобку со скобкой функции. Как и в оболочке Bourne, первый уровень кавычек обрабатывается при выделении групп слов в строке, а второй можно использовать для аргументов. Рекомендуется использовать одинарные кавычки снаружи, поскольку они не интерпретируют обратные косые черты и знаки доллара.

Примеры:

# de-duplicate "/" in header "x-path".
# input:  x-path: /////a///b/c/xzxyz/
# output: x-path: /a/b/c/xzxyz/
http-request set-header x-path "%[hdr(x-path),regsub('/+','/','g')]"

# copy query string to x-query and drop all leading '?', ';' and '&'
http-request set-header x-query "%[query,regsub([?;&]*,'')]"

# capture groups and backreferences
# both lines do the same.
http-request redirect location %[url,'regsub("(foo|bar)([0-9]+)?","\2\1",i)']
http-request redirect location %[url,regsub(\"(foo|bar)([0-9]+)?\",\"\2\1\",i)]

reverse

reverse

Переворачивает входную строку байт за байтом.

Этот преобразователь не зависит от кодировки и переворачивает байты, а не символы; он не подходит для переворота текста, закодированного в UTF-8.

Это превращает поиск по суффиксу исходной строки в поиск по префиксу перевёрнутой строки и позволяет использовать в больших таблицах соответствий индексированные методы сопоставления по префиксу, такие как “map_beg”.

Примеры:

"example.com" -> "moc.elpmaxe"
"ab cd" -> "dc ba"

# Given a map file where each key contains a reversed hostname:
#   moc.elpmaxe.ppa app1
#   moc.elpmaxe.bd  dbcluster
# Pick a backend based on the domain suffix of the Host header:
use_backend %[req.hdr(host),lower,reverse,map_beg(/etc/haproxy/hosts.map,default)]

reverse_dom

reverse_dom

Преобразует строку с именем хоста в формате, напоминающем FQDN в представление с обратным порядком меток. Одна конечная точка во входной строке игнорируется. Пустые метки приводят к неудаче преобразования.

Этот преобразователь не приводит входные данные к нижнему регистру и не удаляет порт. Он предназначен для использования в сочетании с существующими преобразователями, такими как “lower” или “host_only”, при необходимости.

Обработка точки в конце намеренно оставлена на усмотрение вызывающей стороны. Это позволяет ей решать, следует ли сопоставлять также корневой домен или только поддомены.

Форма с обратным порядком меток удобна для больших таблиц соответствий доменов: поиск по суффиксу домена превращается в поиск по префиксу, что позволяет использовать индексированные методы сопоставления по префиксу, такие как “map_beg”.

Примеры:

"example.com" -> "com.example"
"mail.example.com" -> "com.example.mail"
"example.com." -> "com.example"

# match only subdomains of example.net, not the apex
acl example_net_sub req.hdr(Host),host_only,reverse_dom -m beg net.example.

# match only the apex
acl example_net_apex req.hdr(Host),host_only,reverse_dom -i net.example

# exact-or-subdomain prefix lookup using an explicit dotted form
http-request set-var(txn.rev_host) req.hdr(Host),host_only,reverse_dom,concat(.)
use_backend %[var(txn.rev_host),map_beg(/etc/haproxy/domains.map)]

rfc7239_field(<field>)

rfc7239_field(<field>)

Извлекает одно поле/параметр из входного значения заголовка, соответствующего формату RFC 7239.

Поддерживаемые поля: - proto: ‘http’ или ‘https’ - host: узел в формате HTTP - for: узел RFC7239 - by: узел RFC7239

Дополнительная информация здесь:

https://www.rfc-editor.org/rfc/rfc7239.html#section-6

Пример:

# extract host field from forwarded header and store it in req.fhost var
http-request set-var(req.fhost) req.hdr(forwarded),rfc7239_field(host)
#input: "proto=https;host=\"haproxy.org:80\""
#  output: "haproxy.org:80"

# extract for field from forwarded header and store it in req.ffor var
http-request set-var(req.ffor) req.hdr(forwarded),rfc7239_field(for)
#input: "proto=https;host=\"haproxy.org:80\";for=\"127.0.0.1:9999\""
#  output: "127.0.0.1:9999"

rfc7239_is_valid

rfc7239_is_valid

Возвращает true, если входное значение заголовка соответствует RFC 7239, и false в противном случае.

Пример:

acl valid req.hdr(forwarded),rfc7239_is_valid
#input: "for=127.0.0.1;proto=http"
#  output: TRUE
#input: "proto=custom"
#  output: FALSE

rfc7239_n2nn

rfc7239_n2nn

Преобразует узел RFC7239, полученный из полей заголовка ‘for’ или ‘by’ 7239, в соответствующее конечное представление nodename: - адрес ipv4 - адрес ipv6 - ‘unknown’ - идентификатор ‘_obfs’

Пример:

# extract 'for' field from forwarded header, extract nodename from
# resulting node identifier and store the result in req.fnn
http-request set-var(req.fnn) req.hdr(forwarded),rfc7239_field(for),rfc7239_n2nn
#input: "127.0.0.1:9999"
#  output: 127.0.0.1 (ipv4)
#input: "[ab:cd:ff:ff:ff:ff:ff:ff]:9998"
#  output: ab:cd:ff:ff:ff:ff:ff:ff (ipv6)
#input: "_name:_port"
#  output: "_name" (string)

rfc7239_n2np

rfc7239_n2np

Преобразует узел RFC7239, полученный из полей заголовка ‘for’ или ‘by’ 7239, в соответствующее конечное представление nodeport: - беззнаковое целое число - идентификатор ‘_obfs’

Пример:

# extract 'by' field from forwarded header, extract node port from
# resulting node identifier and store the result in req.fnp
http-request set-var(req.fnp) req.hdr(forwarded),rfc7239_field(by),rfc7239_n2np
#input: "127.0.0.1:9999"
#  output: 9999 (integer)
#input: "[ab:cd:ff:ff:ff:ff:ff:ff]:9998"
#  output: 9998 (integer)
#input: "_name:_port"
#  output: "_port" (string)

rfc7239_nn

rfc7239_nn

Преобразует переданный адрес или строку в имя узла, соответствующее RFC7239. Можно использовать для ручного формирования полей заголовка ‘for’ или ‘by’ 7239.

Если входные данные — строка, она автоматически будет предварена символом ‘_’ для представления обфусцированного идентификатора. Строка должна соответствовать набору символов RFC7239. Если строка пустая, она преобразуется в идентификатор “unknown”.

Пример:

#input: ipv6(ab:cd:ff:ff:ff:ff:ff:ff)
#  output: "[ab:cd:ff:ff:ff:ff:ff:ff]"
#input: str(test)
#  output: "_test"
#input: str()
#  output: "unknown"

См. также: “rfc7239_np”

rfc7239_np

rfc7239_np

Преобразует переданное беззнаковое целое число или строку в порт узла, соответствующий RFC7239. Можно использовать для ручного формирования полей заголовка ‘for’ или ‘by’ 7239.

Если входные данные — строка, она автоматически будет предварена символом ‘_’ для представления обфусцированного идентификатора. Строка должна соответствовать набору символов RFC7239 и не может быть пустой.

Пример:

#input: int(12)
#  output: "12"
#input: str(test)
#  output: "_test"

# build 'for' forwarded header field
http-request set-var-fmt(txn.test) "for=\"%[ipv6(::1),rfc7239_nn]:%[int(8080),rfc7239_np]\";"
#  output: "for=\"[::1]:8080\";"

# build RFC-compliant 7239 header:
http-request set-var-fmt(txn.forwarded) "for=\"%[ipv6(::1),rfc7239_nn]:%[str(8888),rfc7239_np]\";host=\"haproxy.org\";proto=http"
# check RFC-compliancy:
http-request set-var(txn.test) "var(txn.forwarded),debug(test,stderr),rfc7239_is_valid,debug(test,stderr)"
#  stderr output:
#    [debug] test: type=str <for="[::1]:_8888";host="haproxy.org";proto=http>
#    [debug] test: type=bool <1>

См. также: “rfc7239_nn”

rtrim(<chars>)

rtrim(<chars>)

Пропускает любые символы из <chars> в конце строкового представления входного образца.

sdbm([<avalanche>])

sdbm([<avalanche>])

Хеширует входной двоичный образец в 32-битное беззнаковое значение с помощью хеш-функции SDBM. Если необязательный аргумент <avalanche> равен 1, к результату можно применить хеш-функцию с полным лавинным эффектом. Этот преобразователь использует те же функции, что и различные алгоритмы балансировки нагрузки на основе хеша, поэтому даёт точно такие же результаты. Он предназначен преимущественно для отладки, но может использоваться как запись таблицы привязок для сбора приблизительной статистики. Его нельзя использовать для обеспечения безопасности: 32-битный хеш легко взломать. См. также “crc32”, “djb2”, “wt6”, “crc32c” и директиву “hash-type”.

secure_memcmp(<var>)

secure_memcmp(<var>)

Сравнивает содержимое <var> с входным значением. Оба значения обрабатываются как двоичная строка. Возвращает логическое значение, указывающее на совпадение двух двоичных строк.

Если обе двоичные строки имеют одинаковую длину, сравнение будет выполнено за постоянное время.

Обратите внимание: этот преобразователь доступен только в том случае, если HAProxy собран с USE_OPENSSL.

Пример:

http-request set-var(txn.token) hdr(token)
# Check whether the token sent by the client matches the secret token
# value, without leaking the contents using a timing attack.
acl token_given str(my_secret_token),secure_memcmp(txn.token)

set-var(<var>[,<cond>...])

set-var(<var>[,<cond>...])

Присваивает переменной входное содержимое и возвращает его на выход без изменений, если все указанные условия истинны (список возможных условий приведён ниже). Переменная сохраняет значение и соответствующий входной тип. Подробнее о переменных см. в разделе 2.8 .

Преобразователю можно передать не более четырёх условий из следующего списка:

  • “ifexists”/“ifnotexists”:
Проверяет, существовала ли переменная до текущего вызова set-var.
Обычно переменная создаётся при успешном вызове set-var.
Обратите внимание: переменные с областью действия "proc" создаются при разборе
конфигурации, поэтому условие "ifexists" для них всегда будет истинным.
  • “ifempty”/“ifnotempty”:
Проверяет, пуст ли входной образец.
Скалярные типы никогда не бывают пустыми, поэтому условие ifempty для них
будет ложным независимо от содержимого образца (целые числа, логические значения, IP и т. д.).
  • “ifset”/“ifnotset”:
Проверяет, было ли ранее задано значение переменной или вызван unset-var
для этой переменной.
Переменная, которая ещё не существует, считается не имеющей заданного значения.
Переменная "proc" может существовать без заданного значения, поскольку такие
переменные создаются при разборе конфигурации.
  • “ifgt”/“iflt”:
Проверяет, «больше» или «меньше» содержимое переменной, чем входной образец.
Эта проверка возможна, только если и входной образец, и переменная имеют
целочисленный тип. В противном случае результат проверки по умолчанию
считается истинным.

sha1

sha1

Преобразует двоичный входной образец в дайджест SHA-1. Результат — двоичный образец длиной 20 байт.

sha2([<bits>])

sha2([<bits>])

Преобразует двоичный входной образец в дайджест из семейства SHA-2. Результат — двоичный образец длиной <bits>/8 байт.

Допустимые значения для <bits> — 224, 256, 384, 512, каждое из которых соответствует SHA-<bits>. Значение по умолчанию — 256.

Обратите внимание: этот преобразователь доступен только в том случае, если HAProxy собран с USE_OPENSSL.

srv_is_up

srv_is_up

Принимает входное значение строкового типа, либо имя сервера, либо формат <backend>/<server>, и возвращает true, если указанный сервер в настоящее время находится в состоянии UP. Может использоваться в местах, где необходимо проверить состояние сервера по динамическому имени, например, значению cookie (например, req.cook(SRVID),srv_is_up) и затем принять решение о перенаправлении запроса. Перед использованием имейте в виду, что применение этого преобразователя к неконтролируемым данным может позволить внешнему наблюдателю запросить состояние любого сервера в конфигурации, что может быть недопустимо в некоторых средах.

srv_queue

srv_queue

Принимает входное значение строкового типа, либо имя сервера, либо формат <backend>/<server>, и возвращает число потоков в очереди на этом сервере. Может использоваться в местах, где необходимо проверить число потоков в очереди по динамическому имени, например, значению cookie (например, req.cook(SRVID),srv_queue) и затем принять решение о разрыве привязки или перенаправлении запроса. Перед использованием имейте в виду, что применение этого преобразователя к неконтролируемым данным может позволить внешнему наблюдателю запросить состояние любого сервера в конфигурации, что может быть недопустимо в некоторых средах.

strcmp(<var>)

strcmp(<var>)

Сравнивает содержимое <var> с входным значением типа строка. Возвращает результат как знаковое целое, совместимое с strcmp(3): 0, если обе строки идентичны. Значение меньше 0, если левая строка лексикографически меньше правой или если левая строка короче. Значение больше 0 в остальных случаях (правая строка больше левой или правая строка короче).

См. также преобразователь secure_memcmp, если требуется сравнить две двоичные строки за постоянное время.

Пример:

http-request set-var(txn.host) hdr(host)
# Check whether the client is attempting domain fronting.
acl ssl_sni_http_host_match ssl_fc_sni,strcmp(txn.host) eq 0

sub(<value>)

sub(<value>)

Вычитает <value> из входного значения типа знаковое целое и возвращает результат как знаковое целое. Примечание: чтобы вычесть входное значение из константы, достаточно выполнить “neg,add(value)”. <value> может быть числовым значением или именем переменной. См. раздел 2.8 о переменных для подробностей.

table_bytes_in_rate([<table>])

table_bytes_in_rate([<table>])

Использует входной образец для поиска в таблице привязок текущего прокси или в указанной таблице привязок. Если ключ не найден в таблице, возвращается целое значение ноль. В противном случае преобразователь возвращает среднюю интенсивность передачи данных от клиента к серверу, связанную с входным образцом в указанной таблице, измеряемую в количестве байт за период, настроенный в таблице. См. также ключевое слово извлечения образца sc_bytes_in_rate.

table_bytes_out_rate([<table>])

table_bytes_out_rate([<table>])

Использует входной образец для поиска в таблице привязок текущего прокси или в указанной таблице привязок. Если ключ не найден в таблице, возвращается целое значение ноль. В противном случае преобразователь возвращает среднюю интенсивность передачи данных от сервера к клиенту, связанную с входным образцом в указанной таблице, измеряемую в количестве байт за период, настроенный в таблице. См. также ключевое слово извлечения образца sc_bytes_out_rate.

table_clr_gpc(<idx>[,<table>])

table_clr_gpc(<idx>[,<table>])

Использует входной образец для поиска в таблице привязок текущего прокси или в указанной таблице привязок. Очищает счётчик общего назначения по индексу <idx> массива gpc и возвращает его предыдущее значение. <idx> — целое число от 0 до 99. Если запись не найдена, она создаётся, и возвращается 0. Этот преобразователь применяется только к data_type массива ‘gpc’ (а не к устаревшим data_types ‘gpc0’ или ‘gpc1’). См. также ключевое слово извлечения образца sc_clr_gpc.

table_clr_gpc0([<table>])

table_clr_gpc0([<table>])

Использует входной образец для поиска в таблице привязок текущего прокси или в указанной таблице привязок. Очищает первый счётчик общего назначения ‘0’ и возвращает его предыдущее значение. Если запись не найдена, она создаётся, и возвращается 0. Обычно используется как второй ACL в выражении для отметки соединения при истинном результате первого ACL:

Пример:

# block if 5 consecutive requests continue to come faster than 10 sess
# per second, and reset the counter as soon as the traffic slows down.
acl abuse src_http_req_rate gt 10
acl kill  src,table_inc_gpc0 gt 5
acl save  src,table_clr_gpc0 ge 0
tcp-request connection accept if !abuse save
tcp-request connection reject if abuse kill

См. также ключевое слово извлечения образца sc_clr_gpc0.

table_clr_gpc1([<table>])

table_clr_gpc1([<table>])

Использует входной образец для поиска в таблице привязок текущего прокси или в указанной таблице привязок. Очищает первый счётчик общего назначения ‘1’ и возвращает его предыдущее значение. Если запись не найдена, она создаётся, и возвращается 0. Обычно используется как второй ACL в выражении для отметки соединения при истинном результате первого ACL. См. также ключевое слово извлечения образца sc_clr_gpc1.

table_conn_cnt([<table>])

table_conn_cnt([<table>])

Использует входной образец для поиска в таблице привязок текущего прокси или в указанной таблице привязок. Если ключ не найден в таблице, возвращается целое значение ноль. В противном случае преобразователь возвращает общее количество входящих соединений, связанных с входным образцом в указанной таблице. См. также ключевое слово извлечения образца sc_conn_cnt.

table_conn_cur([<table>])

table_conn_cur([<table>])

Использует входной образец для поиска в таблице привязок текущего прокси или в указанной таблице привязок. Если ключ не найден в таблице, возвращается целое значение ноль. В противном случае преобразователь возвращает текущее количество одновременных отслеживаемых соединений, связанных с входным образцом в указанной таблице. См. также ключевое слово извлечения образца sc_conn_cur.

table_conn_rate([<table>])

table_conn_rate([<table>])

Использует входной образец для поиска в таблице привязок текущего прокси или в указанной таблице привязок. Если ключ не найден в таблице, возвращается целое значение ноль. В противном случае преобразователь возвращает среднюю интенсивность входящих соединений, связанных с входным образцом в указанной таблице. См. также ключевое слово извлечения образца sc_conn_rate.

table_expire([<table>[,<default_value>]])

table_expire([<table>[,<default_value>]])

Использует входной образец для поиска в таблице привязок текущего прокси или в указанной таблице привязок. Если ключ не найден в таблице, преобразователь завершается с ошибкой, за исключением случая, когда установлено <default_value>: тогда преобразователь успешно выполняется и возвращает <default_value>. Если ключ найден, преобразователь возвращает время до истечения срока действия ключа, связанную с входным образцом в указанной таблице. См. также ключевое слово извлечения образца table_idle.

table_glitch_cnt([<table>])

table_glitch_cnt([<table>])

Использует входной образец для поиска в таблице привязок текущего прокси или в указанной таблице привязок. Если ключ не найден в таблице, возвращается целое значение ноль. В противном случае преобразователь возвращает общее количество сбоев входящих соединений, связанных с входным образцом в указанной таблице. См. также ключевое слово извлечения образца sc_glitch_cnt и fc_glitches для значения, измеренного на текущем входящем соединении.

table_glitch_rate([<table>])

table_glitch_rate([<table>])

Использует входной образец для поиска в таблице привязок текущего прокси или в указанной таблице привязок. Если ключ не найден в таблице, возвращается целое значение ноль. В противном случае преобразователь возвращает среднюю интенсивность сбоев входящих соединений, связанных с входным образцом в указанной таблице. См. также ключевое слово извлечения образца sc_glitch_rate.

table_gpc(<idx>[,<table>])

table_gpc(<idx>[,<table>])

Использует входной образец для поиска в таблице привязок текущего прокси или в указанной таблице привязок. Если ключ не найден в таблице, возвращается целое значение ноль. В противном случае преобразователь возвращает текущее значение счётчика общего назначения по индексу <idx> массива, связанного с входным образцом в указанной таблице <table>. <idx> — целое число от 0 до 99. Если по этому индексу нет сохранённого GPC, также возвращается целочисленное значение 0. Это относится только к data_type массива ‘gpc’ (а не к устаревшим data_types ‘gpc0’ или ‘gpc1’). См. также ключевое слово извлечения образца sc_get_gpc.

table_gpc0([<table>])

table_gpc0([<table>])

Использует входной образец для поиска в таблице привязок текущего прокси или в указанной таблице привязок. Если ключ не найден в таблице, возвращается целочисленное значение ноль. В противном случае преобразователь возвращает текущее значение первого счётчика общего назначения, связанного с входным образцом в указанной таблице. См. также ключевое слово извлечения образца sc_get_gpc0.

table_gpc0_rate([<table>])

table_gpc0_rate([<table>])

Использует входной образец для поиска в таблице привязок текущего прокси или в указанной таблице привязок. Если ключ не найден в таблице, возвращается целочисленное значение ноль. В противном случае преобразователь возвращает частоту увеличения счётчика gpc0 за настроенный период в таблице, связанную с входным образцом в указанной таблице. См. также ключевое слово извлечения образца sc_get_gpc0_rate.

table_gpc1([<table>])

table_gpc1([<table>])

Использует входной образец для поиска в таблице привязок текущего прокси или в указанной таблице привязок. Если ключ не найден в таблице, возвращается целочисленное значение ноль. В противном случае преобразователь возвращает текущее значение второго счётчика общего назначения, связанного с входным образцом в указанной таблице. См. также ключевое слово извлечения образца sc_get_gpc1.

table_gpc1_rate([<table>])

table_gpc1_rate([<table>])

Использует входной образец для поиска в таблице привязок текущего прокси или в указанной таблице привязок. Если ключ не найден в таблице, возвращается целочисленное значение ноль. В противном случае преобразователь возвращает частоту увеличения счётчика gpc1 за настроенный период в таблице, связанную с входным образцом в указанной таблице. См. также ключевое слово извлечения образца sc_get_gpc1_rate.

table_gpc_rate(<idx>[,<table>])

table_gpc_rate(<idx>[,<table>])

Использует входной образец для поиска в таблице привязок текущего прокси или в указанной таблице привязок. Если ключ не найден в таблице, возвращается целое значение ноль. В противном случае преобразователь возвращает частоту, с которой счётчик глобального назначения по индексу <idx> массива (связанный с входным образцом в указанной таблице привязок <table>) увеличивался за настроенный период. <idx> — целое число от 0 до 99. Если gpc_rate не хранится по этому индексу, также возвращается целочисленное значение 0. Это относится только к data_type массива ‘gpc_rate’ (а не к устаревшим data_types ‘gpc0_rate’ или ‘gpc1_rate’). См. также sc_gpc_rate — ключевое слово извлечения образца.

table_gpt(<idx>[,<table>])

table_gpt(<idx>[,<table>])

Использует входной образец для поиска в таблице привязок текущего прокси или в указанной таблице привязок. Если ключ не найден в таблице, возвращается целое значение ноль. В противном случае преобразователь возвращает текущее значение метки общего назначения по индексу <idx> массива, связанного с входным образцом в указанной таблице <table>. <idx> — целое число от 0 до 99. Если по этому индексу нет сохранённого GPT, также возвращается целочисленное значение 0. Это относится только к data_type массива ‘gpt’ (а не к устаревшему типу данных ‘gpt0’). См. также sc_get_gpt — ключевое слово извлечения образца.

table_gpt0([<table>])

table_gpt0([<table>])

Использует входной образец для поиска в таблице привязок текущего прокси или в указанной таблице привязок. Если ключ не найден в таблице, возвращается целочисленное значение ноль. В противном случае преобразователь возвращает текущее значение первой метки общего назначения, связанного с входным образцом в указанной таблице. См. также ключевое слово извлечения образца sc_get_gpt0.

table_http_err_cnt([<table>])

table_http_err_cnt([<table>])

Использует входной образец для поиска в таблице привязок текущего прокси или в указанной таблице привязок. Если ключ не найден в таблице, возвращается целочисленное значение ноль. В противном случае преобразователь возвращает общее количество ошибок типа HTTP, связанных с входным образцом в указанной таблице. См. также ключевое слово извлечения образца sc_http_err_cnt.

table_http_err_rate([<table>])

table_http_err_rate([<table>])

Использует входной образец для поиска в таблице привязок текущего прокси или в указанной таблице привязок. Если ключ не найден в таблице, возвращается целочисленное значение ноль. В противном случае преобразователь возвращает среднюю частоту ошибок типа HTTP, связанных с входным образцом в указанной таблице, измеряемую как количество ошибок за период, настроенный в таблице. См. также ключевое слово извлечения образца sc_http_err_rate.

table_http_fail_cnt([<table>])

table_http_fail_cnt([<table>])

Использует входной образец для поиска в таблице привязок текущего прокси или в указанной таблице привязок. Если ключ не найден в таблице, возвращается целочисленное значение ноль. В противном случае преобразователь возвращает общее количество сбоев типа HTTP, связанных с входным образцом в указанной таблице. См. также ключевое слово извлечения образца sc_http_fail_cnt.

table_http_fail_rate([<table>])

table_http_fail_rate([<table>])

Использует входной образец для поиска в таблице привязок текущего прокси или в указанной таблице привязок. Если ключ не найден в таблице, возвращается целочисленное значение ноль. В противном случае преобразователь возвращает среднюю частоту сбоев типа HTTP, связанных с входным образцом в указанной таблице, измеряемую как количество сбоев за период, настроенный в таблице. См. также ключевое слово извлечения образца sc_http_fail_rate.

table_http_req_cnt([<table>])

table_http_req_cnt([<table>])

Использует входной образец для поиска в таблице привязок текущего прокси или в указанной таблице привязок. Если ключ не найден в таблице, возвращается целочисленное значение ноль. В противном случае преобразователь возвращает общее количество запросов типа HTTP, связанных с входным образцом в указанной таблице. См. также ключевое слово извлечения образца sc_http_req_cnt.

table_http_req_rate([<table>])

table_http_req_rate([<table>])

Использует входной образец для поиска в таблице привязок текущего прокси или в указанной таблице привязок. Если ключ не найден в таблице, возвращается целочисленное значение ноль. В противном случае преобразователь возвращает среднюю частоту запросов типа HTTP, связанных с входным образцом в указанной таблице, измеряемую как количество запросов за период, настроенный в таблице. См. также ключевое слово извлечения образца sc_http_req_rate.

table_idle([<table>[,<default_value>]])

table_idle([<table>[,<default_value>]])

Использует входной образец для поиска в таблице привязок текущего прокси или в указанной таблице привязок. Если ключ не найден в таблице, преобразователь завершается с ошибкой, за исключением случая, когда установлено <default_value>: это делает преобразователь успешным и возвращает значение <default_value>. Если ключ найден, преобразователь возвращает время, в течение которого запись, связанная с входным образцом в указанной таблице, оставалась неактивной с момента последнего обновления. См. также ключевое слово извлечения образца table_expire.

table_inc_gpc(<idx>[,<table>])

table_inc_gpc(<idx>[,<table>])

Использует входной образец для поиска в таблице привязок текущего прокси или в указанной таблице привязок. Увеличивает значение счётчика общего назначения по индексу <idx> массива и возвращает его новое значение. <idx> — целое число от 0 до 99. Если запись не найдена, она создаётся, и возвращается значение 1. Этот преобразователь применяется только к data_type массива ‘gpc’ (а не к устаревшим data_types ‘gpc0’ или ‘gpc1’). См. также sc_inc_gpc.

table_inc_gpc0([<table>])

table_inc_gpc0([<table>])

Использует входной образец для поиска в таблице привязок текущего прокси или в указанной таблице привязок. Увеличивает счётчик общего назначения ‘0’ и возвращает его новое значение. Если запись не найдена, она создаётся, и возвращается 1. См. также sc0/sc2/sc2_inc_gpc0. Обычно используется как второй ACL в выражении, чтобы отметить соединение при истинном результате первого ACL:

Пример:

acl abuse src,table_req_rate gt 10
acl kill  src,table_inc_gpc0 gt 0
tcp-request connection reject if abuse kill

table_inc_gpc1([<table>])

table_inc_gpc1([<table>])

Использует входной образец для поиска в таблице привязок текущего прокси или в указанной таблице привязок. Увеличивает счётчик общего назначения ‘1’ и возвращает его новое значение. Если запись не найдена, она создаётся, и возвращается 1. См. также sc0/sc2/sc2_inc_gpc1. Обычно используется как второй ACL в выражении, чтобы отметить соединение при истинном результате первого ACL.

table_kbytes_in([<table>])

table_kbytes_in([<table>])

Использует входной образец для поиска в таблице привязок текущего прокси или в указанной таблице привязок. Если ключ не найден в таблице, возвращается целочисленное значение ноль. В противном случае преобразователь возвращает общее количество данных от клиента к серверу, связанных с входным образцом в указанной таблице, измеряемое в килобайтах. Тест в настоящее время выполняется на 32-битных целых числах, что ограничивает значения до 4 терабайт. См. также ключевое слово извлечения образца sc_kbytes_in.

table_kbytes_out([<table>])

table_kbytes_out([<table>])

Использует входной образец для поиска в таблице привязок текущего прокси или в указанной таблице привязок. Если ключ не найден в таблице, возвращается целочисленное значение ноль. В противном случае преобразователь возвращает общее количество данных от сервера к клиенту, связанных с входным образцом в указанной таблице, измеряемое в килобайтах. Тест в настоящее время выполняется на 32-битных целых числах, что ограничивает значения до 4 терабайт. См. также ключевое слово извлечения образца sc_kbytes_out.

table_server_id([<table>])

table_server_id([<table>])

Использует входной образец для поиска в таблице привязок текущего прокси или в указанной таблице привязок. Если ключ не найден в таблице, возвращается целочисленное значение ноль. В противном случае преобразователь возвращает идентификатор сервера, связанный с входным образцом в указанной таблице. Идентификатор сервера привязывается к образцу правилом “stick” при успешном подключении к серверу. Идентификатор сервера ноль означает, что ключу не присвоен никакой сервер.

table_sess_cnt([<table>])

table_sess_cnt([<table>])

Использует входной образец для поиска в таблице привязок текущего прокси или в указанной таблице привязок. Если ключ не найден в таблице, возвращается целочисленное значение ноль. В противном случае преобразователь возвращает общее количество входящих сеансов, связанных с входным образцом в указанной таблице. Примечание: под сеансом здесь понимается входящее соединение, принятое правилами набора “tcp-request connection”. См. также ключевое слово извлечения образца sc_sess_cnt.

table_sess_rate([<table>])

table_sess_rate([<table>])

Использует входной образец для поиска в таблице привязок текущего прокси или в указанной таблице привязок. Если ключ не найден в таблице, возвращается целочисленное значение ноль. В противном случае преобразователь возвращает среднюю частоту входящих сеансов, связанных с входным образцом в указанной таблице. Примечание: под сеансом здесь понимается входящее соединение, принятое правилами набора “tcp-request connection”. См. также ключевое слово извлечения образца sc_sess_rate.

table_trackers([<table>])

table_trackers([<table>])

Использует входной образец для поиска в таблице привязок текущего прокси или в указанной таблице привязок. Если ключ не найден в таблице, возвращается целочисленное значение ноль. В противном случае преобразователь возвращает текущее количество одновременных соединений, отслеживающих тот же ключ, что и входной образец, в указанной таблице. Отличается от table_conn_cur тем, что не полагается на хранящуюся информацию, а использует счётчик ссылок таблицы (значение “use”, возвращаемое командой “show table” на CLI). Это может быть более подходящим для отслеживания layer7. Например, позволяет сообщить серверу число одновременных соединений от заданного адреса. См. также ключевое слово извлечения образца sc_trackers.

tcp.dst

tcp.dst

Используется со входным образцом, представляющим двоичный заголовок TCP, возвращаемый “ip.data”. Возвращает целое число, представляющее порт назначения, содержащийся в заголовке TCP. См. также “fc_saved_syn”, “tcp-ss” и “ip.data”.

tcp.flags

tcp.flags

Используется со входным образцом, представляющим двоичный заголовок TCP, возвращаемый “ip.data”. Возвращает целое число, представляющее флаги TCP из этого заголовка TCP. Извлекаются все 8 флагов от FIN до CWR. Каждый флаг может быть проверен с помощью преобразователя “and()”. См. RFC9293 для значений каждого флага. Также см. “fc_saved_syn”, “tcp-ss” и “ip.data”.

tcp.options.mss

tcp.options.mss

Используется со входным образцом, представляющим двоичный заголовок TCP, возвращаемый “ip.data”. Ищет опцию TCP типа “MSS”, и если найдена, возвращает целое значение, соответствующее объявленному значению в этой опции, в противном случае — ноль. Значение MSS — это максимальный размер сегмента и указывает наибольший размер сегмента, который может принять другая сторона, в байтах. См. также “fc_saved_syn”, “tcp-ss” и “ip.data”.

tcp.options.sack

tcp.options.sack

Используется со входным образцом, представляющим двоичный заголовок TCP, возвращаемый “ip.data”. Ищет опцию TCP типа “Sack-Permitted”, и если найдена, возвращает 1, в противном случае — ноль. См. также “fc_saved_syn”, “tcp-ss” и “ip.data”.

tcp.options.tsopt

tcp.options.tsopt

Используется со входным образцом, представляющим двоичный заголовок TCP, возвращаемый “ip.data”. Ищет опцию TCP типа “Timestamp”, и если найдена, возвращает 1, в противном случае — ноль. См. также “fc_saved_syn”, “tcp-ss” и “ip.data”.

tcp.options.tsval

tcp.options.tsval

Используется со входным образцом, представляющим двоичный заголовок TCP, возвращаемый “ip.data”. Ищет опцию TCP типа “Timestamp”, и если найдена, возвращает значение временной метки, переданное другой стороной, в противном случае не возвращает ничего. Обратите внимание, что временные метки — это беззнаковые значения длиной 32 бит без определённой единицы измерения, выбираемой только другой стороной, и временные метки предполагаются независимыми между различными соединениями. См. также “fc_saved_syn”, “tcp-ss” и “ip.data”.

tcp.options.wscale

tcp.options.wscale

Используется со входным образцом, представляющим двоичный заголовок TCP, возвращаемый “ip.data”. Ищет опцию TCP типа “Window Scale”, и если найдена, возвращает значение масштабирования окна, переданное другой стороной, в противном случае — ноль. Обратите внимание, что предполагается, что значения не превышают 14, хотя технически ограничений на их отправку нет. Чтобы определить, использовалась ли опция масштабирования окна, используйте “tcp.options.wsopt”. См. также “tcp-ss”, “fc_saved_syn”, “ip.data” и “tcp.options.wsopt”.

tcp.options.wsopt

tcp.options.wsopt

Используется со входным образцом, представляющим двоичный заголовок TCP, возвращаемый “ip.data”. Ищет опцию TCP типа “Window Scale”, и если найдена, возвращает 1, в противном случае — 0. См. также “fc_saved_syn”, “tcp-ss”, “ip.data”, “tcp.options.wscale”.

tcp.options_list

tcp.options_list

Используется со входным образцом, представляющим двоичный заголовок TCP, возвращаемый “ip.data”. Строит двоичную последовательность всех видов опций TCP в том же порядке, в каком они появляются в заголовке TCP. Может выдать от 0 до 60 байт (в худшем случае). Маркер конца опций не включается в результат. См. также “fc_saved_syn”, “tcp-ss” и “ip.data”.

tcp.seq

tcp.seq

Используется со входным образцом, представляющим двоичный заголовок TCP, возвращаемый “ip.data”. Возвращает целое число, представляющее номер последовательности, используемый удалённым узлом в заголовке TCP. Номера последовательности являются беззнаковыми значениями размером 32 бит. См. также “fc_saved_syn”, “tcp-ss” и “ip.data”.

tcp.src

tcp.src

Используется со входным образцом, представляющим двоичный заголовок TCP, возвращаемый “ip.data”. Возвращает целое число, представляющее номер порта источника, содержащийся в заголовке TCP. См. также “fc_saved_syn”, “tcp-ss” и “ip.data”.

tcp.win

tcp.win

Используется со входным образцом, представляющим двоичный заголовок TCP, возвращаемый “ip.data”. Возвращает целое число, представляющее размер окна, объявленный удалённым узлом в заголовке TCP. Значение предоставляется без изменений, как 16-битное беззнаковое значение, без применения коэффициента масштабирования окна. См. также “fc_saved_syn”, “tcp-ss” и “ip.data”.

ub64dec

ub64dec

Этот преобразователь — вариант преобразователя b64dec для base64url. Кодирование base64url — вариант кодирования base64 с алфавитом, безопасным для URL и имён файлов. Оно также используется в стандарте JWT (JSON Web Token).

Пример:

# Decoding a JWT payload:
http-request set-var(txn.token_payload) req.hdr(Authorization),word(2,.),ub64dec

ub64enc

ub64enc

Этот преобразователь — вариант base64url преобразователя base64.

ungrpc(<field_number>[,<field_type>])

ungrpc(<field_number>[,<field_type>])

Извлекает поле сообщения protocol buffers из входного двоичного образца, представляющего сообщение gRPC. Номер поля задаётся аргументом <field_number> (в нотации с точками). Если <field_type> отсутствует, поле извлекается в необработанном виде; если указан — в виде целочисленного образца. Допустимы следующие типы: “int32”, “int64”, “uint32”, “uint64”, “sint32”, “sint64”, “bool”, “enum” для типа кодирования “varint” 0; “fixed64”, “sfixed64”, “double” для 64-битного типа кодирования 1; “fixed32”, “sfixed32”, “float” для типа кодирования 5. Тип “string” считается типом с явно заданной длиной, поэтому для его извлечения аргумент <field_type> не требуется. Дополнительные сведения о типах полей сообщений protocol buffers: https://developers.google.com/protocol-buffers/docs/encoding

Пример:

// with such a protocol buffer .proto file content adapted from
// https://github.com/grpc/grpc/blob/master/examples/protos/route_guide.proto

message Point {
  int32 latitude = 1;
  int32 longitude = 2;
}

message PPoint {
  Point point = 59;
}

message Rectangle {
  // One corner of the rectangle.
  PPoint lo = 48;
  // The other corner of the rectangle.
  PPoint hi = 49;
}

Например, если тело запроса состоит из значения объекта “Rectangle” (два сообщения protocol buffers PPoint), четыре поля protocol buffers можно извлечь с помощью следующих директив “ungrpc”:

req.body,ungrpc(48.59.1,int32) # "latitude" of "lo" first PPoint
req.body,ungrpc(48.59.2,int32) # "longitude" of "lo" first PPoint
req.body,ungrpc(49.59.1,int32) # "latitude" of "hi" second PPoint
req.body,ungrpc(49.59.2,int32) # "longitude" of "hi" second PPoint

Можно также извлечь промежуточное поле 48.59 как двоичный образец следующим образом:

req.body,ungrpc(48.59)

Поскольку сообщение gRPC всегда состоит из заголовка gRPC, за которым следуют сообщения protocol buffers, в предыдущем примере поле “latitude” первого PPoint “lo” можно извлечь следующими эквивалентными директивами:

req.body,ungrpc(48.59),protobuf(1,int32)
req.body,ungrpc(48),protobuf(59.1,int32)
req.body,ungrpc(48),protobuf(59),protobuf(1,int32)

Обратите внимание, что первый преобразователь должен быть “ungrpc”, остальные должны быть “protobuf”, и только последний может иметь или не иметь второй аргумент для интерпретации предыдущего двоичного образца.

unset-var(<var>)

unset-var(<var>)

Сбрасывает переменную, если входные данные определены. Имя переменной начинается с обозначения её области действия. Подробнее о переменных см. в разделе 2.8 .

upper

upper

Преобразует строковый образец в верхний регистр. Может использоваться только после функции извлечения строкового образца или после ключевого слова преобразования, возвращающего тип строки. Результат имеет тип string.

url_dec([<in_form>])

url_dec([<in_form>])

Принимает URL-кодированную строку в качестве входных данных и возвращает декодированную версию в качестве выходных данных. Входные и выходные данные имеют тип string. Если аргумент <in_form> установлен в ненулевое целочисленное значение, входная строка считается частью формы или строки запроса, и символ ‘+’ будет заменён на пробел (’ ‘). В противном случае это произойдёт только после знака вопроса, указывающего на строку запроса (’?’).

url_enc([<enc_type>])

url_enc([<enc_type>])

Принимает строку в качестве входных данных и возвращает закодированную версию в качестве выходных данных. Входные и выходные данные имеют тип string. По умолчанию тип кодирования предназначен для типа query. В настоящее время другие типы не поддерживаются, но опциональный аргумент предусмотрен для будущих изменений.

us_ltime(<format>[,<offset>])

us_ltime(<format>[,<offset>])

Работает аналогично “ltime”, но принимает входные данные в микросекундах. Также поддерживает спецификатор преобразования %N по образцу date(1). Преобразует целое число, которое предполагается датой, отсчитанной от начала эпохи, в строку с этой датой в местном времени. Формат задаётся строкой <format> с помощью strftime(3). Это позволяет использовать в журналах произвольный формат даты. К входной дате можно применить необязательное смещение <offset> в микросекундах (положительное или отрицательное). Поддерживаемые операционной системой форматы описаны на странице руководства strftime().

Спецификатор преобразования %N позволяет вывести часть даты в наносекундах, точность ограничена тем, что входные данные заданы в микросекундах. (000000000..999999000). %N может принимать аргумент ширины между % и N. Полезно для отображения миллисекунд (%3N) или микросекунд (%6N). Ширина по умолчанию и максимальная ширина — 9 (%N = %9N).

См. также преобразователь “utime” для UTC, а также преобразователи “ltime” и “ms_ltime”.

Пример:

# Emit 3 colons, the local time, the timezone and another with ip:port
# e.g. 2023/07/24/09:53:02.196234 +0000 127.0.0.1:41530
log-format %[accept_date(us),us_ltime("%Y/%m/%d/%H:%M:%S.%6N %z")]\ %ci:%cp

us_utime(<format>[,<offset>])

us_utime(<format>[,<offset>])

Работает аналогично “utime”, но принимает входные данные в микросекундах. Также поддерживает спецификатор преобразования %N по образцу date(1). Преобразует целое число, которое предполагается датой, отсчитанной от начала эпохи, в строку с этой датой в UTC. Формат задаётся строкой <format> с помощью strftime(3). Это позволяет использовать в журналах произвольный формат даты. К входной дате можно применить необязательное смещение <offset> в микросекундах (положительное или отрицательное). Поддерживаемые операционной системой форматы описаны на странице руководства strftime().

Спецификатор преобразования %N позволяет вывести часть даты в наносекундах, точность ограничена тем, что входные данные заданы в микросекундах. (000000000..999999000). %N может принимать аргумент ширины между % и N. Полезно для отображения миллисекунд (%3N) или микросекунд (%6N). Ширина по умолчанию и максимальная ширина — 9 (%N = %9N).

См. также преобразователь “ltime” для локального времени, а также преобразователи “utime” и “ms_utime”.

Пример:

# Emit 3 colons, the UTC time, the timezone and another with ip:port
# e.g. 2023/07/24/09:53:02.196234 +0000 127.0.0.1:41530
log-format %[accept_date(us),us_utime("%Y/%m/%d/%H:%M:%S.%6N %z")]\ %ci:%cp

utime(<format>[,<offset>])

utime(<format>[,<offset>])

Преобразует целое число, которое предполагается датой, отсчитанной от начала эпохи, в строку с этой датой в UTC. Формат задаётся строкой <format> с помощью strftime(3). Это позволяет использовать в журналах произвольный формат даты. К входной дате можно применить необязательное смещение <offset> в секундах (положительное или отрицательное). Поддерживаемые операционной системой форматы описаны на странице руководства strftime(). См. также преобразователь “ltime”, а также “ms_utime” и “us_utime”.

Пример:

# Emit two colons, one with the UTC time and another with ip:port
# e.g.  20140710162350 127.0.0.1:57325
log-format %[date,utime(%Y%m%d%H%M%S)]\ %ci:%cp

when(<condition>[,<args>...])

when(<condition>[,<args>...])

Оценивает условие и, если оно истинно, передаёт входной образец без изменений на выход, в противном случае — ничего не возвращает. Предназначен специально для получения редко необходимых данных, которые следует выводить только при определённых условиях, например отладочной информации при возникновении ошибки.

Условие состоит из ключевого слова из приведённого ниже списка, необязательно предваряемого восклицательным знаком (’!’) для отрицания, и необязательно сопровождаемого аргументами, специфичными для этого условия:

- "error" возвращает true, когда во время обработки запроса или потока возникла ошибка. Используются те же правила, что и для "dontlog-normal" (например, успешное повторное распределение считается ошибкой).

- "forwarded" возвращает true, если запрос был перенаправлен на сервер бэкенда

- "normal" возвращает true, если ошибка не произошла (что эквивалентно "!error").

- "processed" возвращает true, если запрос был либо перенаправлен на сервер бэкенда, либо обработан апплетом.

- "stopping" возвращает true, если во время вычисления правила процесс
  сейчас останавливается

- "toapplet" возвращает true, если запрос был обработан апплетом.

- "acl" возвращает true, если ACL, указанный следующим аргументом,
  даёт результат true. ACL вычисляется непосредственно преобразователем,
  поэтому то, к чему он обращается, должно быть допустимым в этом контексте.
  Один из вариантов использования — проверить, слишком ли велико общее
  время передачи, прежде чем записывать в журнал подробности
  аномально долгих передач.

Обратите внимание, что содержимое всегда оценивается, поэтому такое действие не предотвращает генерацию этой информации. Оно предназначено только для предотвращения её вывода.

Например, можно добавлять отладочную информацию по потоку бэкенда в журнал только при возникновении ошибки во время обработки, или записывать дополнительные данные в журнал при остановке и т. д.

Пример:

# log "dbg={-}" when fine, or "dbg={... debug info ...}" on error:
log-format "$HAPROXY_HTTP_LOG_FMT dbg={%[bs.debug_str,when(!normal)]}"

Здесь поле "dbg" в журнале содержит только дефис ('-'), указывающий на
отсутствие содержимого, если условие правила не выполнено; когда оно выполнено,
выводится целый блок отладочной информации.

Пример

# log "dbg={-}" when fine, or "dbg={... debug info ...}" on slow transfers
acl slow_xfer res.timer.data ge 10000   # more than 10s is slow
log-format "$HAPROXY_HTTP_LOG_FMT                                         \
            fsdbg={%[fs.debug_str,when(acl,slow_xfer)]}                   \
            bsdbg={%[bs.debug_str,when(acl,slow_xfer)]}"

Пример

# only emit the backend src/port when a real connection was issued:
log-format "$HAPROXY_HTTP_LOG_FMT \
           src=[%[bc_src,when(forwarded)]:%[bc_src_port,when(forwarded)]]"

Поскольку он прерывает оценку выражения, если условие не выполняется, его также можно использовать для предотвращения вызова последующего преобразователя. Например, это может быть использовано для вызова преобразователя debug() только при возникновении ошибки, чтобы логировать элемент только в случае необходимости.

Пример:

# emit the whole response headers list to stderr only on error and only
# when the output is a connection. We abuse a dummy variable here.
http-after-response set-var(res.test) \
              res.hdrs,when(error),when(forwarded),debug(hdrs,stderr)

См. также: преобразователь отладки

word(<index>,<delimiters>[,<count>])

word(<index>,<delimiters>[,<count>])

Извлекает n-е слово, считая с начала (положительный индекс) или с конца (отрицательный индекс), из входной строки с учётом заданных разделителей. Индексы начинаются с 1 или -1, разделители — это строка, содержащая список символов. Пустые слова пропускаются. Это означает, что разделители в начале или конце входной строки игнорируются, а последовательные разделители внутри строки считаются одним разделителем. Необязательно можно указать <count> извлекаемых слов (по умолчанию: 1). Значение 0 означает извлечение всех оставшихся слов.

Пример:

str(f1_f2_f3__f5),word(4,_)    # f5
str(f1_f2_f3__f5),word(5,_)    # <not found>
str(f1_f2_f3__f5),word(2,_,0)  # f2_f3__f5
str(f1_f2_f3__f5),word(3,_,2)  # f3__f5
str(f1_f2_f3__f5),word(-2,_,3) # f1_f2_f3
str(f1_f2_f3__f5),word(-3,_,0) # f1_f2
str(/f1/f2/f3/f4),word(1,/)    # f1
str(/f1////f2/f3/f4),word(1,/) # f2

wt6([<avalanche>])

wt6([<avalanche>])

Хэширует двоичный входной образец в беззнаковое 32-битное значение с использованием хэш-функции WT6. К результату можно дополнительно применить хеш-функцию с полным лавинным эффектом, если необязательный аргумент <avalanche> равен 1. Этот преобразователь использует те же функции, что и различные алгоритмы балансировки нагрузки на основе хэширования, поэтому обеспечивает точно такие же результаты. В основном предназначен для отладки, но может использоваться как запись в таблице привязок для сбора приблизительной статистики. Не должен использоваться в целях безопасности, так как хэш размером 32 бит легко взломать. См. также “crc32”, “djb2”, “sdbm”, “crc32c” и директиву “hash-type”.

x509_v_err_str

x509_v_err_str

Преобразует числовое значение в соответствующее ему имя константы X509_V_ERR. Полезно при ACL для создания конфигурации, совместимой с несколькими версиями OpenSSL, поскольку некоторые коды могут меняться при переходе на другую версию.

При отсутствии соответствующего имени константы выводит числовое значение в виде строки.

Список констант, предоставляемых OpenSSL, можно найти на https://www.openssl.org/docs/manmaster/man3/X509_STORE_CTX_get_error.html#ERROR-CODES . Будьте внимательны: убедитесь, что читаете страницу для правильной версии OpenSSL.

Пример:

bind :443 ssl crt common.pem ca-file ca-auth.crt verify optional crt-ignore-err X509_V_ERR_CERT_REVOKED,X509_V_ERR_CERT_HAS_EXPIRED

acl cert_expired ssl_c_verify,x509_v_err_str -m str X509_V_ERR_CERT_HAS_EXPIRED
acl cert_revoked ssl_c_verify,x509_v_err_str -m str X509_V_ERR_CERT_REVOKED
acl cert_ok      ssl_c_verify,x509_v_err_str -m str X509_V_OK

http-response add-header X-SSL Ok if cert_ok
http-response add-header X-SSL Expired if cert_expired
http-response add-header X-SSL Revoked if cert_revoked

http-response add-header X-SSL-verify %[ssl_c_verify,x509_v_err_str]

xor(<value>)

xor(<value>)

Выполняет побитовую операцию “XOR” (исключающее ИЛИ) между <value> и входным значением типа знаковое целое и возвращает результат как знаковое целое. <value> может быть числом или именем переменной. Подробнее о переменных см. в разделе 2.8 .

xxh3([<seed>])

xxh3([<seed>])

Хеширует входной двоичный образец в 64-битное знаковое значение с помощью 64-битного варианта XXH3 хеш-функции XXhash. Хеш поддерживает начальное значение, по умолчанию равное нулю; другое значение можно передать аргументом <seed>. Эта хеш-функция известна хорошими свойствами и высокой скоростью, поэтому её можно использовать для хеширования URLs и/или параметров URL в качестве ключей таблиц привязок, собирающих статистику с низкой частотой коллизий. Однако следует соблюдать осторожность: алгоритм не считается криптографически безопасным.

xxh32([<seed>])

xxh32([<seed>])

Хэширует двоичный входной образец в беззнаковое количество 32 бит с использованием варианта XXHash хэш-функции размером 32 бит. Этот хэш поддерживает начальное значение (seed), по умолчанию равное нулю, но может быть задано другое значение через аргумент <seed>. Этот хэш известен своей высокой эффективностью и скоростью, поэтому его можно использовать для хэширования URL и/или параметров URL в качестве ключей таблицы привязок для сбора статистики с низкой вероятностью коллизий, хотя следует помнить, что алгоритм не считается криптографически безопасным.

xxh64([<seed>])

xxh64([<seed>])

Хэширует двоичный входной образец в знаковое количество 64 бит с использованием варианта XXHash хэш-функции размером 64 бит. Этот хэш поддерживает начальное значение (seed), по умолчанию равное нулю, но может быть задано другое значение через аргумент <seed>. Этот хэш известен своей высокой эффективностью и скоростью, поэтому его можно использовать для хэширования URL и/или параметров URL в качестве ключей таблицы привязок для сбора статистики с низкой вероятностью коллизий, хотя следует помнить, что алгоритм не считается криптографически безопасным.

7.3.2. Извлечение образцов из внутренних состояний

Первый набор методов извлечения образцов применяется к внутренней информации, не связанной даже с какими-либо данными клиента. Эти методы иногда используются с директивами “monitor fail” для передачи внутреннего состояния внешним наблюдателям. Методы извлечения образцов, описанные в этом разделе, могут использоваться в любом месте.

Сводка методов извлечения образцов в этом разделе и их соответствующие типы:

  Ключевое слово                                   Выходной тип
-------------------------------------------------+-------------
acl([!]<name>[,...])                               boolean
act_conn                                           integer
always_false                                       boolean
always_true                                        boolean
avg_queue([<backend>])                             integer
be_conn([<backend>])                               integer
be_conn_free([<backend>])                          integer
be_sess_rate([<backend>])                          integer
bin(<hex>)                                         bin
bool(<bool>)                                       bool
connslots([<backend>])                             integer
cpu_calls                                          integer
cpu_ns_avg                                         integer
cpu_ns_tot                                         integer
date([<offset>[,<unit>]])                          integer
date_us                                            integer
env(<name>)                                        string
fe_conn([<frontend>])                              integer
fe_req_rate([<frontend>])                          integer
fe_sess_rate([<frontend>])                         integer
hostname                                           string
int(<integer>)                                     signed
ipv4(<ipv4>)                                       ipv4
ipv6(<ipv6>)                                       ipv6
last_entity                                        string
last_rule_file                                     string
last_rule_line                                     integer
lat_ns_avg                                         integer
lat_ns_tot                                         integer
meth(<method>)                                     method
nbsrv([<backend>])                                 integer
pid                                                integer
prio_class                                         integer
prio_offset                                        integer
proc                                               integer
queue([<backend>])                                 integer
quic_enabled                                       boolean
rand([<range>])                                    integer
srv_conn([<backend>/]<server>)                     integer
srv_conn_free([<backend>/]<server>)                integer
srv_is_up([<backend>/]<server>)                    boolean
srv_iweight([<backend>/]<server>)                  integer
srv_queue([<backend>/]<server>)                    integer
srv_sess_rate([<backend>/]<server>)                integer
srv_uweight([<backend>/]<server>)                  integer
srv_weight([<backend>/]<server>)                   integer
stopping                                           boolean
str(<string>)                                      string
table_avl([<table>])                               integer
table_cnt([<table>])                               integer
term_events                                        string
thread                                             integer
txn.id32                                           integer
txn.sess_term_state                                string
uptime                                             integer
uuid([<version>])                                  string
var(<var-name>[,<default>])                        undefined
wait_end                                           boolean
waiting_entity                                     string
-------------------------------------------------+-------------

Подробный список:

acl([!]<name>[,...]): boolean

acl([!]<name>[,...]): boolean

Возвращает true, если оценка всех указанных ACL(ов) является истинной, в противном случае — false. Можно указать до 12 ACL, разделённых запятыми. Каждый указанный ACL может быть предварён знаком “!” для инвертирования результата. Если какая-либо оценка приводит к ошибке, то образец также возвращает ошибку. Обратите внимание, что HAProxy не выполняет проверки на корректность ссылок на ACL, например, на то, используется ли ACL, использующий извлечение образца запроса HTTP, в контексте ответа. Это поведение может измениться в будущем.

act_conn: integer Возвращает общее количество активных одновременных соединений на процессе.

always_false: boolean Всегда возвращает логическое значение “false”. Может использоваться с ACL как временная замена другому, при настройке конфигурации.

always_true: boolean Всегда возвращает логическое значение “true”. Может использоваться с ACL как временная замена другому, при настройке конфигурации.

avg_queue([<backend>]): integer

avg_queue([<backend>]): integer

Возвращает общее количество соединений в очереди в указанном бэкенде, делённое на количество активных серверов. Если бэкенд не указан, используется текущий. Это очень похоже на “queue”, за исключением того, что учитывается размер фермы, чтобы получить более точную оценку времени обработки нового соединения. Основное применение — с ACL для возврата страницы с извинением новым пользователям, когда становится очевидным, что они получат обслуживание ухудшенного качества, или для передачи бэкенд-серверам в заголовке, чтобы те решили работать в ухудшённом режиме или отключить некоторые функции для ускорения обработки. Обратите внимание, что в случае, если больше не останется активных серверов, будет считаться удвоенное количество соединений в очереди. Это разумная оценка, поскольку мы ожидаем, что один из серверов скоро вернётся, но всё же предпочтительнее направлять новую нагрузку на другой бэкенд, если он в лучшем состоянии. См. также методы извлечения образцов “queue”, “be_conn” и “be_sess_rate”.

be_conn([<backend>]): integer

be_conn([<backend>]): integer

Применяется к количеству установленных соединений в бэкенде, возможно, включая соединение, которое оценивается. Если имя бэкенда не указано, используется текущий. Также возможно проверить другой бэкенд. Может использоваться для выбора конкретной фермы, когда основная заполнена. См. также критерии “fe_conn”, “queue”, “be_conn_free” и “be_sess_rate”.

be_conn_free([<backend>]): integer

be_conn_free([<backend>]): integer

Возвращает целое значение, соответствующее количеству доступных соединений на доступных серверах в бэкенде. Места в очереди не учитываются. Резервные серверы также не учитываются, кроме случая, когда все остальные серверы недоступны. Если имя бэкенда не указано, используется текущий. Также возможно проверить другой бэкенд. Может использоваться для выбора конкретной фермы, когда основная заполнена. См. также критерии “be_conn”, “connslots” и “srv_conn_free”.

ДРУГИЕ ОГОВОРКИ И ПРИМЕЧАНИЯ: если любое из значений maxconn или maxqueue сервера равно 0 (то есть неограничено), то это извлечение образца не имеет смысла, в таком случае возвращаемое значение будет -1.

be_sess_rate([<backend>]): integer

be_sess_rate([<backend>]): integer

Возвращает целочисленное значение, соответствующее скорости создания сессий в бэкенде, в количестве новых сессий в секунду. Используется с ACL для переключения на альтернативный бэкенд, когда дорогой или уязвимый бэкенд достигает слишком высокой скорости сессий, либо для ограничения злоупотребления сервисом (например, предотвращение массового скачивания онлайн-словаря). Также может быть полезно добавить этот элемент в логи с помощью директивы log-format.

Пример:

# Redirect to an error page if the dictionary is requested too often
backend dynamic
    mode http
    acl being_scanned be_sess_rate gt 100
    redirect location /denied.html if being_scanned

bin(<hex>): bin

bin(<hex>): bin

Возвращает двоичную цепочку. Входные данные — шестнадцатеричное представление строки.

bool(<bool>): bool

bool(<bool>): bool

Возвращает логическое значение. <bool> может быть ’true’, ‘false’, ‘1’ или ‘0’. Значения ‘false’ и ‘0’ эквивалентны. Значения ’true’ и ‘1’ эквивалентны.

connslots([<backend>]): integer

connslots([<backend>]): integer

Возвращает целочисленное значение, соответствующее количеству доступных мест для соединений в бэкенде, путём суммирования максимального количества соединений на всех серверах и максимального размера очереди. Вероятно, используется только с ACL.

Основная идея заключается в возможности измерения количества “свободных слотов” для соединений (соединение + очередь), чтобы всё, что превышает это количество (предполагаемое применение; см. ключевое слово “use_backend”), могло быть перенаправлено на другой бэкенд.

‘connslots’ = количество доступных слотов соединений на серверах + количество доступных слотов очереди на серверах.

Обратите внимание, что хотя “fe_conn” может использоваться, “connslots” особенно полезен в случае, когда трафик направляется на один IP-адрес, разделяясь между несколькими бэкендами (возможно, с использованием ACL для балансировки по имени) и вы хотите различать различные бэкенды и их доступные “connslots”. Кроме того, в отличие от “nbsrv”, который измеряет только серверы, которые фактически недоступны, этот метод более детализирован и учитывает количество доступных слотов соединений. См. также “queue” и “avg_queue”.

ДРУГИЕ ОГОВОРКИ И ПРИМЕЧАНИЯ: на данный момент код не учитывает динамические соединения. Кроме того, если любое из значений maxconn или maxqueue сервера равно 0, то это извлечение образца не имеет смысла, в таком случае возвращаемое значение будет -1.

cpu_calls: integer Возвращает количество вызовов задачи, обрабатывающей поток или текущий запрос, с момента её выделения. Это число сбрасывается при каждом новом запросе на том же соединении при HTTP keep-alive. Обычно это значение низкое и стабильное (около 2 вызовов для типичного простого запроса), но может стать высоким, если выполняется какая-либо обработка (сжатие, кэширование или анализ). Используется исключительно для мониторинга производительности.

cpu_ns_avg: integer Возвращает среднее количество наносекунд, затраченных на каждый вызов задачи, обрабатывающей поток или текущий запрос. Это число сбрасывается при каждом новом запросе на том же соединении при HTTP keep-alive. Это значение указывает на общую стоимость обработки запроса или соединения на каждый вызов. Нет хорошего или плохого значения, но время, затраченное на вызов, автоматически увеличивает задержку для других операций (см. lat_ns_avg ниже), и может влиять на кажущееся время ответа других соединений. Операции, такие как сжатие, сложное сопоставление по регулярным выражениям или тяжёлые операции Lua, могут напрямую влиять на это значение, и наличие его в логах облегчит выявление неисправной обработки, требующей исправления для восстановления приемлемой производительности. Примечание: это значение точно равно cpu_ns_tot делённому на cpu_calls.

cpu_ns_tot: integer Возвращает общее количество наносекунд, затраченных на каждый вызов задачи, обрабатывающей поток или текущий запрос. Это число сбрасывается при каждом новом запросе на том же соединении при HTTP keep-alive. Это значение указывает на общую стоимость обработки запроса или соединения на каждый вызов. Нет хорошего или плохого значения, но время, затраченное на вызов, автоматически увеличивает задержку для других операций (см. lat_ns_avg ниже), вызывает дополнительные затраты на машине (CPU), и может влиять на кажущееся время ответа других соединений. Операции, такие как сжатие, сложное сопоставление по регулярным выражениям или тяжёлые операции Lua, могут напрямую влиять на это значение, и наличие его в логах облегчит выявление неисправной обработки, требующей исправления для восстановления приемлемой производительности. Значение может быть искусственно высоким из-за большого количества cpu_calls при обработке множества фрагментов HTTP, поэтому зачастую предпочтительнее логировать cpu_ns_avg.

cpu_usage_grp: integer Возвращает измерённое использование CPU за последний цикл опроса, между 0 и 100, усреднённое по всем потокам текущей группы потоков. Это может использоваться для устранения неполадок и ведения журнала. Измерение чрезвычайно нестабильно, но остаётся точным при длительной нагрузке, поскольку каждый поток измеряет его на нескольких десятках до сотен запросов.

cpu_usage_proc: integer Возвращает измерённое использование CPU за последний цикл опроса, между 0 и 100, усреднённое по всем работающим потокам. Это может использоваться для устранения неполадок и ведения журнала. Измерение чрезвычайно нестабильно, но остаётся точным при длительной нагрузке, поскольку каждый поток измеряет его на нескольких десятках до сотен запросов. Это значение равно 100 минус значение, указанное в доле простоя на странице статистики и в команде “show info”.

cpu_usage_thr: integer Возвращает измерённое использование CPU за последний цикл опроса, между 0 и 100, для вызывающего потока. Это может использоваться для устранения неполадок и ведения журнала. Измерение чрезвычайно нестабильно, но остаётся точным при длительной нагрузке, поскольку измеряется на нескольких десятках до сотен запросов. Это то же самое значение, которое используется для принятия решения о принудительном закрытии соединений при чрезмерном уровне сбоев или отключении сжатия. См. также “tune.glitches.kill.cpu-usage” и “maxcompcpuusage”.

date([<offset>[,<unit>]]): integer

date([<offset>[,<unit>]]): integer

Возвращает текущую дату как число секунд с начала эпохи (с 01/01/1970).

Если указано смещение, то оно добавляется к текущей дате перед возвратом значения. Это особенно полезно для вычисления относительных дат, так как допускаются как положительные, так и отрицательные смещения. Полезно использовать вместе с преобразователем http_date.

Параметр <unit> необязателен и может быть установлен в “s” для секунд (поведение по умолчанию), “ms” для миллисекунд или “us” для микросекунд. Если указана единица измерения, возвращаемое значение — целое число, отражающее количество секунд, миллисекунд или микросекунд с эпохи, плюс смещение. Полезно, когда требуется разрешение времени менее одной секунды.

Пример:

# set an expires header to now+1 hour in every response
http-response set-header Expires %[date(3600),http_date]

# set an expires header to now+1 hour in every response, with
# millisecond granularity
http-response set-header Expires %[date(3600000,ms),http_date(0,ms)]

date_us: integer Возвращает микросекунды даты (часть “секунды” возвращается образцом date). Этот образец согласован с образцом date, поскольку берётся из той же структуры timeval.

env(<name>): string

env(<name>): string

Возвращает строку, содержащую значение переменной среды <name>. Напоминаем, что переменные среды являются специфичными для процесса и извлекаются при запуске процесса. Это может быть полезно для передачи некоторой информации следующему узлу или с использованием ACL для выполнения определённых действий при запуске процесса определённым образом.

Примеры:

# Pass the Via header to next hop with the local hostname in it
http-request add-header Via 1.1\ %[env(HOSTNAME)]

# reject cookie-less requests when the STOP environment variable is set
http-request deny if !{ req.cook(SESSIONID) -m found } { env(STOP) -m found }

fe_conn([<frontend>]): integer

fe_conn([<frontend>]): integer

Возвращает количество текущих установленных соединений на фронтенде, возможно, включая соединение, которое оценивается. Если имя фронтенда не указано, используется текущий. Также возможно проверить другой фронтенд. Может использоваться для возврата страницы с извинением перед жёсткой блокировкой или для использования определённого бэкенда для отвода новых запросов, когда ферма считается перегруженной. В основном используется с ACL, но также может применяться для передачи некоторых статистических данных серверам в заголовках HTTP. См. также извлечения образцов “dst_conn”, “be_conn”, “fe_sess_rate”.

fe_req_rate([<frontend>]): integer

fe_req_rate([<frontend>]): integer

Возвращает целое значение, соответствующее количеству запросов HTTP в секунду, отправленных на фронтенд. Это число может отличаться от “fe_sess_rate” в ситуациях, когда включено keep-alive на стороне клиента.

fe_sess_rate([<frontend>]): integer

fe_sess_rate([<frontend>]): integer

Возвращает целое значение, соответствующее скорости создания сессий на фронтенде, в количестве новых сессий в секунду. Используется с ACL для ограничения скорости входящих сессий до приемлемого диапазона, чтобы предотвратить злоупотребление сервисом на ранней стадии, например, в сочетании с другими ACL уровня 4 для вынуждения клиентов немного подождать, пока скорость не упадёт ниже порога. Также может быть полезно добавить этот элемент в журналы с помощью директивы log-format. См. также директиву “rate-limit sessions” для использования на фронтендах.

Пример:

# This frontend limits incoming mails to 10/s with a max of 100
# concurrent connections. We accept any connection below 10/s, and
# force excess clients to wait for 100 ms. Since clients are limited to
# 100 max, there cannot be more than 10 incoming mails per second.
frontend mail
    bind :25
    mode tcp
    maxconn 100
    acl too_fast fe_sess_rate ge 10
    tcp-request inspect-delay 100ms
    tcp-request content accept if ! too_fast
    tcp-request content accept if WAIT_END

hostname: string Возвращает имя хоста системы.

int(<integer>): signed integer

int(<integer>): signed integer

Возвращает знаковое целое число.

ipv4(<ipv4>): ipv4

ipv4(<ipv4>): ipv4

Возвращает IPv4.

ipv6(<ipv6>): ipv6

ipv6(<ipv6>): ipv6

Возвращает IPv6.

last_entity: string Возвращает идентификатор последней сущности, которая была оценена во время анализа потока. Это может быть завершающее правило, которое совпало, или фильтр, прервавший обработку.

Завершающее правило — это правило, завершающее оценку набора правил (например, “accept”, “deny” или “redirect”). Работает для правил запроса и ответа TCP, действующих на наборах правил “content”, а также для правил HTTP из наборов правил “http-request”, “http-response” и “http-after-response”. Устаревшие наборы правил “redirect” не поддерживаются (такая информация там не хранится), а также не поддерживаются наборы правил “tcp-request connection” и “tcp-request session”, поскольку информация хранится на уровне потока, а потоки ещё не существуют во время выполнения этих правил. В этом случае возвращаемое значение эквивалентно “last_rule_file:last_rule_line”. См. также “last_rule_file”, “last_rule_line”.

Для фильтра возвращается его идентификатор, определённый разработчиками. Если идентификатор не определён, возвращается шестнадцатеричное значение, соответствующее уникальному внутреннему идентификатору.

Основная цель этой функции — возможность указывать в журналах последнюю сущность, прервавшую обработку, для упрощения отладки проблем. Информация о сущностях может меняться со временем и не должна использоваться для других целей, кроме отладки.

Пример:

# Log the last entity, if any, and only if an error is reported
log-format "$HAPROXY_HTTP_LOG_FMT %{Q}[last_entity,when(error)]

last_rule_file: string Возвращает имя конфигурационного файла, содержащего последнее завершающее правило, сработавшее при анализе потока. Завершающее правило — это правило, завершающее оценку набора правил (например, “accept”, “deny” или “redirect”). Работает для правил запроса и ответа TCP, действующих на наборах правил “content”, а также для правил HTTP из наборов правил “http-request”, “http-response” и “http-after-response”. Устаревшие наборы правил “redirect” не поддерживаются (такая информация там не хранится), а также не поддерживаются наборы правил “tcp-request connection” и “tcp-request session”, поскольку информация хранится на уровне потока, а потоки ещё не существуют во время выполнения этих правил. Основная цель этой функции — возможность указывать в журналах, где находилось правило, вынесшее окончательное решение, чтобы помочь понять, почему запрос был отклонён, например. См. также “last_rule_line”.

last_rule_line: integer Возвращает номер строки в конфигурационном файле, где находится последнее завершающее правило, сработавшее при анализе потока. Завершающее правило — это правило, завершающее оценку набора правил (например, “accept”, “deny” или “redirect”). Работает для правил запроса и ответа TCP, действующих на наборах правил “content”, а также для правил HTTP из наборов правил “http-request”, “http-response” и “http-after-response”. Устаревшие наборы правил “redirect” не поддерживаются (такая информация там не хранится), а также не поддерживаются наборы правил “tcp-request connection” и “tcp-request session”, поскольку информация хранится на уровне потока, а потоки ещё не существуют во время выполнения этих правил. Основная цель этой функции — возможность указывать в журналах, где находилось правило, вынесшее окончательное решение, чтобы помочь понять, почему запрос был отклонён, например. См. также “last_rule_file”.

lat_ns_avg: integer Возвращает среднее количество наносекунд, затраченных между моментом пробуждения задачи, обрабатывающей поток, и моментом её фактического вызова. Это значение сбрасывается для каждого нового запроса на одном и том же соединении при HTTP keep-alive. Это значение указывает общую задержку, накладываемую на текущий запрос всеми другими запросами, обрабатываемыми параллельно, и является прямым индикатором воспринимаемой производительности из-за “шумных соседей”. Чтобы сохранить значение низким, можно уменьшить глубину очереди выполнения планировщика с помощью “tune.runqueue-depth”, сократить количество одновременно обрабатываемых событий с помощью “tune.maxpollevents”, уменьшить значение nice потока с помощью опции “nice” в строках bind или в фронтенде, включить планирование с низкой задержкой с помощью “tune.sched.low-latency” или искать другие тяжёлые запросы в журналах (те, у которых большое значение “cpu_ns_avg”), обработку которых необходимо скорректировать или исправить. Сжатие больших буферов может быть причиной, как и сложные регулярные выражения или длинные списки регулярных выражений. Примечание: это значение точно равно lat_ns_tot делённому на cpu_calls.

lat_ns_tot: integer Возвращает общее количество наносекунд, затраченных между моментом пробуждения задачи, обрабатывающей поток, и моментом её фактического вызова. Это значение сбрасывается для каждого нового запроса на одном и том же соединении при HTTP keep-alive. Это значение указывает общую задержку, накладываемую на текущий запрос всеми другими запросами, обрабатываемыми параллельно, и является прямым индикатором воспринимаемой производительности из-за “шумных соседей”. Чтобы сохранить значение низким, можно уменьшить глубину очереди выполнения планировщика с помощью “tune.runqueue-depth”, сократить количество одновременно обрабатываемых событий с помощью “tune.maxpollevents”, уменьшить значение nice потока с помощью опции “nice” в строках bind или в фронтенде, включить планирование с низкой задержкой с помощью “tune.sched.low-latency” или искать другие тяжёлые запросы в журналах (те, у которых большое значение “cpu_ns_avg”), обработку которых необходимо скорректировать или исправить. Сжатие больших буферов может быть причиной, как и сложные регулярные выражения или длинные списки регулярных выражений. Примечание: хотя может показаться интуитивно, что общая задержка складывается с временем передачи, это почти никогда не так, потому что пока задача ждёт CPU, сетевые буферы продолжают заполняться, и следующий вызов будет обрабатывать больше данных сразу. Значение может быть искусственно высоким из-за большого количества cpu_calls, например, при обработке множества фрагментов HTTP, поэтому часто предпочтительнее логировать lat_ns_avg, который является более релевантным показателем производительности.

meth(<method>): method

meth(<method>): method

Возвращает метод.

nbsrv([<backend>]): integer

nbsrv([<backend>]): integer

Возвращает целое значение, соответствующее количеству доступных серверов либо текущего бэкенда, либо указанного бэкенда. В основном используется с ACL, но также может быть полезно при добавлении в журналы. Обычно используется для переключения на альтернативный бэкенд, когда количество серверов слишком мало для обработки нагрузки. Полезно использовать для сообщения об ошибке в сочетании с “monitor fail”.

pid: integer Возвращает PID текущего процесса. В большинстве случаев это PID рабочего процесса.

prio_class: integer Возвращает класс приоритета текущего потока в режиме HTTP или соединения в режиме TCP. Значение будет тем, что установлено последним вызовом “http-request set-priority-class” или “tcp-request content set-priority-class”.

prio_offset: integer Возвращает смещение приоритета текущего потока в режиме HTTP или соединения в режиме TCP. Значение будет тем, что установлено последним вызовом “http-request set-priority-offset” или “tcp-request content set-priority-offset”.

proc: integer Всегда возвращает значение 1 (исторически оно возвращало номер вызывающего процесса).

queue([<backend>]): integer

queue([<backend>]): integer

Возвращает общее количество соединений в очередях указанного бэкенда, включая все соединения в очередях серверов. Если имя бэкенда не указано, используется текущий, но также возможно проверить другой. Полезно с ACL или для передачи статистики серверам бэкенда. Может использоваться для принятия действий при превышении известного уровня очереди, как правило, указывающего на всплеск трафика или значительное замедление на серверах. Одним из возможных действий может быть отклонение новых пользователей, но при этом принимаются старые. См. также извлечения образцов “avg_queue”, “be_conn” и “be_sess_rate”.

quic_enabled: boolean Возвращает true, если поддержка транспортного протокола QUIC была скомпилирована и если слушатели QUIC не отключены глобальным параметром “tune.quic.listen”. См. также глобальный параметр “tune.quic.listen”.

rand([<range>]): integer

rand([<range>]): integer

Возвращает случайное целое число в диапазоне из <range> возможных значений, начиная с нуля. Если диапазон не указан, по умолчанию используется 2^32, что даёт числа от 0 до 4294967295. Может быть полезно для передачи некоторых значений, необходимых для принятия решений о маршрутизации, например, или просто для отладки. Этот случайный выбор не должен использоваться в целях безопасности.

srv_conn([<backend>/]<server>): integer

srv_conn([<backend>/]<server>): integer

Возвращает целое значение, соответствующее количеству установленных соединений на указанном сервере, включая, возможно, оцениваемое соединение. Если <backend> опущен, сервер ищется в текущем бэкенде. Может использоваться для выбора конкретной фермы при заполнении одного сервера или для информирования сервера о нашем представлении количества активных соединений с ним. См. также методы извлечения “fe_conn”, “be_conn”, “queue” и “srv_conn_free”.

srv_conn_free([<backend>/]<server>): integer

srv_conn_free([<backend>/]<server>): integer

Возвращает целое значение, соответствующее количеству доступных соединений на указанном сервере, включая, возможно, оцениваемое соединение. Значение не включает места в очереди. Если <backend> опущен, сервер ищется в текущем бэкенде. Может использоваться для выбора конкретной фермы при заполнении одного сервера или для информирования сервера о нашем представлении количества активных соединений с ним. См. также методы извлечения “be_conn_free” и “srv_conn”.

ДРУГИЕ ОГОВОРКИ И ПРИМЕЧАНИЯ: если maxconn сервера равно 0, то данное извлечение образца явно не имеет смысла, в таком случае возвращаемое значение будет -1.

srv_is_up([<backend>/]<server>): boolean

srv_is_up([<backend>/]<server>): boolean

Возвращает true, если указанный сервер находится в состоянии UP, и false — если он находится в состоянии DOWN или в режиме обслуживания. Если <backend> опущен, сервер ищется в текущем бэкенде. Используется в основном для принятия решений на основе внешнего статуса, сообщённого через проверку работоспособности (например, доступность географического сайта). Другое возможное применение, которое скорее является обходным приёмом, заключается в использовании фиктивных серверов как логических переменных, которые могут быть включены или выключены через CLI, чтобы правила, зависящие от таких ACL, можно было настраивать в реальном времени.

srv_iweight([<backend>/]<server>): integer

srv_iweight([<backend>/]<server>): integer

Возвращает целое значение, соответствующее начальному весу сервера. Если <backend> опущен, сервер ищется в текущем бэкенде. См. также “srv_weight” и “srv_uweight”.

srv_queue([<backend>/]<server>): integer

srv_queue([<backend>/]<server>): integer

Возвращает целое значение, соответствующее количеству соединений, ожидающих в очереди на указанном сервере. Если <backend> опущен, сервер ищется в текущем бэкенде. Иногда может использоваться совместно с директивой “use-server” для принудительного использования заведомо более быстрого сервера при небольшой загрузке. См. также методы извлечения образца “srv_conn”, “avg_queue” и “queue”.

srv_sess_rate([<backend>/]<server>): integer

srv_sess_rate([<backend>/]<server>): integer

Возвращает целое значение, соответствующее интенсивности создания сессий на указанном сервере, в количестве новых сессий в секунду. Если <backend> опущен, сервер ищется в текущем бэкенде. В основном используется с ACL, но может быть полезно и при ведении журнала. Используется для переключения на альтернативный бэкенд когда дорогостоящий или уязвимый бэкенд достигает слишком высокой интенсивности создания сессий, либо для ограничения злоупотребления сервисом (например, предотвращение перегрузки серверов из-за латентных запросов).

Пример:

# Redirect to a separate back
acl srv1_full srv_sess_rate(be1/srv1) gt 50
acl srv2_full srv_sess_rate(be1/srv2) gt 50
use_backend be2 if srv1_full or srv2_full

srv_uweight([<backend>/]<server>): integer

srv_uweight([<backend>/]<server>): integer

Возвращает целое значение, соответствующее видимому пользователю весу сервера. Если <backend> опущен, сервер ищется в текущем бэкенде. См. также “srv_weight” и “srv_iweight”.

srv_weight([<backend>/]<server>): integer

srv_weight([<backend>/]<server>): integer

Возвращает целое значение, соответствующее текущему (или эффективному) весу сервера. Если <backend> опущен, сервер ищется в текущем бэкенде. См. также “srv_iweight” и “srv_uweight”.

stopping: boolean Возвращает TRUE, если процесс, вызывающий функцию, в настоящее время останавливается. Это может быть полезно для ведения журнала или для смягчения определённых проверок или помощи при закрытии соединений во время мягкой остановки.

str(<string>): string

str(<string>): string

Возвращает строку.

table_avl([<table>]): integer

table_avl([<table>]): integer

Возвращает общее количество доступных записей в таблице привязок текущего прокси или в указанной таблице привязок. См. также “table_cnt”.

table_cnt([<table>]): integer

table_cnt([<table>]): integer

Возвращает общее количество записей, используемых в настоящий момент в таблице привязок текущего прокси или в указанной таблице привязок. См. также “table_conn_cnt” и table_avl для других методов подсчёта записей.

term_events: string Возвращает все известные события завершения для всех сущностей, привязанных к потоку, на стороне клиента и сервера. Возвращается кортеж из семи элементов со следующей информацией:

- события завершения соединения фронтенда
- события завершения соединения мультиплексора фронтенда
- события завершения дескриптора конечной точки потока фронтенда
  (поток мультиплексора или апплет)
- события завершения потока
- события завершения дескриптора конечной точки потока бэкенда
  (поток мультиплексора или апплет)
- события завершения соединения мультиплексора бэкенда
- события завершения соединения бэкенда

На каждом уровне возвращаются первые четыре события. Если событие ещё не было зарегистрировано для конкретного уровня, возвращается пустая строка. Если события завершения не поддерживаются, возвращается “-”.

Должно использоваться только в целях отладки. Точный формат не документирован, так как может меняться в зависимости от требований разработчиков.

tgroup: integer Возвращает целое значение, соответствующее позиции группы потоков, вызывающего функцию, в диапазоне от 0 до (global.thread-groups - 1). Полезно для ведения журнала и отладки.

thread: integer Возвращает целое значение, соответствующее позиции потока, вызывающего функцию, в диапазоне от 0 до (global.nbthread-1). Полезно для ведения журнала и отладки.

txn.id32: integer Возвращает внутренний идентификатор транзакции. Это 32-битное целое число. Таким образом, его значение не абсолютно уникально, идентификаторы транзакций могут переполняться. Период переполнения зависит от интенсивности запросов. На практике это обычно не должно создавать проблем. Для получения истинно уникального идентификатора см. директиву “unique-id-format”.

txn.sess_term_state: string Возвращает состояние завершения потока TCP или HTTP, указанное в журнале. Это строка из 2 символов: конечное состояние потока, за которым следует событие, вызвавшее его завершение. Список возможных событий при разрыве соединения приведён в разделе 8.5 . Возвращается текущее значение на момент извлечения образца; оно может измениться. Кроме случаев использования с ACL в наборах правил “http-after-response” или в сообщениях журнала, значение всегда равно “–”.

Пример:

# Return a 429-Too-Many-Requests if stream timed out in queue
http-after-response set-status 429 if { txn.sess_term_state  "sQ" }

uptime: integer Возвращает время работы текущего рабочего процесса HAProxy в секундах.

uuid([<version>]): string

uuid([<version>]): string

Возвращает UUID в соответствии со стандартом RFC 9562. Если версия не указана, возвращается UUID версии 4 (полностью случайный).

Поддерживаются версии 4 и 7.

var(<var-name>[,<default>]): undefined

var(<var-name>[,<default>]): undefined

Возвращает переменную с сохранённым типом. Если переменная не задана, извлечение образца завершается неудачей, кроме случая, когда указано значение по умолчанию: тогда оно возвращается как строка. Допускаются пустые строки. Подробнее о переменных см. в разделе 2.8 .

dump_all_vars([<scope>][,<prefix>][,<delimiter>]): string

dump_all_vars([<scope>][,<prefix>][,<delimiter>]): string

Возвращает список всех переменных в указанной области видимости, с необязательной фильтрацией по префиксу имени и настраиваемым разделителем.

Формат вывода: var1=value1<delim>var2=value2<delim>…

Кодирование значений по типу:

  • Строки: заключаются в кавычки и экранируются (", \, \r, \n, \b, \0) Пример: txn.name=“John \“Doe\””
  • Бинарные данные: закодированы в шестнадцатеричном виде с префиксом ‘x’, без кавычек. Пример: txn.data=x48656c6c6f
  • Целые числа: без кавычек, десятичные. Пример: txn.count=42
  • Логические значения: без кавычек, “true” или “false”. Пример: txn.active=true
  • Адреса: без кавычек, строка IP-адреса. Пример: txn.client=192.168.1.1
  • Методы HTTP: заключённая в кавычки строка. Пример: req.method=“GET”

Аргументы:

  • <scope> (необязательно): sess, txn, req, res или proc. Если опущено, все эти области просматриваются в том же порядке, что и здесь.

  • <prefix> (необязательно): фильтрует переменные, имена которых начинаются с указанного префикса (после удаления префикса области). Примечание по производительности: при использовании фильтрации по префиксу все переменные в области всё равно просматриваются. Не следует использовать с конфигурациями, содержащими тысячи переменных.

  • <delimiter> (необязательно): строка-разделитель переменных. По умолчанию — “, " (запятая с пробелом). Может быть настроена на любую строку. Напоминание: для передачи запятых или пробелов в аргументе функции их необходимо заключить в одинарные или двойные кавычки (если выражение уже находится в кавычках, используйте другие).

Возвращаемое значение:

  • При успехе: строка, содержащая все подходящие переменные
  • При неудаче: пусто (извлечение образца завершается неудачей), если буфер вывода слишком мал. Функция не усекает вывод; она целиком завершается неудачей, чтобы не возвращать неполные данные.

Это особенно полезно для отладки, ведения журнала или экспорта состояний переменных.

Примеры:

# Dump all transaction variables
http-request return string %[dump_all_vars(txn)]

# Dump only variables starting with "user"
http-request set-header X-User-Vars "%[dump_all_vars(txn,user)]"

# Dump all process variables
http-request return string %[dump_all_vars(proc)]

# Custom delimiter (semicolon)
http-request set-header X-Vars "%[dump_all_vars(txn,,; )]"

# Force the default delimiter (comma space)
http-request set-header X-Vars "%[dump_all_vars(txn,,', ')]"

# Prefix filter with custom delimiter
http-request set-header X-Session "%[dump_all_vars(sess,user,|)]"

wait_end: boolean Это извлечение либо возвращает true, когда период проверки завершён, либо не возвращает образец. Используется только в ACL, в сочетании с анализом содержимого для предотвращения преждевременного принятия неверного решения. Может также использоваться для откладывания некоторых действий, например, задержанного отказа для определённых адресов. Поскольку оно либо останавливает оценку правил, либо немедленно возвращает true, рекомендуется использовать этот ACL последним в правиле. Обратите внимание, что предопределённый ACL “WAIT_END” всегда доступно без предварительного объявления. Этот тест был разработан для использования с анализом содержимого запроса TCP.

Примеры:

# delay every incoming request by 2 seconds
tcp-request inspect-delay 2s
tcp-request content accept if WAIT_END

# don't immediately tell bad guys they are rejected
tcp-request inspect-delay 10s
acl goodguys src 10.0.0.0/24
acl badguys  src 10.0.1.0/24
tcp-request content accept if goodguys
tcp-request content reject if badguys WAIT_END
tcp-request content reject

waiting_entity: string Возвращает идентификатор сущности, которая ожидала продолжения обработки при возникновении ошибки или тайм-аута. Это может быть правило или фильтр, например. Однако этот список не является исчерпывающим, и формат всех возможных сущностей не обязательно документирован.

Когда сущность — правило, возвращается её расположение. Это имя конфигурационного файла, содержащего правило, за которым следует номер строки, где определено это правило, разделённые двоеточием.

Для фильтра возвращается его идентификатор, определённый разработчиками. Если идентификатор не определён, возвращается шестнадцатеричное значение, соответствующее уникальному внутреннему идентификатору.

Основная цель этой функции — возможность указать в журнале сущность, блокирующую анализ потока при возникновении ошибки или тайм-аута, прервавших обработку, для упрощения отладки. Информация о сущностях может изменяться со временем и не должна использоваться для других целей, кроме отладки.

Пример:

# Log the waiting entity, if any, and only if an error is reported
log-format "$HAPROXY_HTTP_LOG_FMT %{Q}[waiting_entity,when(error)]

7.3.3. Извлечение образцов на уровне 4

Уровень 4 обычно описывает только транспортный уровень, который в HAProxy ближе всего к соединению, где ещё не доступны данные содержимого. Методы извлечения образцов, описанные здесь, применимы на уровне “tcp-request connection”, если они не требуют будущей информации. Обычно это TCP/IP-адреса и порты, а также элементы таблицы привязок, связанные с входящим соединением. Для получения значения из счётчика привязки номер счётчика может быть явно задан как 0, 1 или 2 с использованием предопределённых префиксов “sc0_”, “sc1_” или “sc2_”. Эти три предопределённых префикса можно использовать только при условии, что глобальное значение “tune.stick-counters” не превышает 3; в противном случае номер счётчика может быть указан как первый целочисленный аргумент при использовании префикса “sc_” от “sc_0” до “sc_N”, где N — (tune.stick-counters-1). Необязательно можно указать таблицу в формате “sc*”, в этом случае ключ, отслеживаемый в данный момент, будет искаться в альтернативной таблице вместо текущей отслеживаемой таблицы.

Сводка методов извлечения образцов в этом разделе и их соответствующие типы:

  Ключевое слово                                   Выходной тип
-------------------------------------------------+-------------
accept_date([<unit>])                              integer
bc.timer.connect                                   integer
bc_be_queue                                        integer
bc_dst                                             ip
bc_dst_port                                        integer
bc_err                                             integer
bc_err_name                                        string
bc_err_str                                         string
bc_glitches                                        integer
bc_http_major                                      integer
bc_nb_streams                                      integer
bc_reused                                          boolean
bc_rtt(<unit>)                                     integer
bc_rttvar(<unit>)                                  integer
bc_settings_streams_limit                          integer
bc_src                                             ip
bc_src_port                                        integer
bc_srv_queue                                       integer
be_id                                              integer
be_name                                            string
be_connect_timeout                                 integer
be_queue_timeout                                   integer
be_server_timeout                                  integer
be_tarpit_timeout                                  integer
be_tunnel_timeout                                  integer
bytes_in                                           integer
bytes_out                                          integer
cur_connect_timeout                                integer
cur_client_timeout                                 integer
cur_queue_timeout                                  integer
cur_server_timeout                                 integer
cur_tarpit_timeout                                 integer
cur_tunnel_timeout                                 integer
dst                                                ip
dst_conn                                           integer
dst_is_local                                       boolean
dst_port                                           integer
fc.timer.handshake                                 integer
fc.timer.total                                     integer
fc_dst                                             ip
fc_dst_is_local                                    boolean
fc_dst_port                                        integer
fc_err                                             integer
fc_err_name                                        string
fc_err_str                                         string
fc_fackets                                         integer
fc_glitches                                        integer
fc_http_major                                      integer
fc_lost                                            integer
fc_nb_streams                                      integer
fc_pp_authority                                    string
fc_pp_tlv(<id>)                                    string
fc_pp_unique_id                                    string
fc_rcvd_proxy                                      boolean
fc_reordering                                      integer
fc_retrans                                         integer
fc_rtt(<unit>)                                     integer
fc_rttvar(<unit>)                                  integer
fc_sacked                                          integer
fc_saved_syn                                       binary
fc_settings_streams_limit                          integer
fc_src                                             ip
fc_src_is_local                                    boolean
fc_src_port                                        integer
fc_unacked                                         integer
fe_tarpit_timeout                                  integer
fe_client_timeout                                  integer
fe_defbe                                           string
fe_id                                              integer
fe_name                                            string
req.bytes_in                                       integer
req.bytes_out                                      integer
res.bytes_in                                       integer
res.bytes_out                                      integer
res.timer.data                                     integer
sc0_bytes_in_rate([<table>])                       integer
sc0_bytes_out_rate([<table>])                      integer
sc0_clr_gpc0([<table>])                            integer
sc0_clr_gpc1([<table>])                            integer
sc0_conn_cnt([<table>])                            integer
sc0_conn_cur([<table>])                            integer
sc0_conn_rate([<table>])                           integer
sc0_get_gpc0([<table>])                            integer
sc0_get_gpc1([<table>])                            integer
sc0_get_gpt0([<table>])                            integer
sc0_glitch_cnt([<table>])                          integer
sc0_glitch_rate([<table>])                         integer
sc0_gpc0_rate([<table>])                           integer
sc0_gpc1_rate([<table>])                           integer
sc0_http_err_cnt([<table>])                        integer
sc0_http_err_rate([<table>])                       integer
sc0_http_fail_cnt([<table>])                       integer
sc0_http_fail_rate([<table>])                      integer
sc0_http_req_cnt([<table>])                        integer
sc0_http_req_rate([<table>])                       integer
sc0_inc_gpc0([<table>])                            integer
sc0_inc_gpc1([<table>])                            integer
sc0_kbytes_in([<table>])                           integer
sc0_kbytes_out([<table>])                          integer
sc0_key                                            any
sc0_sess_cnt([<table>])                            integer
sc0_sess_rate([<table>])                           integer
sc0_tracked([<table>])                             boolean
sc0_trackers([<table>])                            integer
sc1_bytes_in_rate([<table>])                       integer
sc1_bytes_out_rate([<table>])                      integer
sc1_clr_gpc0([<table>])                            integer
sc1_clr_gpc1([<table>])                            integer
sc1_conn_cnt([<table>])                            integer
sc1_conn_cur([<table>])                            integer
sc1_conn_rate([<table>])                           integer
sc1_get_gpc0([<table>])                            integer
sc1_get_gpc1([<table>])                            integer
sc1_get_gpt0([<table>])                            integer
sc1_glitch_cnt([<table>])                          integer
sc1_glitch_rate([<table>])                         integer
sc1_gpc0_rate([<table>])                           integer
sc1_gpc1_rate([<table>])                           integer
sc1_http_err_cnt([<table>])                        integer
sc1_http_err_rate([<table>])                       integer
sc1_http_fail_cnt([<table>])                       integer
sc1_http_fail_rate([<table>])                      integer
sc1_http_req_cnt([<table>])                        integer
sc1_http_req_rate([<table>])                       integer
sc1_inc_gpc0([<table>])                            integer
sc1_inc_gpc1([<table>])                            integer
sc1_kbytes_in([<table>])                           integer
sc1_kbytes_out([<table>])                          integer
sc1_key                                            any
sc1_sess_cnt([<table>])                            integer
sc1_sess_rate([<table>])                           integer
sc1_tracked([<table>])                             boolean
sc1_trackers([<table>])                            integer
sc2_bytes_in_rate([<table>])                       integer
sc2_bytes_out_rate([<table>])                      integer
sc2_clr_gpc0([<table>])                            integer
sc2_clr_gpc1([<table>])                            integer
sc2_conn_cnt([<table>])                            integer
sc2_conn_cur([<table>])                            integer
sc2_conn_rate([<table>])                           integer
sc2_get_gpc0([<table>])                            integer
sc2_get_gpc1([<table>])                            integer
sc2_get_gpt0([<table>])                            integer
sc2_glitch_cnt([<table>])                          integer
sc2_glitch_rate([<table>])                         integer
sc2_gpc0_rate([<table>])                           integer
sc2_gpc1_rate([<table>])                           integer
sc2_http_err_cnt([<table>])                        integer
sc2_http_err_rate([<table>])                       integer
sc2_http_fail_cnt([<table>])                       integer
sc2_http_fail_rate([<table>])                      integer
sc2_http_req_cnt([<table>])                        integer
sc2_http_req_rate([<table>])                       integer
sc2_inc_gpc0([<table>])                            integer
sc2_inc_gpc1([<table>])                            integer
sc2_kbytes_in([<table>])                           integer
sc2_kbytes_out([<table>])                          integer
sc2_key                                            any
sc2_sess_cnt([<table>])                            integer
sc2_sess_rate([<table>])                           integer
sc2_tracked([<table>])                             boolean
sc2_trackers([<table>])                            integer
sc_bytes_in_rate(<ctr>[,<table>])                  integer
sc_bytes_out_rate(<ctr>[,<table>])                 integer
sc_clr_gpc(<idx>,<ctr>[,<table>])                  integer
sc_clr_gpc0(<ctr>[,<table>])                       integer
sc_clr_gpc1(<ctr>[,<table>])                       integer
sc_conn_cnt(<ctr>[,<table>])                       integer
sc_conn_cur(<ctr>[,<table>])                       integer
sc_conn_rate(<ctr>[,<table>])                      integer
sc_get_gpc(<idx>,<ctr>[,<table>])                  integer
sc_get_gpc0(<ctr>[,<table>])                       integer
sc_get_gpc1(<ctr>[,<table>])                       integer
sc_get_gpt(<idx>,<ctr>[,<table>])                  integer
sc_get_gpt0(<ctr>[,<table>])                       integer
sc_glitch_cnt(<ctr>[,<table>])                     integer
sc_glitch_rate(<ctr>[,<table>])                    integer
sc_gpc0_rate(<ctr>[,<table>])                      integer
sc_gpc1_rate(<ctr>[,<table>])                      integer
sc_gpc_rate(<idx>,<ctr>[,<table>])                 integer
sc_http_err_cnt(<ctr>[,<table>])                   integer
sc_http_err_rate(<ctr>[,<table>])                  integer
sc_http_fail_cnt(<ctr>[,<table>])                  integer
sc_http_fail_rate(<ctr>[,<table>])                 integer
sc_http_req_cnt(<ctr>[,<table>])                   integer
sc_http_req_rate(<ctr>[,<table>])                  integer
sc_inc_gpc(<idx>,<ctr>[,<table>])                  integer
sc_inc_gpc0(<ctr>[,<table>])                       integer
sc_inc_gpc1(<ctr>[,<table>])                       integer
sc_kbytes_in(<ctr>[,<table>])                      integer
sc_kbytes_out(<ctr>[,<table>])                     integer
sc_key(<ctr>)                                      any
sc_sess_cnt(<ctr>[,<table>])                       integer
sc_sess_rate(<ctr>[,<table>])                      integer
sc_tracked(<ctr>[,<table>])                        boolean
sc_trackers(<ctr>[,<table>])                       integer
so_id                                              integer
so_name                                            string
src                                                ip
src_bytes_in_rate([<table>])                       integer
src_bytes_out_rate([<table>])                      integer
src_clr_gpc(<idx>[,<table>])                       integer
src_clr_gpc0([<table>])                            integer
src_clr_gpc1([<table>])                            integer
src_conn_cnt([<table>])                            integer
src_conn_cur([<table>])                            integer
src_conn_rate([<table>])                           integer
src_get_gpc(<idx>[,<table>])                       integer
src_get_gpc0([<table>])                            integer
src_get_gpc1([<table>])                            integer
src_get_gpt(<idx>[,<table>])                       integer
src_get_gpt0([<table>])                            integer
src_glitch_cnt([<table>])                          integer
src_glitch_rate([<table>])                         integer
src_gpc0_rate([<table>])                           integer
src_gpc1_rate([<table>])                           integer
src_gpc_rate(<idx>[,<table>])                      integer
src_http_err_cnt([<table>])                        integer
src_http_err_rate([<table>])                       integer
src_http_fail_cnt([<table>])                       integer
src_http_fail_rate([<table>])                      integer
src_http_req_cnt([<table>])                        integer
src_http_req_rate([<table>])                       integer
src_inc_gpc(<idx>[,<table>])                       integer
src_inc_gpc0([<table>])                            integer
src_inc_gpc1([<table>])                            integer
src_is_local                                       boolean
src_kbytes_in([<table>])                           integer
src_kbytes_out([<table>])                          integer
src_port                                           integer
src_sess_cnt([<table>])                            integer
src_sess_rate([<table>])                           integer
src_updt_conn_cnt([<table>])                       integer
srv_id                                             integer
srv_name                                           string
txn.conn_retries                                   integer
txn.redispatched                                   boolean
-------------------------------------------------+-------------

Подробный список:

accept_date([<unit>]): integer

accept_date([<unit>]): integer

Точная дата получения соединения HAProxy (которая может незначительно отличаться от даты, зафиксированной на сетевом уровне, если соединение ожидало в очереди входящих соединений системы). Обычно это та же дата, которая может появляться в журнале любого промежуточного брандмауэра. При использовании в режиме HTTP поле accept_date будет сброшено на первый момент готовности соединения к получению нового запроса (конец предыдущего ответа для HTTP/1, сразу после предыдущего запроса для HTTP/2).

Возвращает значение в секундах с эпохи.

<unit> необязателен и может быть установлен в “s” для секунд (поведение по умолчанию), “ms” для миллисекунд или “us” для микросекунд. Если указана единица измерения, возвращаемое значение — целое число, отражающее количество секунд, миллисекунд или микросекунд с эпохи. Полезно, когда требуется разрешение времени менее одной секунды.

bc.timer.connect: integer Полное время установления соединения TCP с сервером. Соответствует %Tc в log-format и выражается в миллисекундах (ms). Подробнее см. раздел 8.4 «Временные события».

bc_be_queue: integer Число потоков, извлечённых из очереди, пока поток ожидал свободного места для соединения с целевым бэкендом. Эквивалентно %bq в log-format.

bc_dst: ip IP-адрес назначения соединения на стороне сервера: адрес сервера, к которому подключился HAProxy. Имеет тип IP и работает с таблицами IPv4 и IPv6. В таблицах IPv6 адрес IPv4 отображается в соответствующий адрес IPv6 согласно RFC 4291.

bc_dst_port: integer Возвращает целочисленное значение порта назначения TCP для соединения на стороне сервера: порта, к которому подключился HAProxy.

bc_err: integer Возвращает ID ошибки, которая могла возникнуть в текущем соединении с бэкендом. Полный список кодов ошибок и соответствующих сообщений приведён в описании метода извлечения “fc_err_str”.

bc_err_name: string Возвращает внутреннее имя ошибки, описывающей проблему в соединении с бэкендом, которая привела к сбою соединения. Строка состоит из одного слова и пуста, если ошибки нет. Соответствует столбцу “name” таблицы в описании ключевого слова “fc_err_str”.

bc_err_str: string Возвращает сообщение об ошибке, описывающее проблему в текущем соединении с бэкендом, которая привела к сбою соединения. Полный список кодов ошибок и соответствующих сообщений приведён в описании метода извлечения “fc_err_str”.

bc_glitches: integer Возвращает число протокольных сбоев, зарегистрированных в соединении с бэкендом. Обычно это нарушения протокола и мелкие аномалии, указывающие на неисправный сервер или сервер с некорректным поведением, который может создавать проблемы в инфраструктуре (например, вызывать преждевременное прекращение соединений или частые повторные согласования TLS). Причиной также могут быть слишком большие ответы, не помещающиеся в одном буфере, что объясняет ошибки HTTP 502. В идеале следует поддерживать это число равным нулю, но обычно допустимо очень малое значение по сравнению с общим числом запросов. Как правило, эти значения не следует считать тревожными (особенно небольшие), хотя резкий скачок может указывать на аномалию. Эту метрику измеряют не все мультиплексоры протоколов; единственный способ получить подробности о событиях — включить трассировку для записи всех обменов.

bc_http_major: integer Возвращает основной номер версии кодирования HTTP в соединении с бэкендом: 1 для HTTP/0.9 — HTTP/1.1 или 2 для HTTP/2. Значение определяется кодированием на линии, а не версией, указанной в заголовке запроса.

bc_nb_streams: integer Возвращает число потоков, открытых в соединении с бэкендом.

bc_reused: boolean Возвращает true, если передача выполнялась через повторно использованное соединение с бэкендом.

bc_rtt(<unit>): integer

bc_rtt(<unit>): integer

Возвращает время приёма-передачи (RTT), измеренное ядром для соединения с бэкендом. Аргумент <unit> необязателен; единица измерения по умолчанию — миллисекунды. <unit> может принимать значение “ms” для миллисекунд или “us” для микросекунд. Если соединение с сервером не установлено, не использует TCP или операционная система не поддерживает TCP_INFO (например, ядра Linux до 2.4), извлечение образца завершается неудачей.

bc_rttvar(<unit>): integer

bc_rttvar(<unit>): integer

Возвращает вариацию времени приёма-передачи (RTT), измеренную ядром для соединения с бэкендом. Аргумент <unit> необязателен; единица измерения по умолчанию — миллисекунды. <unit> может принимать значение “ms” для миллисекунд или “us” для микросекунд. Если соединение с сервером не установлено, не использует TCP или операционная система не поддерживает TCP_INFO (например, ядра Linux до 2.4), извлечение образца завершается неудачей.

bc_settings_streams_limit: integer Возвращает максимальное число потоков, разрешённых в соединении с бэкендом. Для соединений TCP и HTTP/1.1 оно всегда равно 1. Для других протоколов зависит от параметров, согласованных с сервером.

bc_src: ip IP-адрес источника соединения на стороне сервера: адрес, с которого HAProxy подключился к серверу. Имеет тип IP и работает с таблицами IPv4 и IPv6. В таблицах IPv6 адреса IPv4 отображаются в соответствующие адреса IPv6 согласно RFC 4291.

bc_src_port: integer Возвращает целочисленное значение исходного порта TCP для соединения на стороне сервера: порта, с которого подключился HAProxy.

bc_srv_queue: integer Число потоков, извлечённых из очереди, пока поток ожидал свободного места для соединения с целевым сервером. Эквивалентно %sq в log-format.

be_id: integer Возвращает целое число с id текущего бэкенда. Можно использовать во фронтендах при обработке ответов, чтобы определить, какой бэкенд обработал запрос. При использовании во фронтенде, если бэкенд не использовался, возвращает id текущего фронтенда. Также можно использовать в наборе правил tcp-check или http-check.

be_connect_timeout: integer Возвращает настроенное значение тайм-аута подключения для текущего бэкенда в миллисекундах. Этот тайм-аут может быть переопределён правилом “set-timeout”. См. также “cur_connect_timeout”.

be_name: string Возвращает строку с именем текущего бэкенда. Можно использовать во фронтендах при обработке ответов, чтобы определить, какой бэкенд обработал запрос. При использовании во фронтенде, если бэкенд не использовался, возвращает имя текущего фронтенда. Также можно использовать в наборе правил tcp-check или http-check.

be_queue_timeout: integer Возвращает настроенное значение тайм-аута ожидания в очереди для текущего бэкенда в миллисекундах. Этот тайм-аут может быть переопределён правилом “set-timeout”. См. также “cur_queue_timeout”.

be_server_timeout: integer Возвращает настроенное значение тайм-аута сервера для текущего бэкенда в миллисекундах. Этот тайм-аут может быть переопределён правилом “set-timeout”. См. также “cur_server_timeout”.

be_tarpit_timeout: integer Возвращает настроенное значение тайм-аута ожидания в очереди для текущего бэкенда в миллисекундах. Этот тайм-аут может быть переопределён правилом “set-timeout”. См. также “cur_tarpit_timeout”.

be_tunnel_timeout: integer Возвращает настроенное значение тайм-аута туннеля для текущего бэкенда в миллисекундах. Этот тайм-аут может быть переопределён правилом “set-timeout”. См. также “cur_tunnel_timeout”.

bytes_in: integer См. “req.bytes_in”.

bytes_out: integer См. “res.bytes_in”.

cur_connect_timeout: integer Возвращает текущий тайм-аут подключения для потока в миллисекундах. По умолчанию он равен be_connect_timeout, если не применено правило “set-timeout”. См. также “be_connect_timeout”.

cur_client_timeout: integer Возвращает текущий тайм-аут клиента для потока в миллисекундах. По умолчанию он равен fe_client_timeout, если не применено правило “set-timeout”. См. также “fe_client_timeout”.

cur_queue_timeout: integer Возвращает текущий тайм-аут ожидания в очереди для потока в миллисекундах. По умолчанию он равен be_queue_timeout, если не применено правило “set-timeout”. См. также “be_queue_timeout”.

cur_server_timeout: integer Возвращает текущий тайм-аут сервера для потока в миллисекундах. По умолчанию он равен be_server_timeout, если не применено правило “set-timeout”. См. также “be_server_timeout”.

cur_tarpit_timeout: integer Возвращает текущий тайм-аут ловушки соединений (tarpit) для потока в миллисекундах. По умолчанию он равен fe_tarpit_timeout/be_tarpit_timeout, если не применено правило “set-timeout”. См. также “fe_tarpit_timeout” и “be_tarpit_timeout”.

cur_tunnel_timeout: integer Возвращает текущий тайм-аут туннеля для потока в миллисекундах. По умолчанию он равен be_tunnel_timeout, если не применено правило “set-timeout”. См. также “be_tunnel_timeout”.

dst: ip IP-адрес назначения соединения на стороне клиента: адрес, к которому подключился клиент. Этот адрес может изменяться любыми правилами tcp/http. Может быть полезен в прозрачном режиме. Имеет тип IP и работает с таблицами IPv4 и IPv6. В таблицах IPv6 адрес IPv4 отображается в соответствующий адрес IPv6 согласно RFC 4291. Если входящее соединение прошло через преобразование адресов или перенаправление с отслеживанием соединений, возвращается исходный адрес назначения до перенаправления. В системах Linux источник и назначение иногда могут поменяться местами, если задан sysctl nf_conntrack_tcp_loose: запоздалый ответ может вновь открыть соединение, закрытое по тайм-ауту, и поменять представление о том, какая сторона является источником, а какая — назначением.

dst_conn: integer Возвращает целочисленное значение числа установленных соединений на том же сокете, включая проверяемое соединение. Обычно используется с ACL, но может также передаваться серверам в заголовке HTTP или в журналах. Позволяет вернуть страницу с сообщением о недоступности перед жёсткой блокировкой либо использовать определённый бэкенд для обработки новых запросов, когда сокет считается насыщенным. Это позволяет назначать разные пределы разным портам или адресам прослушивания. См. также методы извлечения “fe_conn” и “be_conn”.

dst_is_local: boolean Возвращает true, если адрес назначения входящего соединения принадлежит локальной системе, или false, если адреса в системе нет, то есть соединение перехвачено в прозрачном режиме. Может быть полезен для применения одних правил по умолчанию к пересылаемому трафику, а других — к трафику, направленному на действительный адрес машины. Например, страницу статистики можно выдавать только по этому адресу или локально перенаправлять доступ SSH. Проверка требует нескольких системных вызовов, поэтому лучше выполнять её только один раз на соединение.

dst_port: integer Возвращает целочисленное значение порта назначения TCP для соединения на стороне клиента: порта, к которому подключился клиент. Этот адрес может изменяться любыми правилами tcp/http. Это может использоваться в прозрачном режиме, при назначении динамических портов некоторым клиентам на весь сеанс приложения, для привязки всех пользователей к одному серверу или для передачи серверу порта назначения в заголовке HTTP.

fc.timer.handshake: integer Общее время приёма соединения tcp и выполнения рукопожатий низкоуровневых протоколов. Сейчас это proxy-protocol и SSL. Эквивалентно %Th в log-format. Значение указывается в миллисекундах (ms). Подробнее см. раздел 8.4 «Времена событий».

fc.timer.total: integer Общая длительность потока: от момента его приёма прокси до закрытия обоих концов. Эквивалентно %Tt в log-format. Значение указывается в миллисекундах (ms). Подробнее см. раздел 8.4 «Времена событий».

fc_dst: ip Исходный IP-адрес назначения соединения на стороне клиента. Этот адрес могут изменять только правила “tcp-request connection”. Подробнее см. “dst”.

fc_dst_is_local: boolean Возвращает true, если исходный адрес назначения входящего соединения принадлежит локальной системе, или false, если адреса в системе нет. Подробнее см. “dst_is_local”.

fc_dst_port: integer Возвращает целочисленное значение исходного порта назначения TCP для соединения на стороне клиента. Этот адрес могут изменять только правила “tcp-request connection”. Подробнее см. “dst-port”.

fc_err: integer Возвращает ID ошибки, которая могла возникнуть в текущем соединении. Любое строго положительное значение этого метода извлечения означает, что соединение не удалось и будет выведена запись об ошибке в журнал (см. раздел 8.2.5 ). Полный список кодов ошибок и соответствующих сообщений приведён в описании метода извлечения “fc_err_str”.

fc_err_name: string Возвращает внутреннее имя ошибки, описывающей проблему в соединении с фронтендом, которая привела к сбою соединения. Строка состоит из одного слова и пуста, если ошибки нет. Соответствует столбцу “name” таблицы в описании ключевого слова “fc_err_str”.

fc_err_str: string Возвращает сообщение об ошибке, описывающее проблему в текущем соединении, которая привела к сбою соединения. Эта строка соответствует части “message” формата записи ошибки в журнале (см. раздел 8.2.5 ). Полный список кодов ошибок и соответствующих сообщений приведён ниже:

  +----+------------------+-------------------------------------------------------------------------+
  | ID | имя              | сообщение                                                               |
  +----+------------------+-------------------------------------------------------------------------+
  | 0  | -                | "Success"                                                               |
  | 1  | CONF_FDLIM       | "Reached configured maxconn value"                                      |
  | 2  | PROC_FDLIM       | "Too many sockets on the process"                                       |
  | 3  | SYS_FDLIM        | "Too many sockets on the system"                                        |
  | 4  | SYS_MEMLIM       | "Out of system buffers"                                                 |
  | 5  | NOPROTO          | "Protocol or address family not supported"                              |
  | 6  | SOCK_ERR         | "General socket error"                                                  |
  | 7  | PORT_RANGE       | "Source port range exhausted"                                           |
  | 8  | CANT_BIND        | "Can't bind to source address"                                          |
  | 9  | FREE_PORTS       | "Out of local source ports on the system"                               |
  | 10 | ADDR_INUSE       | "Local source address already in use"                                   |
  | 11 | PRX_EMPTY        | "Connection closed while waiting for PROXY protocol header"             |
  | 12 | PRX_ABORT        | "Connection error while waiting for PROXY protocol header"              |
  | 13 | PRX_TIMEOUT      | "Timeout while waiting for PROXY protocol header"                       |
  | 14 | PRX_TRUNCATED    | "Truncated PROXY protocol header received"                              |
  | 15 | PRX_NOT_HDR      | "Received something which does not look like a PROXY protocol header"   |
  | 16 | PRX_BAD_HDR      | "Received an invalid PROXY protocol header"                             |
  | 17 | PRX_BAD_PROTO    | "Received an unhandled protocol in the PROXY protocol header"           |
  | 18 | CIP_EMPTY        | "Connection closed while waiting for NetScaler Client IP header"        |
  | 19 | CIP_ABORT        | "Connection error while waiting for NetScaler Client IP header"         |
  | 20 | CIP_TIMEOUT      | "Timeout while waiting for a NetScaler Client IP header"                |
  | 21 | CIP_TRUNCATED    | "Truncated NetScaler Client IP header received"                         |
  | 22 | CIP_BAD_MAGIC    | "Received an invalid NetScaler Client IP magic number"                  |
  | 23 | CIP_BAD_PROTO    | "Received an unhandled protocol in the NetScaler Client IP header"      |
  | 24 | SSL_EMPTY        | "Connection closed during SSL handshake"                                |
  | 25 | SSL_ABORT        | "Connection error during SSL handshake"                                 |
  | 26 | SSL_TIMEOUT      | "Timeout during SSL handshake"                                          |
  | 27 | SSL_TOO_MANY     | "Too many SSL connections"                                              |
  | 28 | SSL_NO_MEM       | "Out of memory when initializing an SSL connection"                     |
  | 29 | SSL_RENEG        | "Rejected a client-initiated SSL renegotiation attempt"                 |
  | 30 | SSL_CA_FAIL      | "SSL client CA chain cannot be verified"                                |
  | 31 | SSL_CRT_FAIL     | "SSL client certificate not trusted"                                    |
  | 32 | SSL_MISMATCH     | "Server presented an SSL certificate different from the configured one" |
  | 33 | SSL_MISMATCH_SNI | "Server presented an SSL certificate different from the expected one"   |
  | 34 | SSL_HANDSHAKE    | "SSL handshake failure"                                                 |
  | 35 | SSL_HANDSHAKE_HB | "SSL handshake failure after heartbeat"                                 |
  | 36 | SSL_KILLED_HB    | "Stopped a TLSv1 heartbeat attack (CVE-2014-0160)"                      |
  | 37 | SSL_NO_TARGET    | "Attempt to use SSL on an unknown target (internal error)"              |
  | 38 | SSL_EARLY_FAILED | "Server refused early data"                                             |
  | 39 | SOCKS4_SEND      | "SOCKS4 Proxy write error during handshake"                             |
  | 40 | SOCKS4_RECV      | "SOCKS4 Proxy read error during handshake"                              |
  | 41 | SOCKS4_DENY      | "SOCKS4 Proxy deny the request"                                         |
  | 42 | SOCKS4_ABORT     | "SOCKS4 Proxy handshake aborted by server"                              |
  | 43 | SSL_FATAL        | "SSL fatal error"                                                       |
  | 44 | REVERSE          | "Reverse connect failure"                                               |
  | 45 | POLLERR          | "Poller reported POLLERR"                                               |
  | 46 | EREFUSED         | "ECONNREFUSED returned by OS"                                           |
  | 47 | ERESET           | "ECONNRESET returned by OS"                                             |
  | 48 | EUNREACH         | "ENETUNREACH returned by OS"                                            |
  | 49 | ENOMEM           | "ENOMEM returned by OS"                                                 |
  | 50 | EBADF            | "EBADF returned by OS"                                                  |
  | 51 | EFAULT           | "EFAULT returned by OS"                                                 |
  | 52 | EINVAL           | "EINVAL returned by OS"                                                 |
  | 53 | ENCONN           | "ENCONN returned by OS"                                                 |
  | 54 | ENSOCK           | "ENSOCK returned by OS"                                                 |
  | 55 | ENOBUFS          | "ENOBUFS returned by OS"                                                |
  | 56 | EPIPE            | "EPIPE returned by OS"                                                  |
  +----+------------------+-------------------------------------------------------------------------+

fc_fackets: integer Возвращает счётчик fack, измеренный ядром для соединения с клиентом. Если соединение с сервером не установлено, соединение не использует TCP или операционная система не поддерживает TCP_INFO (например, ядра Linux до 2.4), извлечение образца завершается неудачей.

fc_glitches: integer Возвращает число протокольных сбоев, зарегистрированных в соединении с фронтендом. Обычно это нарушения протокола и мелкие аномалии, указывающие на неисправный клиент или клиент с некорректным поведением, который может создавать проблемы в инфраструктуре: например, излишние ошибки в журналах или множество преждевременно прекращённых соединений, вызывающих частые повторные согласования TLS. Причиной также могут быть слишком большие запросы, не помещающиеся в одном буфере, что объясняет ошибки HTTP 400. В идеале следует поддерживать это число равным нулю, хотя некоторые браузеры, проверяющие границы допустимого поведения протокола, могут время от времени увеличивать его. Как правило, эти значения не следует считать тревожными (особенно небольшие), хотя резкий скачок может указывать на аномалию. Большие значения (сотни или тысячи на соединение либо столько же, сколько запросов) могут указывать на специально созданный клиент, который пытается идентифицировать стек протоколов или атаковать его. Эту метрику измеряют не все мультиплексоры протоколов; единственный способ получить подробности о событиях — включить трассировку для записи всех обменов.

fc_http_major: integer Показывает основной номер версии кодирования HTTP в клиентском соединении: 1 для HTTP/0.9 — HTTP/1.1 или 2 для HTTP/2. Значение определяется кодированием на линии, а не версией, указанной в заголовке запроса.

fc_lost: integer Если соединение не использует ни TCP, ни QUIC, извлечение образца завершается неудачей. Для QUIC возвращает число потерянных пакетов QUIC в соединении с клиентом. Для TCP возвращает счётчик lost, измеренный ядром для соединения с клиентом. Если соединение с сервером не установлено или операционная система не поддерживает TCP_INFO (например, ядра Linux до 2.4), извлечение образца завершается неудачей.

fc_nb_streams: integer Возвращает число потоков, открытых в соединении с фронтендом.

fc_pp_authority: string Возвращает первый TLV authority, отправленный клиентом в заголовке протокола PROXY, если он есть.

fc_pp_tlv(<id>): string

fc_pp_tlv(<id>): string

Возвращает значение TLV для указанного ID TLV. ID должен быть числом от 0 до 255 либо одним из следующих поддерживаемых символьных имён, соответствующих суффиксам констант TLV в спецификации PPv2: “ALPN”: PP2_TYPE_ALPN, “AUTHORITY”: PP2_TYPE_AUTHORITY, “CRC32”: PP2_TYPE_CRC32C, “NETNS”: PP2_TYPE_NETNS, “NOOP: PP2_TYPE_NOOP”, “SSL”: PP2_TYPE_SSL, “SSL_CIPHER”: PP2_SUBTYPE_SSL_CIPHER, “SSL_CN”: PP2_SUBTYPE_SSL_CN, “SSL_KEY_ALG”: PP2_SUBTYPE_SSL_KEY_ALG, “SSL_SIG_ALG”: PP2_SUBTYPE_SSL_SIG_ALG, “SSL_VERSION”: PP2_SUBTYPE_SSL_VERSION, “UNIQUE_ID”: PP2_TYPE_UNIQUE_ID.

Полученное значение должно быть не длиннее 1024 байт. Это ограничение предотвращает потенциальные атаки DoS. Для значений длиной не более 256 байт можно использовать пул памяти. Поэтому для оптимальной производительности следует ограничивать длину отправляемых значений 256 байтами.

В отличие от fc_pp_authority и fc_pp_unique_id, fc_pp_tlv может перебирать все вхождения запрошенного TLV при наличии повторяющихся ID TLV. Порядок перебора соответствует расположению в заголовке протокола PROXY. Однако, как правило, следует избегать опоры на повторяющиеся значения, поскольку TLV обычно считаются уникальными. Повторяющиеся ID TLV обычно указывают на ошибку у отправителя заголовка протокола PROXY.

fc_pp_unique_id: string Возвращает первый TLV unique ID, отправленный клиентом в заголовке протокола PROXY, если он есть.

fc_rcvd_proxy: boolean Возвращает true, если клиент начал соединение с заголовка протокола PROXY.

fc_reordering: integer Если соединение не использует ни TCP, ни QUIC, извлечение образца завершается неудачей. Для QUIC возвращает число пакетов QUIC, пришедших не по порядку, в соединении с клиентом. Для TCP возвращает счётчик reordering, измеренный ядром для соединения с клиентом. Если соединение с сервером не установлено или операционная система не поддерживает TCP_INFO (например, ядра Linux до 2.4), извлечение образца завершается неудачей.

fc_retrans: integer Возвращает счётчик retransmits, измеренный ядром для соединения с клиентом. Если соединение с сервером не установлено, соединение не использует TCP или операционная система не поддерживает TCP_INFO (например, ядра Linux до 2.4), извлечение образца завершается неудачей.

fc_rtt(<unit>): integer

fc_rtt(<unit>): integer

Если соединение не использует ни TCP, ни QUIC, извлечение образца завершается неудачей. Для QUIC возвращает сглаженное время приёма-передачи для соединения с клиентом. Для TCP возвращает время приёма-передачи (RTT), измеренное ядром для соединения с клиентом. Аргумент <unit> необязателен; единица измерения по умолчанию — миллисекунды. <unit> может принимать значение “ms” для миллисекунд или “us” для микросекунд. Если соединение с сервером не установлено или операционная система не поддерживает TCP_INFO (например, ядра Linux до 2.4), извлечение образца завершается неудачей.

fc_rttvar(<unit>): integer

fc_rttvar(<unit>): integer

Если соединение не использует ни TCP, ни QUIC, извлечение образца завершается неудачей. Для QUIC возвращает вариацию сглаженного времени приёма-передачи для соединения с клиентом. Для TCP возвращает вариацию времени приёма-передачи (RTT), измеренную ядром для соединения с клиентом. Аргумент <unit> необязателен; единица измерения по умолчанию — миллисекунды. <unit> может принимать значение “ms” для миллисекунд или “us” для микросекунд. Если соединение с сервером не установлено или операционная система не поддерживает TCP_INFO (например, ядра Linux до 2.4), извлечение образца завершается неудачей.

fc_sacked: integer Возвращает счётчик sacked, измеренный ядром для соединения с клиентом. Если соединение с сервером не установлено, соединение не использует TCP или операционная система не поддерживает TCP_INFO (например, ядра Linux до 2.4), извлечение образца завершается неудачей.

fc_saved_syn: binary Возвращает копию пакета SYN, сохранённого системой во время установления входящего соединения. Требуется параметр “tcp-ss” в строке “bind” и ядро Linux версии не ниже 4.3. При “tcp-ss”, равном 1, присутствуют только заголовки IP и TCP. При “tcp-ss”, равном 2, перед заголовком IP также присутствует заголовок Ethernet; его можно использовать, например, для контроля или записи в журнал адреса MAC источника или VLAN. Сохранение SYN не гарантируется. Например, при использовании SYN cookies пакет SYN не сохраняется, а соединение устанавливается по соответствующему пакету ACK. Кроме того, система не гарантирует сохранение копии после первого чтения. Поэтому настоятельно рекомендуется скопировать её в переменную с областью действия “sess” из правила “tcp-request connection” и для дальнейших операций использовать только эту переменную. На интерфейсе обратной петли система создаёт фиктивный 14-байтовый заголовок ethernet: и адрес источника, и адрес назначения равны нулю, задан только протокол. При отладке удобно преобразовать такие образцы в шестнадцатеричную форму преобразователем “hex”. Пример (ниже поля вручную разделены и снабжены комментариями):

frontend test
    mode http
    bind :::4445 tcp-ss 2
    tcp-request connection set-var(sess.syn) fc_saved_syn
    http-request return status 200 content-type text/plain \
                 lf-string "%[var(sess.syn),hex]\n"

$ curl '0:4445'
000000000000 000000000000 0800 \  # MAC_DST MAC_SRC PROTO=IPv4
4500003C0A65400040063255       \  # IPv4 header, proto=6 (TCP)
7F000001 7F000001              \  # IP_SRC=127.0.0.1 IP_DST=127.0.0.1
E1F2 115D 01AF4E3E 00000000    \  # TCP_SPORT=57842 TCP_DPORT=4445, SEQ
A0 02 FFD7 FE300000            \  # OPT_LEN=20 TCP_FLAGS=SYN WIN=65495
0204FFD70402080A01C2A71A0000000001030307 # MSS=65495, TS, SACK, WSCALE 7

$ curl '[::1]:4445'
000000000000 000000000000 86DD   \ # MAC_DST MAC_SRC PROTO=IPv6
6008018F00280640                 \ # IPv6 header, proto=6 (TCP)
00000000000000000000000000000001 \ # SRC=::1
00000000000000000000000000000001 \ # DST=::1
9758 115D B5511F5D 00000000      \ # TCP_SPORT=38744 TCP_DPORT=4445, SEQ
A0 02 FFC4 00300000              \  # OPT_LEN=20 TCP_FLAGS=SYN WIN=65476
0204FFC40402080A9C231D680000000001030307 # MSS=65476, TS, SACK, WSCALE 7

Преобразователь “bytes()” помогает извлечь из пакета отдельные поля. be2dec() также позволяет читать фрагменты и выводить их как целые числа. Для более точного извлечения см. преобразователи “eth.XXX”.

Пример со входными данными IPv4:

frontend test
    mode http
    bind :4445 tcp-ss 2
    tcp-request connection set-var(sess.syn) fc_saved_syn
    http-request return status 200 content-type text/plain lf-string \
                 "mac_dst=%[var(sess.syn),eth.dst,hex] \
                  mac_src=%[var(sess.syn),eth.src,hex] \
                  proto=%[var(sess.syn),eth.proto,bytes(6),be2hex(,2)] \
                  ipv4h=%[var(sess.syn),eth.data,bytes(0,12),hex] \
                  ipv4_src=%[var(sess.syn),eth.data,ip.src] \
                  ipv4_dst=%[var(sess.syn),eth.data,ip.dst] \
                  tcp_spt=%[var(sess.syn),eth.data,ip.data,tcp.src] \
                  tcp_dpt=%[var(sess.syn),eth.data,ip.data,tcp.dst] \
                  tcp_win=%[var(sess.syn),eth.data,ip.data,tcp.win] \
                  tcp_opt=%[var(sess.syn),eth.data,ip.data,bytes(20),hex]\n"

$ curl '0:4445'
mac_dst=000000000000 mac_src=000000000000 proto=0800 \
ipv4h=4500003CC9B7400040067302 ipv4_src=127.0.0.1 ipv4_dst=127.0.0.1 \
tcp_spt=43970 tcp_dpt=4445 tcp_win=65495 \
tcp_opt=0204FFD70402080A01DC0D410000000001030307

См. также действие “set-var” и преобразователи “be2dec”, “bytes”, “hex”, “eth.XXX”, “ip.XXX” и “tcp.XXX”.

fc_settings_streams_limit: integer Возвращает максимальное число потоков, разрешённых в соединении с фронтендом. Для соединений TCP и HTTP/1.1 оно всегда равно 1. Для других протоколов зависит от параметров, согласованных с клиентом.

fc_src: ip Исходный IP-адрес источника соединения на стороне клиента. Этот адрес могут изменять только правила “tcp-request connection”. Подробнее см. “src”.

fc_src_is_local: boolean Возвращает true, если адрес источника входящего соединения принадлежит локальной системе, или false, если адреса в системе нет. Подробнее см. “src_is_local”.

fc_src_port: integer Возвращает целочисленное значение исходного порта TCP для соединения на стороне клиента. Этот адрес могут изменять только правила “tcp-request connection”. Подробнее см. “src-port”.

fc_unacked: integer Возвращает счётчик unacked, измеренный ядром для соединения с клиентом. Если соединение с сервером не установлено, соединение не использует TCP или операционная система не поддерживает TCP_INFO (например, ядра Linux до 2.4), извлечение образца завершается неудачей.

fe_client_timeout: integer Возвращает настроенное значение тайм-аута клиента для текущего фронтенда в миллисекундах. Этот тайм-аут может быть переопределён правилом “set-timeout”.

fe_defbe: string Возвращает строку с именем бэкенда по умолчанию для фронтенда. Можно использовать во фронтендах, чтобы определить, какой бэкенд будет обрабатывать запросы по умолчанию.

fe_id: integer Возвращает целое число с id текущего фронтенда. Можно использовать в бэкендах, чтобы определить, из какого фронтенда они вызваны, или привязать всех пользователей, пришедших через один фронтенд, к одному серверу.

fe_name: string Возвращает строку с именем текущего фронтенда. Можно использовать в бэкендах, чтобы определить, из какого фронтенда они вызваны, или привязать всех пользователей, пришедших через один фронтенд, к одному серверу.

fe_tarpit_timeout: integer Возвращает настроенное значение тайм-аута ловушки соединений (tarpit) для текущего фронтенда в миллисекундах. Этот тайм-аут может быть переопределён правилом “set-timeout”.

req.bytes_in: integer Возвращает число байт, полученных от клиента. Значение соответствует данным, полученным HAProxy, включая некоторые заголовки и служебные данные внутреннего кодирования. Сжатие запроса не влияет на это значение.

req.bytes_out: integer Возвращает число байт, отправленных серверу. Значение соответствует данным, отправленным HAProxy, включая некоторые заголовки и служебные данные внутреннего кодирования. Сжатие запроса влияет на это значение.

res.bytes_in: integer Возвращает число байт, полученных от сервера. Значение соответствует данным, полученным HAProxy, включая некоторые заголовки и служебные данные внутреннего кодирования. Сжатие ответа не влияет на это значение.

res.bytes_out: integer Возвращает число байт, отправленных клиенту. Значение соответствует данным, отправленным HAProxy, включая некоторые заголовки и служебные данные внутреннего кодирования. Сжатие ответа влияет на это значение.

res.timer.data: integer Общее время передачи тела ответа до отправки клиенту последнего байта. В HTTP отсчёт начинается после последнего заголовка ответа (после Tr). Эквивалентно %Td в log-format; значение указывается в миллисекундах (ms). Подробнее см. раздел 8.4 «Времена событий».

sc_bytes_in_rate(<ctr>[,<table>]): integer

sc_bytes_in_rate(<ctr>[,<table>]): integer
sc0_bytes_in_rate([<table>]): integer
sc1_bytes_in_rate([<table>]): integer
sc2_bytes_in_rate([<table>]): integer

Возвращает среднюю интенсивность передачи байт от клиента к серверу из текущих отслеживаемых счётчиков, измеряемую числом байт за период, настроенный в таблице. См. также “table_bytes_in_rate”.

sc_bytes_out_rate(<ctr>[,<table>]): integer

sc_bytes_out_rate(<ctr>[,<table>]): integer
sc0_bytes_out_rate([<table>]): integer
sc1_bytes_out_rate([<table>]): integer
sc2_bytes_out_rate([<table>]): integer

Возвращает среднюю интенсивность передачи байт от сервера к клиенту из текущих отслеживаемых счётчиков, измеряемую числом байт за период, настроенный в таблице. См. также “table_bytes_out_rate”.

sc_clr_gpc(<idx>,<ctr>[,<table>]): integer

sc_clr_gpc(<idx>,<ctr>[,<table>]): integer

Обнуляет счётчик общего назначения по индексу <idx> массива, связанного с указанным отслеживаемым счётчиком с ID <ctr> из таблицы привязок текущего прокси или указанной таблицы привязок <table>, и возвращает его предыдущее значение. <idx> — целое число от 0 до 99, а <ctr> — целое число от 0 до 2. До первого вызова сохранённое значение равно нулю, поэтому первый вызов всегда возвращает ноль. Этот метод извлечения применяется только к data_type массива ‘gpc’ (а не к устаревшим data_types ‘gpc0’ или ‘gpc1’).

sc_clr_gpc0(<ctr>[,<table>]): integer

sc_clr_gpc0(<ctr>[,<table>]): integer
sc0_clr_gpc0([<table>]): integer
sc1_clr_gpc0([<table>]): integer
sc2_clr_gpc0([<table>]): integer

Обнуляет первый счётчик общего назначения, связанный с текущими отслеживаемыми счётчиками, и возвращает его предыдущее значение. До первого вызова сохранённое значение равно нулю, поэтому первый вызов всегда возвращает ноль. Обычно используется как второй ACL в выражении, чтобы отметить соединение при истинном результате первого ACL:

Пример:

# block if 5 consecutive requests continue to come faster than 10 sess
# per second, and reset the counter as soon as the traffic slows down.
acl abuse sc0_http_req_rate gt 10
acl kill  sc0_inc_gpc0 gt 5
acl save  sc0_clr_gpc0 ge 0
tcp-request connection accept if !abuse save
tcp-request connection reject if abuse kill

sc_clr_gpc1(<ctr>[,<table>]): integer

sc_clr_gpc1(<ctr>[,<table>]): integer
sc0_clr_gpc1([<table>]): integer
sc1_clr_gpc1([<table>]): integer
sc2_clr_gpc1([<table>]): integer

Обнуляет второй счётчик общего назначения, связанный с текущими отслеживаемыми счётчиками, и возвращает его предыдущее значение. До первого вызова сохранённое значение равно нулю, поэтому первый вызов всегда возвращает ноль. Обычно используется как второй ACL в выражении, чтобы отметить соединение при истинном результате первого ACL.

sc_conn_cnt(<ctr>[,<table>]): integer

sc_conn_cnt(<ctr>[,<table>]): integer
sc0_conn_cnt([<table>]): integer
sc1_conn_cnt([<table>]): integer
sc2_conn_cnt([<table>]): integer

Возвращает суммарное число входящих соединений из текущих отслеживаемых счётчиков. См. также “table_conn_cnt”.

sc_conn_cur(<ctr>[,<table>]): integer

sc_conn_cur(<ctr>[,<table>]): integer
sc0_conn_cur([<table>]): integer
sc1_conn_cur([<table>]): integer
sc2_conn_cur([<table>]): integer

Возвращает текущее число одновременных соединений, отслеживающих те же счётчики. Это число автоматически увеличивается при начале отслеживания и уменьшается при его прекращении. См. также “table_conn_cur”.

sc_conn_rate(<ctr>[,<table>]): integer

sc_conn_rate(<ctr>[,<table>]): integer
sc0_conn_rate([<table>]): integer
sc1_conn_rate([<table>]): integer
sc2_conn_rate([<table>]): integer

Возвращает среднюю интенсивность соединений из текущих отслеживаемых счётчиков, измеряемую числом соединений за период, настроенный в таблице. См. также “table_conn_rate”.

sc_get_gpc(<idx>,<ctr>[,<table>]): integer

sc_get_gpc(<idx>,<ctr>[,<table>]): integer

Возвращает значение счётчика общего назначения по индексу <idx> в массиве GPC, связанном с текущим отслеживаемым счётчиком с ID <ctr> из таблицы привязок текущего прокси или указанной таблицы привязок <table>. <idx> — целое число от 0 до 99, а <ctr> — целое число от 0 до 2. Если по этому индексу нет сохранённого gpc, возвращается ноль. Этот метод извлечения применяется только к data_type массива ‘gpc’ (а не к устаревшим data_types ‘gpc0’ или ‘gpc1’). См. также “table_gpc” и “sc_inc_gpc”.

sc_get_gpc0(<ctr>[,<table>]): integer

sc_get_gpc0(<ctr>[,<table>]): integer
sc0_get_gpc0([<table>]): integer
sc1_get_gpc0([<table>]): integer
sc2_get_gpc0([<table>]): integer

Возвращает значение первого счётчика общего назначения, связанного с текущими отслеживаемыми счётчиками. См. также “table_gpc0” и sc/sc0/sc1/sc2_inc_gpc0.

sc_get_gpc1(<ctr>[,<table>]): integer

sc_get_gpc1(<ctr>[,<table>]): integer
sc0_get_gpc1([<table>]): integer
sc1_get_gpc1([<table>]): integer
sc2_get_gpc1([<table>]): integer

Возвращает значение второго счётчика общего назначения, связанного с текущими отслеживаемыми счётчиками. См. также “table_gpc1” и sc/sc0/sc1/sc2_inc_gpc1.

sc_get_gpt(<idx>,<ctr>[,<table>]): integer

sc_get_gpt(<idx>,<ctr>[,<table>]): integer

Возвращает значение первой метки общего назначения по индексу <idx> массива, связанного с отслеживаемым счётчиком с ID <ctr> и взятого из таблицы привязок текущего прокси или указанной таблицы привязок <table>. <idx> — целое число от 0 до 99, а <ctr> — целое число от 0 до 2. Если по этому индексу нет сохранённого GPT, возвращается ноль. Этот метод извлечения применяется только к массиву ‘gpt’ data_type (а не к устаревшему data-type ‘gpt0’). См. также “table_gpt”.

sc_get_gpt0(<ctr>[,<table>]): integer

sc_get_gpt0(<ctr>[,<table>]): integer
sc0_get_gpt0([<table>]): integer
sc1_get_gpt0([<table>]): integer
sc2_get_gpt0([<table>]): integer

Возвращает значение первой метки общего назначения, связанной с текущими отслеживаемыми счётчиками. См. также “table_gpt0”.

sc_glitch_cnt(<ctr>[,<table>]): integer

sc_glitch_cnt(<ctr>[,<table>]): integer
sc0_glitch_cnt([<table>]): integer
sc1_glitch_cnt([<table>]): integer
sc2_glitch_cnt([<table>]): integer

Возвращает суммарное число протокольных сбоев, наблюдавшихся в клиентских соединениях, связанных с текущими отслеживаемыми счётчиками. Обычно эти сбои приводят к прекращению запросов или соединений, поэтому возвращаемое значение часто относится к прежним соединениям. Хорошего или плохого значения нет, но некачественный клиент может иногда вызывать несколько сбоев на соединение, а очень некорректный или злонамеренный клиент — быстро добавлять тысячи событий в одном соединении. См. также fc_glitches для числа сбоев в текущем соединении, src_glitch_cnt для поиска по источнику и sc_glitch_rate для измерения интенсивности событий.

sc_glitch_rate(<ctr>[,<table>]): integer

sc_glitch_rate(<ctr>[,<table>]): integer
sc0_glitch_rate([<table>]): integer
sc1_glitch_rate([<table>]): integer
sc2_glitch_rate([<table>]): integer

Возвращает среднюю интенсивность протокольных сбоев в клиентских соединениях для текущих отслеживаемых счётчиков, измеряемую числом событий за период, настроенный в таблице. Обычно эти сбои приводят к прекращению запросов или соединений, поэтому возвращаемое значение часто относится к прежним соединениям. Хорошего или плохого значения нет, но некачественный клиент может иногда вызывать несколько сбоев на соединение, поэтому обычно ожидается низкая интенсивность. Однако очень некорректный или злонамеренный клиент может быстро добавлять тысячи событий на соединение и поддерживать здесь высокую интенсивность. См. также “table_glitch_rate” и “sc_glitch_cnt”.

sc_gpc_rate(<idx>,<ctr>[,<table>]): integer

sc_gpc_rate(<idx>,<ctr>[,<table>]): integer

Возвращает среднюю интенсивность увеличения счётчика общего назначения по индексу <idx> массива, связанного с отслеживаемым счётчиком с ID <ctr> из таблицы текущего прокси или указанной таблицы привязок <table>. Показывает частоту, с которой счётчик gpc увеличивался за настроенный период. <idx> — целое число от 0 до 99, а <ctr> — целое число от 0 до 2. Чтобы получить значение, в таблице привязок должен храниться массив счётчиков ‘gpc_rate’, поскольку ‘gpc’ содержит только число событий. Этот метод извлечения применяется только к массиву ‘gpc_rate’ data_type (а не к устаревшим data_types ‘gpc0_rate’ или ‘gpc1_rate’). См. также “table_gpc_rate”, “sc_get_gpc” и “sc_inc_gpc”.

sc_gpc0_rate(<ctr>[,<table>]): integer

sc_gpc0_rate(<ctr>[,<table>]): integer
sc0_gpc0_rate([<table>]): integer
sc1_gpc0_rate([<table>]): integer
sc2_gpc0_rate([<table>]): integer

Возвращает среднюю интенсивность увеличения первого счётчика общего назначения, связанного с текущими отслеживаемыми счётчиками. Показывает частоту увеличения счётчика gpc0 за настроенный период. См. также src_gpc0_rate, sc/sc0/sc1/sc2_get_gpc0 и sc/sc0/sc1/sc2_inc_gpc0. Чтобы получить значение, в таблице привязок должен храниться счётчик “gpc0_rate”, поскольку “gpc0” содержит только число событий.

sc_gpc1_rate(<ctr>[,<table>]): integer

sc_gpc1_rate(<ctr>[,<table>]): integer
sc0_gpc1_rate([<table>]): integer
sc1_gpc1_rate([<table>]): integer
sc2_gpc1_rate([<table>]): integer

Возвращает среднюю интенсивность увеличения второго счётчика общего назначения, связанного с текущими отслеживаемыми счётчиками. Показывает частоту увеличения счётчика gpc1 за настроенный период. См. также src_gpc1_rate, sc/sc0/sc1/sc2_get_gpc1 и sc/sc0/sc1/sc2_inc_gpc1. Чтобы получить значение, в таблице привязок должен храниться счётчик “gpc1_rate”, поскольку “gpc1” содержит только число событий.

sc_http_err_cnt(<ctr>[,<table>]): integer

sc_http_err_cnt(<ctr>[,<table>]): integer
sc0_http_err_cnt([<table>]): integer
sc1_http_err_cnt([<table>]): integer
sc2_http_err_cnt([<table>]): integer

Возвращает суммарное число ошибок HTTP из текущих отслеживаемых счётчиков. Включает как ошибки запросов, так и ответы с ошибками 4xx. См. также “table_http_err_cnt”.

sc_http_err_rate(<ctr>[,<table>]): integer

sc_http_err_rate(<ctr>[,<table>]): integer
sc0_http_err_rate([<table>]): integer
sc1_http_err_rate([<table>]): integer
sc2_http_err_rate([<table>]): integer

Возвращает среднюю интенсивность ошибок HTTP из текущих отслеживаемых счётчиков, измеряемую числом ошибок за период, настроенный в таблице. Включает как ошибки запросов, так и ответы с ошибками 4xx. См. также src_http_err_rate.

sc_http_fail_cnt(<ctr>[,<table>]): integer

sc_http_fail_cnt(<ctr>[,<table>]): integer
sc0_http_fail_cnt([<table>]): integer
sc1_http_fail_cnt([<table>]): integer
sc2_http_fail_cnt([<table>]): integer

Возвращает суммарное число сбоев ответов HTTP из текущих отслеживаемых счётчиков. Включает как ошибки ответов, так и коды состояния 5xx, кроме 501 и 505. См. также “table_http_fail_cnt”.

sc_http_fail_rate(<ctr>[,<table>]): integer

sc_http_fail_rate(<ctr>[,<table>]): integer
sc0_http_fail_rate([<table>]): integer
sc1_http_fail_rate([<table>]): integer
sc2_http_fail_rate([<table>]): integer

Возвращает среднюю интенсивность сбоев ответов HTTP из текущих отслеживаемых счётчиков, измеряемую числом сбоев за период, настроенный в таблице. Включает как ошибки ответов, так и коды состояния 5xx, кроме 501 и 505. См. также “table_http_fail_rate”.

sc_http_req_cnt(<ctr>[,<table>]): integer

sc_http_req_cnt(<ctr>[,<table>]): integer
sc0_http_req_cnt([<table>]): integer
sc1_http_req_cnt([<table>]): integer
sc2_http_req_cnt([<table>]): integer

Возвращает суммарное число запросов HTTP из текущих отслеживаемых счётчиков. Включает все начатые запросы, корректные и некорректные. См. также src_http_req_cnt.

sc_http_req_rate(<ctr>[,<table>]): integer

sc_http_req_rate(<ctr>[,<table>]): integer
sc0_http_req_rate([<table>]): integer
sc1_http_req_rate([<table>]): integer
sc2_http_req_rate([<table>]): integer

Возвращает среднюю интенсивность запросов HTTP из текущих отслеживаемых счётчиков, измеряемую числом запросов за период, настроенный в таблице. Включает все начатые запросы, корректные и некорректные. См. также src_http_req_rate.

sc_inc_gpc(<idx>,<ctr>[,<table>]): integer

sc_inc_gpc(<idx>,<ctr>[,<table>]): integer

Увеличивает счётчик общего назначения по индексу <idx> массива, связанного с указанным отслеживаемым счётчиком с ID <ctr> из таблицы привязок текущего прокси или указанной таблицы привязок <table>, и возвращает новое значение. <idx> — целое число от 0 до 99, а <ctr> — целое число от 0 до 2. До первого вызова сохранённое значение равно нулю, поэтому первый вызов увеличивает его до 1 и возвращает 1. Этот метод извлечения применяется только к массиву ‘gpc’ data_type (а не к устаревшим data_types ‘gpc0’ или ‘gpc1’).

sc_inc_gpc0(<ctr>[,<table>]): integer

sc_inc_gpc0(<ctr>[,<table>]): integer
sc0_inc_gpc0([<table>]): integer
sc1_inc_gpc0([<table>]): integer
sc2_inc_gpc0([<table>]): integer

Увеличивает первый счётчик общего назначения, связанный с текущими отслеживаемыми счётчиками, и возвращает его новое значение. До первого вызова сохранённое значение равно нулю, поэтому первый вызов увеличивает его до 1 и возвращает 1. Обычно используется как второй ACL в выражении, чтобы отметить соединение при истинном результате первого ACL:

Пример:

acl abuse sc0_http_req_rate gt 10
acl kill  sc0_inc_gpc0 gt 0
tcp-request connection reject if abuse kill

sc_inc_gpc1(<ctr>[,<table>]): integer

sc_inc_gpc1(<ctr>[,<table>]): integer
sc0_inc_gpc1([<table>]): integer
sc1_inc_gpc1([<table>]): integer
sc2_inc_gpc1([<table>]): integer

Увеличивает второй счётчик общего назначения, связанный с текущими отслеживаемыми счётчиками, и возвращает его новое значение. До первого вызова сохранённое значение равно нулю, поэтому первый вызов увеличивает его до 1 и возвращает 1. Обычно используется как второй ACL в выражении, чтобы отметить соединение при истинном результате первого ACL.

sc_kbytes_in(<ctr>[,<table>]): integer

sc_kbytes_in(<ctr>[,<table>]): integer
sc0_kbytes_in([<table>]): integer
sc1_kbytes_in([<table>]): integer
sc2_kbytes_in([<table>]): integer

Возвращает общий объём данных от клиента к серверу из текущих отслеживаемых счётчиков в килобайтах. Сейчас проверка выполняется с 32-битными целыми числами, что ограничивает значения 4 терабайтами. См. также “table_kbytes_in”.

sc_kbytes_out(<ctr>[,<table>]): integer

sc_kbytes_out(<ctr>[,<table>]): integer
sc0_kbytes_out([<table>]): integer
sc1_kbytes_out([<table>]): integer
sc2_kbytes_out([<table>]): integer

Возвращает общий объём данных от сервера к клиенту из текущих отслеживаемых счётчиков в килобайтах. Сейчас проверка выполняется с 32-битными целыми числами, что ограничивает значения 4 терабайтами. См. также “table_kbytes_out”.

sc_key(<ctr>): any sc0_key: any sc1_key: any sc2_key: any Возвращает ключ, используемый для сопоставления текущего отслеживаемого счётчика.

sc_sess_cnt(<ctr>[,<table>]): integer

sc_sess_cnt(<ctr>[,<table>]): integer
sc0_sess_cnt([<table>]): integer
sc1_sess_cnt([<table>]): integer
sc2_sess_cnt([<table>]): integer

Возвращает суммарное число входящих соединений, преобразованных в сеансы, то есть принятых правилом “tcp-request connection”, из текущих отслеживаемых счётчиков. Бэкенд может насчитать больше сеансов, чем соединений: каждое соединение может породить множество сеансов бэкенда, если соединение с клиентом использует постоянные соединения HTTP keep-alive. См. также “table_sess_cnt”.

sc_sess_rate(<ctr>[,<table>]): integer

sc_sess_rate(<ctr>[,<table>]): integer
sc0_sess_rate([<table>]): integer
sc1_sess_rate([<table>]): integer
sc2_sess_rate([<table>]): integer

Возвращает среднюю интенсивность сеансов из текущих отслеживаемых счётчиков, измеряемую числом сеансов за период, настроенный в таблице. Сеанс — это соединение, прошедшее ранние правила “tcp-request connection”. Бэкенд может насчитать больше сеансов, чем соединений: каждое соединение может породить множество сеансов бэкенда, если соединение с клиентом использует постоянные соединения HTTP keep-alive. См. также “table_sess_rate”.

sc_tracked(<ctr>[,<table>]): boolean

sc_tracked(<ctr>[,<table>]): boolean
sc0_tracked([<table>]): boolean
sc1_tracked([<table>]): boolean
sc2_tracked([<table>]): boolean

Возвращает true, если указанный счётчик сеанса сейчас отслеживается текущим сеансом. Может быть полезен при решении, следует ли задавать определённые значения в заголовке, передаваемом серверу.

sc_trackers(<ctr>[,<table>]): integer

sc_trackers(<ctr>[,<table>]): integer
sc0_trackers([<table>]): integer
sc1_trackers([<table>]): integer
sc2_trackers([<table>]): integer

Возвращает текущее число одновременных соединений, отслеживающих те же счётчики. Это число автоматически увеличивается при начале отслеживания и уменьшается при его прекращении. Отличается от sc0_conn_cur тем, что использует счётчик ссылок таблицы, а не сохранённые данные (значение “use”, возвращаемое командой “show table” в CLI). Иногда это больше подходит для отслеживания на уровне 7. Например, позволяет сообщить серверу число одновременных соединений от заданного адреса.

so_id: integer Возвращает целое число с id текущего слушающего сокета. Полезен во фронтендах с множеством строк “bind” или для привязки всех пользователей, пришедших через один сокет, к одному серверу.

so_name: string Возвращает строку с именем текущего слушающего сокета, заданным с помощью name в строке “bind”. Служит тем же целям, что и so_id, но использует строки вместо целых чисел.

src: ip IP-адрес источника клиента текущего сеанса. Этот адрес может изменяться любыми правилами tcp/http. Имеет тип IP и работает с таблицами IPv4 и IPv6. В таблицах IPv6 адреса IPv4 отображаются в соответствующие адреса IPv6 согласно RFC 4291. Используется адрес источника на уровне TCP, а не адрес клиента за прокси. Однако при использовании директивы bind “accept-proxy” или “accept-netscaler-cip” это может быть адрес клиента за другим компонентом, совместимым с PROXY-protocol, во всех наборах правил, кроме “tcp-request connection”, который видит настоящий адрес. Если входящее соединение прошло через преобразование адресов или перенаправление с отслеживанием соединений, возвращается исходный адрес назначения до перенаправления. В системах Linux источник и назначение иногда могут поменяться местами, если задан sysctl nf_conntrack_tcp_loose: запоздалый ответ может вновь открыть соединение, закрытое по тайм-ауту, и поменять представление о том, какая сторона является источником, а какая — назначением.

Пример:

# add an HTTP header in requests with the originating address' country
http-request set-header X-Country %[src,map_ip(geoip.lst)]

src_bytes_in_rate([<table>]): integer

src_bytes_in_rate([<table>]): integer

Работает как преобразователь “table_bytes_in_rate”, при этом ключом служит адрес источника входящего соединения.

Эквивалентно: src,table_bytes_in_rate([<table>])

src_bytes_out_rate([<table>]): integer

src_bytes_out_rate([<table>]): integer

Работает как преобразователь “table_bytes_out_rate”, при этом ключом служит адрес источника входящего соединения.

Эквивалентно: src,table_bytes_out_rate([<table>])

src_clr_gpc(<idx>[,<table>]): integer

src_clr_gpc(<idx>[,<table>]): integer

Работает как преобразователь “table_clr_gpc”, при этом ключом служит адрес источника входящего соединения.

Эквивалентно: src,table_clr_gpc(<idx>[,<table>])

src_clr_gpc0([<table>]): integer

src_clr_gpc0([<table>]): integer

Работает как преобразователь “table_clr_gpc0”, при этом ключом служит адрес источника входящего соединения.

Эквивалентно: src,table_clr_gpc0([<table>])

src_clr_gpc1([<table>]): integer

src_clr_gpc1([<table>]): integer

Работает как преобразователь “table_clr_gpc1”, при этом ключом служит адрес источника входящего соединения.

Эквивалентно: src,table_clr_gpc1([<table>])

src_conn_cnt([<table>]): integer

src_conn_cnt([<table>]): integer

Работает как преобразователь “table_conn_cnt”, при этом ключом служит адрес источника входящего соединения.

Эквивалентно: src,table_conn_cnt([<table>])

src_conn_cur([<table>]): integer

src_conn_cur([<table>]): integer

Работает как преобразователь “table_conn_cur”, при этом ключом служит адрес источника входящего соединения.

Эквивалентно: src,table_conn_cur([<table>])

src_conn_rate([<table>]): integer

src_conn_rate([<table>]): integer

Работает как преобразователь “table_conn_rate”, при этом ключом служит адрес источника входящего соединения.

Эквивалентно: src,table_conn_rate([<table>])

src_get_gpc(<idx>[,<table>]): integer

src_get_gpc(<idx>[,<table>]): integer

Работает как преобразователь “table_gpc”, при этом ключом служит адрес источника входящего соединения.

Эквивалентно: src,table_gpc(<idx>[,<table>])

src_get_gpc0([<table>]): integer

src_get_gpc0([<table>]): integer

Работает как преобразователь “table_gpc0”, при этом ключом служит адрес источника входящего соединения.

Эквивалентно: src,table_gpc0([<table>])

src_get_gpc1([<table>]): integer

src_get_gpc1([<table>]): integer

Работает как преобразователь “table_gpc1”, при этом ключом служит адрес источника входящего соединения.

Эквивалентно: src,table_gpc1([<table>])

src_get_gpt(<idx>[,<table>]): integer

src_get_gpt(<idx>[,<table>]): integer

Работает как преобразователь “table_gpt”, при этом ключом служит адрес источника входящего соединения.

Эквивалентно: src,table_gpt(<idx>[,<table>])

src_get_gpt0([<table>]): integer

src_get_gpt0([<table>]): integer

Работает как преобразователь “table_gpt0”, при этом ключом служит адрес источника входящего соединения.

Эквивалентно: src,table_gpt0([<table>])

src_glitch_cnt([<table>]): integer

src_glitch_cnt([<table>]): integer

Работает как преобразователь “table_glitch_cnt”, при этом ключом служит адрес источника входящего соединения.

Эквивалентно: src,table_glitch_cnt([<table>])

src_glitch_rate([<table>]): integer

src_glitch_rate([<table>]): integer

Работает как преобразователь “table_glitch_rate”, при этом ключом служит адрес источника входящего соединения.

Эквивалентно: src,table_glitch_rate([<table>])

src_gpc_rate(<idx>[,<table>]): integer

src_gpc_rate(<idx>[,<table>]): integer

Работает как преобразователь “table_gpc_rate”, при этом ключом служит адрес источника входящего соединения.

Эквивалентно: src,table_gpc_rate(<idx>[,<table>])

src_gpc0_rate([<table>]): integer

src_gpc0_rate([<table>]): integer

Работает как преобразователь “table_gpc0_rate”, при этом ключом служит адрес источника входящего соединения.

Эквивалентно: src,table_gpc0_rate([<table>])

src_gpc1_rate([<table>]): integer

src_gpc1_rate([<table>]): integer

Работает как преобразователь “table_gpc1_rate”, при этом ключом служит адрес источника входящего соединения.

Эквивалентно: src,table_gpc1_rate([<table>])

src_http_err_cnt([<table>]): integer

src_http_err_cnt([<table>]): integer

Работает как преобразователь “table_http_err_cnt”, при этом ключом служит адрес источника входящего соединения.

Эквивалентно: src,table_http_err_cnt([<table>])

src_http_err_rate([<table>]): integer

src_http_err_rate([<table>]): integer

Работает как преобразователь “table_http_err_rate”, при этом ключом служит адрес источника входящего соединения.

Эквивалентно: src,table_http_err_rate([<table>])

src_http_fail_cnt([<table>]): integer

src_http_fail_cnt([<table>]): integer

Работает как преобразователь “table_http_fail_cnt”, при этом ключом служит адрес источника входящего соединения.

Эквивалентно: src,table_http_fail_cnt([<table>])

src_http_fail_rate([<table>]): integer

src_http_fail_rate([<table>]): integer

Работает как преобразователь “table_http_fail_rate”, при этом ключом служит адрес источника входящего соединения.

Эквивалентно: src,table_http_fail_rate([<table>])

src_http_req_cnt([<table>]): integer

src_http_req_cnt([<table>]): integer

Работает как преобразователь “table_http_req_cnt”, при этом ключом служит адрес источника входящего соединения.

Эквивалентно: src,table_http_req_cnt([<table>])

src_http_req_rate([<table>]): integer

src_http_req_rate([<table>]): integer

Работает как преобразователь “table_http_req_rate”, при этом ключом служит адрес источника входящего соединения.

Эквивалентно: src,table_http_req_rate([<table>])

src_inc_gpc(<idx>[,<table>]): integer

src_inc_gpc(<idx>[,<table>]): integer

Работает как преобразователь “src_inc_gpc”, при этом ключом служит адрес источника входящего соединения.

Эквивалентно: src,table_inc_gpc(<idx>[,<table>])

src_inc_gpc0([<table>]): integer

src_inc_gpc0([<table>]): integer

Работает как преобразователь “src_inc_gpc0”, при этом ключом служит адрес источника входящего соединения.

Эквивалентно: src,table_inc_gpc0([<table>])

src_inc_gpc1([<table>]): integer

src_inc_gpc1([<table>]): integer

Работает как преобразователь “src_inc_gpc1”, при этом ключом служит адрес источника входящего соединения.

Эквивалентно: src,table_inc_gpc1([<table>])

src_is_local: boolean Возвращает true, если адрес источника входящего соединения локален для системы, или false, если адрес отсутствует в системе, то есть пришёл с удалённой машины. Обратите внимание, что адреса UNIX считаются локальными. Это может быть полезно для применения определённых ограничений доступа в зависимости от источника клиента (например, требовать аутентификацию или HTTPS для удалённых машин). Обратите внимание, что проверка требует нескольких системных вызовов, поэтому лучше выполнять её только один раз за соединение.

src_kbytes_in([<table>]): integer

src_kbytes_in([<table>]): integer

Работает как преобразователь “table_kbytes_in”, при этом ключом служит адрес источника входящего соединения.

Эквивалентно: src,table_kbytes_in([<table>])

src_kbytes_out([<table>]): integer

src_kbytes_out([<table>]): integer

Работает как преобразователь “table_kbytes_out”, при этом ключом служит адрес источника входящего соединения.

Эквивалентно: src,table_kbytes_out([<table>])

src_port: integer Возвращает целочисленное значение, соответствующее исходному порту TCP соединения на стороне клиента, то есть порту, с которого подключился клиент. Любые правила tcp/http могут изменить этот адрес. Использование этой функции ограничено, поскольку современные протоколы в настоящее время не уделяют большого внимания исходным портам.

src_sess_cnt([<table>]): integer

src_sess_cnt([<table>]): integer

Работает как преобразователь “table_sess_cnt”, при этом ключом служит адрес источника входящего соединения.

Эквивалентно: src,table_sess_cnt([<table>])

src_sess_rate([<table>]): integer

src_sess_rate([<table>]): integer

Работает как преобразователь “table_sess_rate”, при этом ключом служит адрес источника входящего соединения.

Эквивалентно: src,table_sess_rate([<table>])

src_updt_conn_cnt([<table>]): integer

src_updt_conn_cnt([<table>]): integer

Создаёт или обновляет запись, связанную с адресом источника входящего соединения в таблице привязок текущего прокси или в указанной таблице привязок. Эта таблица должна быть настроена для хранения типа данных “conn_cnt”, иначе сопоставление будет проигнорировано. Текущее значение счётчика увеличивается на единицу, и таймер истечения обновляется. Возвращается обновлённое значение счётчика, поэтому результат не может быть нулевым. Использовалось для блокировки злоупотребляющих сервисом по их адресу источника. Примечание: рекомендуется использовать более полные действия “track-sc*” в правилах “tcp-request” вместо этого.

Пример:

# This frontend limits incoming SSH connections to 3 per 10 second for
# each source address, and rejects excess connections until a 10 second
# silence is observed. At most 20 addresses are tracked.
listen ssh
    bind :22
    mode tcp
    maxconn 100
    stick-table type ip size 20 expire 10s store conn_cnt
    tcp-request content reject if { src_updt_conn_cnt gt 3 }
    server local 127.0.0.1:22

srv_id: integer Возвращает целое число, содержащее идентификатор сервера при обработке ответа. Хотя используется почти исключительно в правилах ACL, может применяться для ведения журнала или отладки. Также может использоваться в правилах tcp-check или http-check.

srv_name: string Возвращает строку, содержащую имя сервера при обработке ответа. Хотя используется почти исключительно в правилах ACL, может применяться для ведения журнала или отладки. Также может использоваться в правилах tcp-check или http-check.

txn.conn_retries: integer Возвращает число повторных попыток соединения этого потока с сервером. Это значение может меняться, пока соединение не будет полностью установлено. Для соединений HTTP на значение могут влиять повторные попытки L7.

txn.redispatched: boolean Возвращает true, если соединение было перераспределено при повторной попытке в соответствии с конфигурацией “option redispatch”. Это значение может изменяться до полной установки соединения. Для соединений HTTP значение может быть затронуто повторными попытками L7.

7.3.4. Извлечение образцов на уровне 5

Уровень 5 обычно описывает только сеансовый уровень, который в HAProxy находится ближе всего к сеансу после завершения всех рукопожатий соединения, но когда ещё не доступны данные. Методы извлечения, описанные здесь, могут использоваться уже на уровне “tcp-request content”, если они не требуют будущей информации. К ним обычно относятся результаты согласования SSL.

Сводка методов извлечения образцов в этом разделе и их соответствующие типы:

  Ключевое слово                                   Выходной тип
-------------------------------------------------+-------------
51d.all(<prop>[,<prop>*])                          string
bs.aborted                                         boolean
bs.debug_str([<bitmap>])                           string
bs.id                                              integer
bs.rst_code                                        integer
fs.aborted                                         boolean
fs.debug_str([<bitmap>])                           string
fs.id                                              integer
fs.rst_code                                        integer
ssl_bc                                             boolean
ssl_bc_alg_keysize                                 integer
ssl_bc_alpn                                        string
ssl_bc_cipher                                      string
ssl_bc_client_early_traffic_secret                 string
ssl_bc_client_handshake_traffic_secret             string
ssl_bc_client_random                               binary
ssl_bc_client_traffic_secret_0                     string
ssl_bc_curve                                       string
ssl_bc_early_exporter_secret                       string
ssl_bc_err                                         integer
ssl_bc_err_str                                     string
ssl_bc_exporter_secret                             string
ssl_bc_is_resumed                                  boolean
ssl_bc_npn                                         string
ssl_bc_protocol                                    string
ssl_bc_server_handshake_traffic_secret             string
ssl_bc_server_random                               binary
ssl_bc_server_traffic_secret_0                     string
ssl_bc_session_id                                  binary
ssl_bc_session_key                                 binary
ssl_bc_sni                                         string
ssl_bc_unique_id                                   binary
ssl_bc_use_keysize                                 integer
ssl_c_ca_err                                       integer
ssl_c_ca_err_depth                                 integer
ssl_c_chain_der                                    binary
ssl_c_der                                          binary
ssl_c_err                                          integer
ssl_c_i_dn([<entry>[,<occ>[,<format>]]])           string
ssl_c_key_alg                                      string
ssl_c_notafter                                     string
ssl_c_notbefore                                    string
ssl_c_r_dn([<entry>[,<occ>[,<format>]]])           string
ssl_c_s_dn([<entry>[,<occ>[,<format>]]])           string
ssl_c_san                                          string
ssl_c_serial                                       binary
ssl_c_sha1                                         binary
ssl_c_sig_alg                                      string
ssl_c_used                                         boolean
ssl_c_verify                                       integer
ssl_c_version                                      integer
ssl_f_der                                          binary
ssl_f_i_dn([<entry>[,<occ>[,<format>]]])           string
ssl_f_key_alg                                      string
ssl_f_notafter                                     string
ssl_f_notbefore                                    string
ssl_f_s_dn([<entry>[,<occ>[,<format>]]])           string
ssl_f_serial                                       binary
ssl_f_sha1                                         binary
ssl_f_sig_alg                                      string
ssl_f_version                                      integer
ssl_fc                                             boolean
ssl_fc_alg_keysize                                 integer
ssl_fc_alpn                                        string
ssl_fc_cipher                                      string
ssl_fc_cipherlist_bin([<filter_option>])           binary
ssl_fc_cipherlist_hex([<filter_option>])           string
ssl_fc_cipherlist_str([<filter_option>])           string
ssl_fc_cipherlist_xxh                              integer
ssl_fc_client_early_traffic_secret                 string
ssl_fc_client_handshake_traffic_secret             string
ssl_fc_client_random                               binary
ssl_fc_client_traffic_secret_0                     string
ssl_fc_crtname                                     string
ssl_fc_curve                                       string
ssl_fc_early_exporter_secret                       string
ssl_fc_ecformats_bin                               binary
ssl_fc_eclist_bin([<filter_option>])               binary
ssl_fc_err                                         integer
ssl_fc_err_str                                     string
ssl_fc_exporter_secret                             string
ssl_fc_extlist_bin([<filter_option>])              binary
ssl_fc_has_crt                                     boolean
ssl_fc_has_early                                   boolean
ssl_fc_has_sni                                     boolean
ssl_fc_is_resumed                                  boolean
ssl_fc_npn                                         string
ssl_fc_protocol                                    string
ssl_fc_protocol_hello_id                           integer
ssl_fc_server_handshake_traffic_secret             string
ssl_fc_server_random                               binary
ssl_fc_server_traffic_secret_0                     string
ssl_fc_session_id                                  binary
ssl_fc_session_key                                 binary
ssl_fc_sigalgs_bin([<filter_option>])              binary
ssl_fc_sni                                         string
ssl_fc_supported_versions_bin([<filter_option>])   binary
ssl_fc_unique_id                                   binary
ssl_fc_use_keysize                                 integer
ssl_s_chain_der                                    binary
ssl_s_der                                          binary
ssl_s_i_dn([<entry>[,<occ>[,<format>]]])           string
ssl_s_key_alg                                      string
ssl_s_notafter                                     string
ssl_s_notbefore                                    string
ssl_s_s_dn([<entry>[,<occ>[,<format>]]])           string
ssl_s_serial                                       binary
ssl_s_sha1                                         binary
ssl_s_sig_alg                                      string
ssl_s_version                                      integer
txn.timer.user                                     integer
-------------------------------------------------+-------------

Подробный список:

51d.all(<prop>[,<prop>*]): string

51d.all(<prop>[,<prop>*]): string

Возвращает значения запрошенных свойств в виде строки, где значения разделены разделителем, указанным с помощью “51degrees-property-separator”. Устройство идентифицируется с использованием всех важных заголовков HTTP из запроса. Функция может принимать до пяти имён свойств, и если имя свойства не найдено, возвращается значение “NoData”.

Пример:

# Here the header "X-51D-DeviceTypeMobileTablet" is added to the request
# containing the three properties requested using all relevant headers from
# the request.
frontend http-in
  bind *:8081
  default_backend servers
  http-request set-header X-51D-DeviceTypeMobileTablet \
    %[51d.all(DeviceType,IsMobile,IsTablet)]

bs.aborted: boolean Возвращает true, если для текущего потока от сервера получено прерывание. В противном случае возвращает false.

bs.debug_str([<bitmap>]): string

bs.debug_str([<bitmap>]): string

Эта функция предназначена для использования разработчиками в ходе сложных сессий устранения неполадок. Она извлекает некоторые внутренние состояния из нижних уровней потока и соединения бэкенда и упорядочивает их в виде строки, обычно в форме последовательности “name=value”, разделённых пробелами. Необязательный аргумент <bitmap> указывает, из каких уровней извлекать информацию, и представляет собой арифметическую операцию ИЛИ (или сумму) следующих значений: - уровень сокета: 16 - уровень соединения: 8 - транспортный уровень (например SSL): 4 - соединение мультиплексора: 2 - поток мультиплексора: 1

Эти значения могут меняться между версиями. Значение по умолчанию ноль является особым и включает все уровни. Не следует полагаться на вывод этой функции для долгосрочного мониторинга рабочей системы. Она предназначена для эволюции даже в стабильной ветке по мере роста потребности в детализации. Одним из типичных применений является объединение этой информации в конце log-format вместе с fs.debug_str(). Пример:

log-format "$HAPROXY_HTTP_LOG_FMT fs=<%[fs.debug_str]> bs=<%[bs.debug_str]>"

bs.id: integer Возвращает ID потока мультиплексора на стороне сервера. За возврат соответствующих сведений отвечает мультиплексор.

bs.rst_code: integer Возвращает код сброса, полученный от сервера для текущего потока. Возвращается код кадра H2 RST_STREAM или кадра QUIC STOP_SENDING, полученного от сервера. Извлечение образца завершается неудачей, если не было получено прерывание или если поток сервера не является потоком H2/QUIC.

fs.aborted: boolean Возвращает true, если для текущего потока от клиента получено прерывание. В противном случае возвращает false.

fs.debug_str([<bitmap>]): string

fs.debug_str([<bitmap>]): string

Эта функция предназначена для использования разработчиками в ходе сложных сессий устранения неполадок. Она извлекает некоторые внутренние состояния из нижних уровней потока и соединения фронтенда и упорядочивает их в виде строки, обычно в форме последовательности “name=value”, разделённых пробелами. Необязательный аргумент <bitmap> указывает, из каких уровней извлекать информацию, и представляет собой арифметическую операцию ИЛИ (или сумму) следующих значений: - уровень сокета: 16 - уровень соединения: 8 - транспортный уровень (например SSL): 4 - соединение мультиплексора: 2 - поток мультиплексора: 1

Эти значения могут меняться между версиями. Значение по умолчанию ноль является особым и включает все уровни. Не следует полагаться на вывод этой функции для долгосрочного мониторинга рабочей системы. Она предназначена для эволюции даже в стабильной ветке по мере роста потребности в детализации. Одним из типичных применений является объединение этой информации в конце log-format вместе с bs.debug_str(). Пример:

log-format "$HAPROXY_HTTP_LOG_FMT fs=<%[fs.debug_str]> bs=<%[bs.debug_str]>"

fs.id: integer Возвращает идентификатор потока мультиплексора на стороне клиента. Ответственность за возврат соответствующей информации лежит на мультиплексоре. Например, при использовании обычного TCP, всегда возвращается 0, поскольку поток отсутствует.

fs.rst_code: integer Возвращает код сброса, полученный от клиента для текущего потока. Возвращается код кадра H2 RST_STREAM или кадра QUIC STOP_SENDING, полученного от клиента. Извлечение образца завершается неудачей, если не было получено прерывание или если поток клиента не является потоком H2/QUIC.

ssl_bc: boolean Возвращает true, когда соединение с сервером было установлено через транспортный уровень SSL/TLS и локально расшифровано. Это означает, что исходящее соединение было установлено с сервером, для которого включена опция “ssl”. Может использоваться в правилах tcp-check или http-check.

ssl_bc_alg_keysize: integer Возвращает поддерживаемую длину ключа симметричного шифра в битах, когда исходящее соединение установлено по транспортному протоколу SSL/TLS. Можно использовать в наборе правил tcp-check либо http-check.

ssl_bc_alpn: string Извлекает поле согласования протокола прикладного уровня из исходящего соединения, установленного через транспортный уровень TLS. Результат — строка, содержащая имя протокола, согласованного с сервером. Библиотека SSL должна быть скомпилирована с поддержкой расширений TLS (проверьте haproxy -vv). Обратите внимание, что расширение TLS ALPN не объявляется, если на строке “server” не указан список протоколов с ключевым словом “alpn”. Также ничто не заставляет сервер выбирать протокол из этого списка — может быть использован любой другой. Расширение TLS ALPN предназначено для замены расширения TLS NPN. См. также “ssl_bc_npn”. Может использоваться в правилах tcp-check или http-check.

ssl_bc_cipher: string Возвращает имя используемого шифра при установке исходящего соединения через транспортный уровень SSL/TLS. Может использоваться в правилах tcp-check или http-check.

ssl_bc_client_early_traffic_secret: string Возвращает CLIENT_EARLY_TRAFFIC_SECRET в виде шестнадцатеричной строки для соединения с сервером, если исходящее соединение установлено по транспортному протоколу TLS 1.3. Требуется OpenSSL >= 1.1.1. Это один из ключей, выгружаемых обратным вызовом keylog OpenSSL для формирования SSLKEYLOGFILE. Журналирование ключей SSL необходимо включить директивой “tune.ssl.keylog on” в секции global. См. также “tune.ssl.keylog”.

ssl_bc_client_handshake_traffic_secret: string Возвращает CLIENT_HANDSHAKE_TRAFFIC_SECRET в виде шестнадцатеричной строки для соединения с сервером, если исходящее соединение установлено по транспортному протоколу TLS 1.3. Требуется OpenSSL >= 1.1.1. Это один из ключей, выгружаемых обратным вызовом keylog OpenSSL для формирования SSLKEYLOGFILE. Журналирование ключей SSL необходимо включить директивой “tune.ssl.keylog on” в секции global. См. также “tune.ssl.keylog”.

ssl_bc_client_random: binary Возвращает случайное значение клиента для соединения с сервером, когда входящее соединение было установлено через транспортный уровень SSL/TLS. Полезно для расшифровки трафика, отправленного с использованием эфемерных шифров. Требуется OpenSSL >= 1.1.0 или BoringSSL. Может использоваться в правилах tcp-check или http-check.

ssl_bc_client_traffic_secret_0: string Возвращает CLIENT_TRAFFIC_SECRET_0 в виде шестнадцатеричной строки для соединения с сервером, если исходящее соединение установлено по транспортному протоколу TLS 1.3. Требуется OpenSSL >= 1.1.1. Это один из ключей, выгружаемых обратным вызовом keylog OpenSSL для формирования SSLKEYLOGFILE. Журналирование ключей SSL необходимо включить директивой “tune.ssl.keylog on” в секции global. См. также “tune.ssl.keylog”.

ssl_bc_curve: string Возвращает имя кривой, используемой при согласовании ключей, когда исходящее соединение было установлено через транспортный уровень SSL/TLS. Требуется OpenSSL >= 3.0.0 или AWS-LC >= 1.57.0.

ssl_bc_early_exporter_secret: string Возвращает EARLY_EXPORTER_SECRET в виде шестнадцатеричной строки для соединения с сервером, если исходящее соединение установлено по транспортному протоколу TLS 1.3. Требуется OpenSSL >= 1.1.1. Это один из ключей, выгружаемых обратным вызовом keylog OpenSSL для формирования SSLKEYLOGFILE. Журналирование ключей SSL необходимо включить директивой “tune.ssl.keylog on” в секции global. См. также “tune.ssl.keylog”.

ssl_bc_err: integer При установке исходящего соединения через транспортный уровень SSL/TLS возвращает идентификатор последней ошибки из первого стека ошибок, возникшего на стороне бэкенда. Может включать ошибки рукопожатия, а также другие ошибки чтения или записи, возникшие в течение срока жизни соединения. Чтобы получить текстовое описание этого кода ошибки, можно использовать либо извлечение образца “ssl_bc_err_str”, либо команду “openssl errstr” (которая принимает код ошибки в шестнадцатеричном представлении в качестве параметра). Обратитесь к документации вашей библиотеки SSL для получения полного списка кодов ошибок.

ssl_bc_err_str: string При установке исходящего соединения через транспортный уровень SSL/TLS возвращает строковое представление последней ошибки из первого стека ошибок, возникшего с точки зрения бэкенда. См. также “ssl_fc_err”.

ssl_bc_exporter_secret: string Возвращает EXPORTER_SECRET в виде шестнадцатеричной строки для соединения с сервером, если исходящее соединение установлено по транспортному протоколу TLS 1.3. Требуется OpenSSL >= 1.1.1. Это один из ключей, выгружаемых обратным вызовом keylog OpenSSL для формирования SSLKEYLOGFILE. Журналирование ключей SSL необходимо включить директивой “tune.ssl.keylog on” в секции global. См. также “tune.ssl.keylog”.

ssl_bc_is_resumed: boolean Возвращает true, когда соединение с сервером было установлено через транспортный уровень SSL/TLS и новая сессия SSL была возобновлена с использованием кэшированной сессии или билета TLS. Может использоваться в правилах tcp-check или http-check.

ssl_bc_npn: string Извлекает поле согласования следующего протокола из исходящего соединения, установленного через транспортный уровень TLS. Результат — строка, содержащая имя протокола, согласованного с сервером. Библиотека SSL должна быть скомпилирована с поддержкой расширений TLS (проверьте haproxy -vv). Обратите внимание, что расширение TLS NPN не объявляется, если на строке “server” не указан список протоколов с ключевым словом “npn”. Также ничто не заставляет сервер выбирать протокол из этого списка — может быть использован любой другой. Обратите внимание, что расширение TLS NPN было заменено на ALPN. Может использоваться в правилах tcp-check или http-check.

ssl_bc_protocol: string Возвращает имя используемого протокола при установке исходящего соединения через транспортный уровень SSL/TLS. Может использоваться в правилах tcp-check или http-check.

ssl_bc_server_handshake_traffic_secret: string Возвращает SERVER_HANDSHAKE_TRAFFIC_SECRET в виде шестнадцатеричной строки для соединения с сервером, если исходящее соединение установлено по транспортному протоколу TLS 1.3. Требуется OpenSSL >= 1.1.1. Это один из ключей, выгружаемых обратным вызовом keylog OpenSSL для формирования SSLKEYLOGFILE. Журналирование ключей SSL необходимо включить директивой “tune.ssl.keylog on” в секции global. См. также “tune.ssl.keylog”.

ssl_bc_server_random: binary Возвращает случайное значение сервера для соединения с сервером, когда входящее соединение было установлено через транспортный уровень SSL/TLS. Полезно для расшифровки трафика, отправленного с использованием эфемерных шифров. Требуется OpenSSL >= 1.1.0 или BoringSSL. Может использоваться в правилах tcp-check или http-check.

ssl_bc_server_traffic_secret_0: string Возвращает SERVER_TRAFFIC_SECRET_0 в виде шестнадцатеричной строки для соединения с сервером, если исходящее соединение установлено по транспортному протоколу TLS 1.3. Требуется OpenSSL >= 1.1.1. Это один из ключей, выгружаемых обратным вызовом keylog OpenSSL для формирования SSLKEYLOGFILE. Журналирование ключей SSL необходимо включить директивой “tune.ssl.keylog on” в секции global. См. также “tune.ssl.keylog”.

ssl_bc_session_id: binary Возвращает идентификатор SSL соединения с сервером, когда исходящее соединение было установлено через транспортный уровень SSL/TLS. Полезно для ведения журнала, если необходимо узнать, была ли сессия использована повторно. Может использоваться в правилах tcp-check или http-check.

ssl_bc_session_key: binary Возвращает главный ключ сессии SSL соединения с сервером, когда исходящее соединение было установлено через транспортный уровень SSL/TLS. Полезно для расшифровки трафика, отправленного с использованием эфемерных шифров. Требуется OpenSSL >= 1.1.0 или BoringSSL. Может использоваться в правилах tcp-check или http-check.

ssl_bc_sni: string Извлекает поле расширения TLS для указания имени сервера (SNI), использованное при подключении к серверу. Результат (при наличии) обычно представляет собой строку, соответствующую имени хоста HTTPS (не более 253 символов). Основное применение — ведение журнала и отладка (например, определение, какой SNI был использован при установлении соединения, для сопоставления с тем, что видел сервер).

ssl_bc_unique_id: binary Если исходящее соединение установлено по транспортному протоколу SSL/TLS, возвращает уникальный идентификатор TLS, определённый в RFC5929 раздел 3 . Этот идентификатор можно кодировать в base64 преобразователем “ssl_bc_unique_id,base64”. Можно использовать в наборе правил tcp-check либо http-check.

ssl_bc_use_keysize: integer Возвращает размер симметричного ключа шифрования в битах, использованный при установке исходящего соединения через транспортный уровень SSL/TLS. Может использоваться в правилах tcp-check или http-check.

ssl_c_ca_err: integer Когда входящее соединение было установлено через транспортный уровень SSL/TLS, возвращает идентификатор первой обнаруженной ошибки при проверке сертификата клиента на глубине > 0, или 0, если при этой проверке не было обнаружено ошибок. См. документацию вашей библиотеки SSL для получения полного списка кодов ошибок.

ssl_c_ca_err_depth: integer Когда входящее соединение было установлено через транспортный уровень SSL/TLS, возвращает глубину в цепочке CA первой обнаруженной ошибки при проверке сертификата клиента. Если ошибок не обнаружено, возвращается 0.

ssl_c_chain_der: binary Возвращает цепочку сертификатов в формате DER, представленную клиентом, когда входящее соединение было установлено через транспортный уровень SSL/TLS. При использовании для ACL значения для сравнения могут передаваться в шестнадцатеричном виде. Результат можно разобрать с помощью любой библиотеки, поддерживающей данные ASN.1 DER. В настоящее время не поддерживает возобновлённые сессии.

ssl_c_der: binary Возвращает сертификат, представленный клиентом, в формате DER, когда входящее соединение было установлено через транспортный уровень SSL/TLS. При использовании для ACL значения для сравнения могут передаваться в шестнадцатеричном виде.

ssl_c_err: integer Когда входящее соединение было установлено через транспортный уровень SSL/TLS, возвращает идентификатор первой обнаруженной ошибки при проверке на глубине 0, или 0, если при этой проверке не было обнаружено ошибок. См. документацию вашей библиотеки SSL для получения полного списка кодов ошибок.

ssl_c_i_dn([<entry>[,<occ>[,<format>]]]): string

ssl_c_i_dn([<entry>[,<occ>[,<format>]]]): string

Когда входящее соединение установлено по транспортному протоколу SSL/TLS, возвращает полное различимое имя (DN) издателя сертификата, представленного клиентом, если <entry> не указан, либо значение первого вхождения указанного элемента, найденного с начала DN. Если необязательным вторым аргументом задан положительный/отрицательный номер вхождения, возвращается значение n-го вхождения указанного элемента с начала/конца DN. Например, “ssl_c_i_dn(OU,2)” возвращает второе подразделение организации, а “ssl_c_i_dn(CN)” — общее имя. Параметр <format> позволяет получить DN, пригодный для использования различными протоколами. Сейчас поддерживается rfc2253 для LDAP v3. Если требуется изменить только формат, первыми двумя параметрами можно указать пустую строку и ноль. Пример: ssl_c_i_dn(,0,rfc2253). Если значение ASN.1 запрашиваемого элемента (либо, когда <entry> не указан, любого элемента в DN) содержит встроенный байт NUL, за которым следуют другие данные, это значение считается некорректным и данные не возвращаются.

ssl_c_key_alg: string Возвращает имя алгоритма, использованного для генерации ключа сертификата, представленного клиентом, когда входящее соединение было установлено через транспортный уровень SSL/TLS.

ssl_c_notafter: string Возвращает дату окончания, представленную клиентом, в виде отформатированной строки YYMMDDhhmmss[Z], когда входящее соединение было установлено через транспортный уровень SSL/TLS.

ssl_c_notbefore: string Возвращает дату начала, представленную клиентом, в виде отформатированной строки YYMMDDhhmmss[Z], когда входящее соединение было установлено через транспортный уровень SSL/TLS.

ssl_c_r_dn([<entry>[,<occ>[,<format>]]]): string

ssl_c_r_dn([<entry>[,<occ>[,<format>]]]): string

Когда входящее соединение установлено по транспортному протоколу SSL/TLS и успешно проверено с использованием заданного ca-file, возвращает полное различимое имя (DN) корневого CA сертификата, представленного клиентом, если <entry> не указан, либо значение первого вхождения указанного элемента, найденного с начала DN. Если необязательным вторым аргументом задан положительный/отрицательный номер вхождения, возвращается значение n-го вхождения указанного элемента с начала/конца DN. Например, “ssl_c_r_dn(OU,2)” возвращает второе подразделение организации, а “ssl_c_r_dn(CN)” — общее имя. Параметр <format> позволяет получить DN, пригодный для использования различными протоколами. Сейчас поддерживается rfc2253 для LDAP v3. Если требуется изменить только формат, первыми двумя параметрами можно указать пустую строку и ноль. Пример: ssl_c_r_dn(,0,rfc2253). Если значение ASN.1 запрашиваемого элемента (либо, когда <entry> не указан, любого элемента в DN) содержит встроенный байт NUL, за которым следуют другие данные, это значение считается некорректным и данные не возвращаются.

ssl_c_s_dn([<entry>[,<occ>[,<format>]]]): string

ssl_c_s_dn([<entry>[,<occ>[,<format>]]]): string

Когда входящее соединение установлено по транспортному протоколу SSL/TLS, возвращает полное различимое имя (DN) субъекта сертификата, представленного клиентом, если <entry> не указан, либо значение первого вхождения указанного элемента, найденного с начала DN. Если необязательным вторым аргументом задан положительный/отрицательный номер вхождения, возвращается значение n-го вхождения указанного элемента с начала/конца DN. Например, “ssl_c_s_dn(OU,2)” возвращает второе подразделение организации, а “ssl_c_s_dn(CN)” — общее имя. Параметр <format> позволяет получить DN, пригодный для использования различными протоколами. Сейчас поддерживается rfc2253 для LDAP v3. Если требуется изменить только формат, первыми двумя параметрами можно указать пустую строку и ноль. Пример: ssl_c_s_dn(,0,rfc2253). Если значение ASN.1 запрашиваемого элемента (либо, когда <entry> не указан, любого элемента в DN) содержит встроенный байт NUL, за которым следуют другие данные, это значение считается некорректным и данные не возвращаются.

ssl_c_san: string Когда входящее соединение было установлено через транспортный уровень SSL/TLS, и предоставлен сертификат клиента, возвращает строку с перечислением полей альтернативных имён субъекта (Subject Alt Name), содержащихся в данном сертификате, разделённых запятыми.

Можно использовать для проверки сертификата клиента.

Пример:

acl is_valid_client_cert ssl_c_used && ! ssl_c_verify
http-request set-header X-SSL-Client-SAN %[ssl_c_san] if is_valid_client_cert

Результат:

X-SSL-Client-SAN: IP Address:127.0.0.1, IP Address:127.0.0.2, IP Address:127.0.0.3, URI:http://docs.haproxy.org/2.7/, DNS:ca.tests.haproxy.com

ssl_c_serial: binary Возвращает серийный номер сертификата, представленного клиентом, когда входящее соединение было установлено через транспортный уровень SSL/TLS. При использовании для ACL значения для сравнения могут передаваться в шестнадцатеричном виде.

ssl_c_sha1: binary Возвращает отпечаток SHA-1 сертификата, представленного клиентом, если входящее соединение установлено по транспортному протоколу SSL/TLS. Можно использовать для привязки клиента к серверу либо передачи этой информации серверу. Выходные данные двоичные, поэтому для передачи этого отпечатка серверу его нужно кодировать в hex либо base64, как в примере ниже:

Пример:

http-request set-header X-SSL-Client-SHA1 %[ssl_c_sha1,hex]

ssl_c_sig_alg: string Возвращает имя алгоритма, использованного для подписи сертификата, представленного клиентом, когда входящее соединение было установлено через транспортный уровень SSL/TLS.

ssl_c_used: boolean Возвращает true, если текущий сеанс SSL использует сертификат клиента, даже если текущее соединение использует возобновление сеанса SSL. См. также “ssl_fc_has_crt”.

ssl_c_verify: integer Возвращает идентификатор ошибки проверки при входящем соединении, установленном через транспортный уровень SSL/TLS, в противном случае — ноль, если ошибок не обнаружено. См. документацию вашей библиотеки SSL для получения полного списка кодов ошибок.

ssl_c_version: integer Возвращает версию сертификата, предоставленного клиентом, если входящее соединение установлено через транспортный уровень SSL/TLS.

ssl_f_der: binary Возвращает сертификат, представленный фронтендом, в формате DER, когда входящее соединение было установлено через транспортный уровень SSL/TLS. При использовании для ACL значения для сравнения могут передаваться в шестнадцатеричном виде.

ssl_f_i_dn([<entry>[,<occ>[,<format>]]]): string

ssl_f_i_dn([<entry>[,<occ>[,<format>]]]): string

Когда входящее соединение установлено по транспортному протоколу SSL/TLS, возвращает полное различимое имя (DN) издателя сертификата, представленного фронтендом, если <entry> не указан, либо значение первого вхождения указанного элемента, найденного с начала DN. Если необязательным вторым аргументом задан положительный/отрицательный номер вхождения, возвращается значение n-го вхождения указанного элемента с начала/конца DN. Например, “ssl_f_i_dn(OU,2)” возвращает второе подразделение организации, а “ssl_f_i_dn(CN)” — общее имя. Параметр <format> позволяет получить DN, пригодный для использования различными протоколами. Сейчас поддерживается rfc2253 для LDAP v3. Если требуется изменить только формат, первыми двумя параметрами можно указать пустую строку и ноль. Пример: ssl_f_i_dn(,0,rfc2253). Если значение ASN.1 запрашиваемого элемента (либо, когда <entry> не указан, любого элемента в DN) содержит встроенный байт NUL, за которым следуют другие данные, это значение считается некорректным и данные не возвращаются.

ssl_f_key_alg: string Возвращает имя алгоритма, использованного для генерации ключа сертификата, представленного фронтендом, когда входящее соединение было установлено через транспортный уровень SSL/TLS.

ssl_f_notafter: string Возвращает дату окончания, представленную фронтендом, в виде отформатированной строки YYMMDDhhmmss[Z], когда входящее соединение было установлено через транспортный уровень SSL/TLS.

ssl_f_notbefore: string Возвращает дату начала, представленную фронтендом, в виде отформатированной строки YYMMDDhhmmss[Z], когда входящее соединение было установлено через транспортный уровень SSL/TLS.

ssl_f_s_dn([<entry>[,<occ>[,<format>]]]): string

ssl_f_s_dn([<entry>[,<occ>[,<format>]]]): string

Когда входящее соединение установлено по транспортному протоколу SSL/TLS, возвращает полное различимое имя (DN) субъекта сертификата, представленного фронтендом, если <entry> не указан, либо значение первого вхождения указанного элемента, найденного с начала DN. Если необязательным вторым аргументом задан положительный/отрицательный номер вхождения, возвращается значение n-го вхождения указанного элемента с начала/конца DN. Например, “ssl_f_s_dn(OU,2)” возвращает второе подразделение организации, а “ssl_f_s_dn(CN)” — общее имя. Параметр <format> позволяет получить DN, пригодный для использования различными протоколами. Сейчас поддерживается rfc2253 для LDAP v3. Если требуется изменить только формат, первыми двумя параметрами можно указать пустую строку и ноль. Пример: ssl_f_s_dn(,0,rfc2253). Если значение ASN.1 запрашиваемого элемента (либо, когда <entry> не указан, любого элемента в DN) содержит встроенный байт NUL, за которым следуют другие данные, это значение считается некорректным и данные не возвращаются.

ssl_f_serial: binary Возвращает серийный номер сертификата, представленного фронтендом, когда входящее соединение было установлено через транспортный уровень SSL/TLS. При использовании для ACL значения для сравнения могут передаваться в шестнадцатеричном виде.

ssl_f_sha1: binary Возвращает отпечаток SHA-1 сертификата, представленного фронтендом, если входящее соединение установлено по транспортному протоколу SSL/TLS. Можно использовать, чтобы узнать, какой сертификат был выбран с помощью SNI.

ssl_f_sig_alg: string Возвращает имя алгоритма, использованного для подписи сертификата, представленного фронтендом, когда входящее соединение было установлено через транспортный уровень SSL/TLS.

ssl_f_version: integer Возвращает версию сертификата, предоставленного фронтендом, если входящее соединение установлено через транспортный уровень SSL/TLS.

ssl_fc: boolean Возвращает true, когда соединение с клиентом было установлено через транспортный уровень SSL/TLS и расшифровано локально. Это означает, что оно соответствует сокету, объявленному с помощью строки “bind” с опцией “ssl”.

Пример:

# This passes "X-Proto: https" to servers when client connects over SSL
listen http-https
    bind :80
    bind :443 ssl crt /etc/haproxy.pem
    http-request add-header X-Proto https if { ssl_fc }

ssl_fc_alg_keysize: integer Возвращает поддерживаемую длину ключа симметричного шифра в битах, если входящее соединение установлено через транспортный уровень SSL/TLS.

ssl_fc_alpn: string Извлекает поле согласования протокола прикладного уровня из входящего соединения, установленного через транспортный уровень TLS и расшифрованного локально HAProxy. Результат — строка, содержащая имя протокола, объявленное клиентом. Библиотека SSL должна быть собрана с поддержкой расширений TLS (проверьте haproxy -vv). Обратите внимание, что расширение TLS ALPN не объявляется, если ключевое слово “alpn” в строке “bind” не указывает список протоколов. Также ничто не заставляет клиента выбирать протокол из этого списка — может быть запрошен любой другой. Расширение TLS ALPN предназначено для замены расширения TLS NPN. См. также “ssl_fc_npn”.

ssl_fc_cipher: string Возвращает имя используемого шифра, если входящее соединение установлено через транспортный уровень SSL/TLS.

ssl_fc_cipherlist_bin([<filter_option>]): binary

ssl_fc_cipherlist_bin([<filter_option>]): binary

Возвращает двоичную форму списка шифров сообщения ClientHello. Максимальная длина возвращаемого значения ограничена размером общего буфера захвата, управляемым параметром “tune.ssl.capture-buffer-size”. Аргумент <filter_option> позволяет фильтровать возвращаемые данные. Допустимые значения:

0: вернуть полный список шифров (по умолчанию)
1: исключить значения GREASE (RFC8701) из результата

Пример:

http-request set-header X-SSL-JA3 %[ssl_fc_protocol_hello_id],\
    %[ssl_fc_cipherlist_bin(1),be2dec(-,2)],\
    %[ssl_fc_extlist_bin(1),be2dec(-,2)],\
    %[ssl_fc_eclist_bin(1),be2dec(-,2)],\
    %[ssl_fc_ecformats_bin,be2dec(-,1)]
acl is_malware req.fhdr(x-ssl-ja3),digest(md5),hex \
    -f /path/to/file/with/malware-ja3.lst
http-request set-header X-Malware True if is_malware
http-request set-header X-Malware False if !is_malware

ssl_fc_cipherlist_hex([<filter_option>]): string

ssl_fc_cipherlist_hex([<filter_option>]): string

Возвращает двоичную форму списка шифров сообщения ClientHello в шестнадцатеричной кодировке. Максимальная длина возвращаемого значения ограничена размером общего буфера захвата, управляемым параметром “tune.ssl.capture-buffer-size”. Аргумент <filter_option> позволяет фильтровать возвращаемые данные. Допустимые значения:

0: вернуть полный список шифров (по умолчанию)
1: исключить значения GREASE (RFC8701) из результата

ssl_fc_cipherlist_str([<filter_option>]): string

ssl_fc_cipherlist_str([<filter_option>]): string

Возвращает декодированную текстовую форму списка шифров сообщения ClientHello. Максимальная длина возвращаемого значения ограничена размером общего буфера захвата, управляемым параметром “tune.ssl.capture-buffer-size”. Аргумент <filter_option> позволяет фильтровать возвращаемые данные. Допустимые значения:

0: вернуть полный список шифров (по умолчанию)
1: исключить значения GREASE (RFC8701) из результата

Этот метод извлечения образца доступен только с OpenSSL >= 1.0.2. Если функция не включена, он возвращает хеш, как “ssl_fc_cipherlist_xxh”.

ssl_fc_cipherlist_xxh: integer Возвращает xxh64 списка шифров. Этот хеш возвращается только при значении “tune.ssl.capture-buffer-size” больше 0, однако при вычислении хеша учитываются все данные списка шифров.

ssl_fc_client_early_traffic_secret: string Возвращает CLIENT_EARLY_TRAFFIC_SECRET в виде шестнадцатеричной строки для соединения с клиентом, если входящее соединение установлено по транспортному протоколу TLS 1.3. Требуется OpenSSL >= 1.1.1. Это один из ключей, выгружаемых обратным вызовом keylog OpenSSL для формирования SSLKEYLOGFILE. Журналирование ключей SSL необходимо включить директивой “tune.ssl.keylog on” в секции global. См. также “tune.ssl.keylog”.

ssl_fc_client_handshake_traffic_secret: string Возвращает CLIENT_HANDSHAKE_TRAFFIC_SECRET в виде шестнадцатеричной строки для соединения с клиентом, если входящее соединение установлено по транспортному протоколу TLS 1.3. Требуется OpenSSL >= 1.1.1. Это один из ключей, выгружаемых обратным вызовом keylog OpenSSL для формирования SSLKEYLOGFILE. Журналирование ключей SSL необходимо включить директивой “tune.ssl.keylog on” в секции global. См. также “tune.ssl.keylog”.

ssl_fc_client_random: binary Возвращает случайное значение клиента для соединения с клиентом, когда входящее соединение было установлено через транспортный уровень SSL/TLS. Полезно для расшифровки трафика, отправленного с использованием эфемерных шифров. Требуется OpenSSL >= 1.1.0 или BoringSSL.

ssl_fc_client_traffic_secret_0: string Возвращает CLIENT_TRAFFIC_SECRET_0 в виде шестнадцатеричной строки для соединения с клиентом, если входящее соединение установлено по транспортному протоколу TLS 1.3. Требуется OpenSSL >= 1.1.1. Это один из ключей, выгружаемых обратным вызовом keylog OpenSSL для формирования SSLKEYLOGFILE. Журналирование ключей SSL необходимо включить директивой “tune.ssl.keylog on” в секции global. См. также “tune.ssl.keylog”.

ssl_fc_crtname: string Возвращает имя сертификата, выбранного для входящего соединения SSL/TLS. Это имя соответствует тому, что отображается в команде “show ssl cert”: может быть именем файла с относительным или абсолютным путём, либо псевдонимом, в зависимости от способа объявления сертификата в конфигурации.

Пример:

crt-store example
    load crt "example.com.pem"

frontend www
    bind *:443 ssl crt "@example/example.com.pem"
    acl match_certificate ssl_fc_crtname -m beg -i "@example/"
    http-request set-header X-Cert-Name %[ssl_fc_crtname] if match_certificate

ssl_fc_curve: string Возвращает имя кривой, используемой при согласовании ключей, когда входящее соединение было установлено через транспортный уровень SSL/TLS. Требуется OpenSSL >= 3.0.0.

ssl_fc_early_rcvd: boolean Возвращает true, если на этом соединении были получены данные до завершения рукопожатия, независимо от того, завершено ли оно. У него нет практических применений при обработке трафика, однако это практически единственный способ “увидеть”, что клиент использовал 0-RTT для отправки данных до завершения рукопожатия, и иногда полезен при отладке, поскольку альтернативы — захват сетевого трафика или логирование флагов соединения с клиентом с последующим сопоставлением в коде. Может также быть полезен для сбора статистики по возможностям клиентов. См. также “ssl_fc_has_early”.

ssl_fc_early_exporter_secret: string Возвращает EARLY_EXPORTER_SECRET в виде шестнадцатеричной строки для соединения с клиентом, если входящее соединение установлено по транспортному протоколу TLS 1.3. Требуется OpenSSL >= 1.1.1. Это один из ключей, выгружаемых обратным вызовом keylog OpenSSL для формирования SSLKEYLOGFILE. Журналирование ключей SSL необходимо включить директивой “tune.ssl.keylog on” в секции global. См. также “tune.ssl.keylog”.

ssl_fc_ecformats_bin: binary Возвращает двоичную форму списка форматов точек эллиптических кривых, поддерживаемых в сообщении ClientHello. Максимальная длина возвращаемого значения ограничена размером общей буферной области захвата, управляемой параметром “tune.ssl.capture-buffer-size”.

Пример:

http-request set-header X-SSL-JA3 %[ssl_fc_protocol_hello_id],\
    %[ssl_fc_cipherlist_bin(1),be2dec(-,2)],\
    %[ssl_fc_extlist_bin(1),be2dec(-,2)],\
    %[ssl_fc_eclist_bin(1),be2dec(-,2)],\
    %[ssl_fc_ecformats_bin,be2dec(-,1)]
acl is_malware req.fhdr(x-ssl-ja3),digest(md5),hex \
    -f /path/to/file/with/malware-ja3.lst
http-request set-header X-Malware True if is_malware
http-request set-header X-Malware False if !is_malware

ssl_fc_eclist_bin([<filter_option>]): binary

ssl_fc_eclist_bin([<filter_option>]): binary

Возвращает двоичную форму списка поддерживаемых эллиптических кривых в сообщении ClientHello. Максимальная длина возвращаемого значения ограничена размером общей буферной области захвата, управляемой параметром “tune.ssl.capture-buffer-size”. Параметр <filter_option> позволяет фильтровать возвращаемые данные. Допустимые значения:

0: вернуть полный список поддерживаемых эллиптических кривых (по умолчанию)
1: исключить значения GREASE (RFC8701) из результата

Пример:

http-request set-header X-SSL-JA3 %[ssl_fc_protocol_hello_id],\
    %[ssl_fc_cipherlist_bin(1),be2dec(-,2)],\
    %[ssl_fc_extlist_bin(1),be2dec(-,2)],\
    %[ssl_fc_eclist_bin(1),be2dec(-,2)],\
    %[ssl_fc_ecformats_bin,be2dec(-,1)]
acl is_malware req.fhdr(x-ssl-ja3),digest(md5),hex \
    -f /path/to/file/with/malware-ja3.lst
http-request set-header X-Malware True if is_malware
http-request set-header X-Malware False if !is_malware

ssl_fc_err: integer При входящем соединении, установленном через транспортный уровень SSL/TLS, возвращает идентификатор последней ошибки из первого стека ошибок, возникшего на стороне фронтенда, или 0, если ошибка не была обнаружена. Может использоваться для выявления ошибок, связанных с рукопожатием, кроме ошибок проверки (например, несоответствие шифров), а также других ошибок чтения или записи, возникших в течение жизненного цикла соединения. Любые ошибки, возникающие при процессе проверки сертификата клиента, не будут переданы через это извлечение, а будут переданы через существующие извлечения “ssl_c_err”, “ssl_c_ca_err” и “ssl_c_ca_err_depth”. Чтобы получить текстовое описание этого кода ошибки, можно использовать извлечение образца “ssl_fc_err_str” или команду “openssl errstr” (принимает код ошибки в шестнадцатеричном виде). Обратитесь к документации вашей библиотеки SSL для получения полного списка кодов ошибок.

ssl_fc_err_str: string При входящем соединении, установленном через транспортный уровень SSL/TLS, возвращает строковое представление последней ошибки из первого стека ошибок, возникшего на стороне фронтенда. Любые ошибки, возникающие при проверке сертификата клиента, не будут переданы через это извлечение. См. также “ssl_fc_err”.

ssl_fc_exporter_secret: string Возвращает EXPORTER_SECRET в виде шестнадцатеричной строки для соединения с клиентом, если входящее соединение установлено по транспортному протоколу TLS 1.3. Требуется OpenSSL >= 1.1.1. Это один из ключей, выгружаемых обратным вызовом keylog OpenSSL для формирования SSLKEYLOGFILE. Журналирование ключей SSL необходимо включить директивой “tune.ssl.keylog on” в секции global. См. также “tune.ssl.keylog”.

ssl_fc_extlist_bin([<filter_option>]): binary

ssl_fc_extlist_bin([<filter_option>]): binary

Возвращает двоичную форму списка расширений сообщения ClientHello. Максимальная длина возвращаемого значения ограничена размером общей буферной области захвата, управляемой параметром “tune.ssl.capture-buffer-size”. Параметр <filter_option> позволяет фильтровать возвращаемые данные. Допустимые значения:

0: вернуть полный список расширений (по умолчанию)
1: исключить значения GREASE (RFC8701) из результата

Пример:

http-request set-header X-SSL-JA3 %[ssl_fc_protocol_hello_id],\
    %[ssl_fc_cipherlist_bin(1),be2dec(-,2)],\
    %[ssl_fc_extlist_bin(1),be2dec(-,2)],\
    %[ssl_fc_eclist_bin(1),be2dec(-,2)],\
    %[ssl_fc_ecformats_bin,be2dec(-,1)]
acl is_malware req.fhdr(x-ssl-ja3),digest(md5),hex \
    -f /path/to/file/with/malware-ja3.lst
http-request set-header X-Malware True if is_malware
http-request set-header X-Malware False if !is_malware

ssl_fc_has_crt: boolean Возвращает true, если во входящем соединении по транспортному протоколу SSL/TLS присутствует сертификат клиента. Полезно, когда ‘verify’ задан как ‘optional’. Примечание: при возобновлении сессии SSL через Session ID или билет TLS сертификат клиента отсутствует в текущем соединении, но может быть извлечён из кеша либо билета. Поэтому для проверки того, использует ли текущая сессия SSL сертификат клиента, предпочтительнее “ssl_c_used”.

ssl_fc_has_early: boolean Возвращает true, если были отправлены данные до завершения рукопожатия, и рукопожатие ещё не завершено. Поскольку это имеет последствия для безопасности, полезно иметь возможность отклонять такие соединения или ждать завершения рукопожатия (с помощью действия “wait-for-handshake”). См. также “ssl_fc_early_rcvd”.

ssl_fc_has_sni: boolean Проверяет наличие расширения TLS для указания имени сервера (SNI) во входящем соединении, установленном через транспортный уровень SSL/TLS. Возвращает true, если входящее соединение содержит поле TLS SNI. Требуется, чтобы библиотека SSL была скомпилирована с поддержкой расширений TLS (проверьте haproxy -vv).

ssl_fc_is_resumed: boolean Возвращает true, если сессия SSL/TLS была восстановлена с использованием кэша сессий SSL или билетов TLS при входящем соединении через транспортный уровень SSL/TLS.

ssl_fc_npn: string Извлекает поле согласования следующего протокола из входящего соединения, установленного через транспортный уровень TLS и локально расшифрованного HAProxy. Результат — строка, содержащая имя протокола, объявленное клиентом. Библиотека SSL должна быть скомпилирована с поддержкой расширений TLS (проверьте haproxy -vv). Обратите внимание, что расширение TLS NPN не объявляется, если ключевое слово “npn” в строке “bind” не указывает список протоколов. Кроме того, клиент может выбрать любой другой протокол, не входящий в этот список. Обратите внимание, что расширение TLS NPN было заменено на ALPN.

ssl_fc_protocol: string Возвращает имя используемого протокола, если входящее соединение установлено через транспортный уровень SSL/TLS.

ssl_fc_protocol_hello_id: integer Версия протокола TLS, по которому клиент желает общаться в течение сессии, как указано в сообщении ClientHello. Значение может быть возвращено только при условии, что значение “tune.ssl.capture-buffer-size” установлено выше 0.

Пример:

http-request set-header X-SSL-JA3 %[ssl_fc_protocol_hello_id],\
    %[ssl_fc_cipherlist_bin(1),be2dec(-,2)],\
    %[ssl_fc_extlist_bin(1),be2dec(-,2)],\
    %[ssl_fc_eclist_bin(1),be2dec(-,2)],\
    %[ssl_fc_ecformats_bin,be2dec(-,1)]
acl is_malware req.fhdr(x-ssl-ja3),digest(md5),hex \
    -f /path/to/file/with/malware-ja3.lst
http-request set-header X-Malware True if is_malware
http-request set-header X-Malware False if !is_malware

ssl_fc_server_handshake_traffic_secret: string Возвращает SERVER_HANDSHAKE_TRAFFIC_SECRET в виде шестнадцатеричной строки для соединения с клиентом, если входящее соединение установлено по транспортному протоколу TLS 1.3. Требуется OpenSSL >= 1.1.1. Это один из ключей, выгружаемых обратным вызовом keylog OpenSSL для формирования SSLKEYLOGFILE. Журналирование ключей SSL необходимо включить директивой “tune.ssl.keylog on” в секции global. См. также “tune.ssl.keylog”.

ssl_fc_server_random: binary Возвращает случайное значение сервера для соединения с клиентом, когда входящее соединение было установлено через транспортный уровень SSL/TLS. Полезно для расшифровки трафика, отправленного с использованием эфемерных шифров. Требуется OpenSSL >= 1.1.0, или BoringSSL.

ssl_fc_server_traffic_secret_0: string Возвращает SERVER_TRAFFIC_SECRET_0 в виде шестнадцатеричной строки для соединения с клиентом, если входящее соединение установлено по транспортному протоколу TLS 1.3. Требуется OpenSSL >= 1.1.1. Это один из ключей, выгружаемых обратным вызовом keylog OpenSSL для формирования SSLKEYLOGFILE. Журналирование ключей SSL необходимо включить директивой “tune.ssl.keylog on” в секции global. См. также “tune.ssl.keylog”.

ssl_fc_session_id: binary Возвращает идентификатор SSL соединения с клиентом, когда входящее соединение было установлено через транспортный уровень SSL/TLS. Полезно для привязки определённого клиента к серверу. Важно отметить, что некоторые браузеры обновляют свой идентификатор сессии каждые несколько минут.

ssl_fc_session_key: binary Возвращает главный ключ сессии SSL соединения с клиентом, когда входящее соединение было установлено через транспортный уровень SSL/TLS. Полезно для расшифровки трафика, отправленного с использованием эфемерных шифров. Требуется OpenSSL >= 1.1.0, или BoringSSL.

ssl_fc_sigalgs_bin([<filter_option>]): binary

ssl_fc_sigalgs_bin([<filter_option>]): binary

Возвращает содержимое расширения signatures_algorithms (13) TLS, представленного в сообщении ClientHello. Предоставляет двоичный список алгоритмов, представленных 2 байтами, определённых в TLS RFC: https://datatracker.ietf.org/doc/html/rfc8446#section-4.2.3 .

Значение может быть возвращено только при условии, что значение “tune.ssl.capture-buffer-size” установлено выше 0. Параметр <filter_option> позволяет фильтровать возвращаемые данные. Допустимые значения: 0: возвращает полный список шифров (по умолчанию) 1: исключает значения GREASE (RFC8701) из вывода

ssl_fc_sni: string Извлекает поле расширения TLS для указания имени сервера (SNI) из входящего соединения, установленного через транспортный уровень SSL/TLS и локально расшифрованного HAProxy. Результат (при наличии) обычно представляет собой строку, соответствующую имени хоста HTTPS (не более 253 символов). Библиотека SSL должна быть скомпилирована с поддержкой расширений TLS (проверьте haproxy -vv).

В отличие от “req.ssl_sni” выше, это извлечение применяется к соединению, расшифровываемому HAProxy, а не к содержимому SSL, пересылаемому без анализа. См. также “ssl_fc_sni_end” и “ssl_fc_sni_reg” ниже. Требуется библиотека SSL, собранная с включённой поддержкой расширений TLS (проверьте haproxy -vv).

ОСТОРОЖНО! За исключением весьма специфических условий, использовать это поле вместо поля заголовка HTTP “Host” обычно некорректно. Например, при пересылке соединения HTTPS серверу поле SNI необходимо задавать по заголовку HTTP Host с помощью “req.hdr(host)”, а не по значению SNI со стороны клиента. Причина в том, что SNI используется исключительно для выбора сертификата, который представит сторона сервера, после чего клиентам разрешается отправлять запросы с различными значениями Host, если они соответствуют именам в сертификате. Поэтому “ssl_fc_sni” обычно не следует использовать как аргумент ключевого слова “sni” сервера, кроме случая, когда бэкенд работает в режиме TCP.

Производные ACL:

ssl_fc_sni_end: сопоставление по суффиксу
ssl_fc_sni_reg: сопоставление по регулярному выражению

ssl_fc_supported_versions_bin([<filter_option>]): binary

ssl_fc_supported_versions_bin([<filter_option>]): binary

Возвращает содержимое расширения TLS supported_versions (43), представленного в сообщении ClientHello. Это двоичный список версий по 2 байта каждая: TLSv1.3 (0x0304), TLSv1.2 (0x0303).

Значение может быть возвращено только при условии, что значение “tune.ssl.capture-buffer-size” установлено выше 0. Параметр <filter_option> позволяет фильтровать возвращаемые данные. Допустимые значения: 0: возвращает полный список шифров (по умолчанию) 1: исключает значения GREASE (RFC8701) из вывода

ssl_fc_unique_id: binary Если входящее соединение установлено по транспортному протоколу SSL/TLS, возвращает уникальный идентификатор TLS, определённый в RFC5929 раздел 3 . Этот идентификатор можно кодировать в base64 преобразователем “ssl_fc_unique_id,base64”.

ssl_fc_use_keysize: integer Возвращает используемую длину ключа симметричного шифра в битах, если входящее соединение установлено через транспортный уровень SSL/TLS.

ssl_s_chain_der: binary Возвращает цепочку сертификатов в формате DER, представленную сервером при установке исходящего соединения через транспортный уровень SSL/TLS. При использовании для ACL значения, с которыми нужно сравнивать, могут передаваться в шестнадцатеричном виде. Результат можно разобрать любой библиотекой, поддерживающим данные ASN.1 DER. Это извлечение пока не поддерживает возобновлённые сессии.

ssl_s_der: binary Возвращает сертификат в формате DER, представленный сервером при установке исходящего соединения через транспортный уровень SSL/TLS. При использовании для ACL значения, с которыми нужно сравнивать, могут передаваться в шестнадцатеричном виде.

ssl_s_i_dn([<entry>[,<occ>[,<format>]]]): string

ssl_s_i_dn([<entry>[,<occ>[,<format>]]]): string

Когда исходящее соединение установлено по транспортному протоколу SSL/TLS, возвращает полное различимое имя (DN) издателя сертификата, представленного сервером, если <entry> не указан, либо значение первого вхождения указанного элемента, найденного с начала DN. Если необязательным вторым аргументом задан положительный/отрицательный номер вхождения, возвращается значение n-го вхождения указанного элемента с начала/конца DN. Например, “ssl_s_i_dn(OU,2)” возвращает второе подразделение организации, а “ssl_s_i_dn(CN)” — общее имя. Параметр <format> позволяет получить DN, пригодный для использования различными протоколами. Сейчас поддерживается rfc2253 для LDAP v3. Если требуется изменить только формат, первыми двумя параметрами можно указать пустую строку и ноль. Пример: ssl_s_i_dn(,0,rfc2253). Если значение ASN.1 запрашиваемого элемента (либо, когда <entry> не указан, любого элемента в DN) содержит встроенный байт NUL, за которым следуют другие данные, это значение считается некорректным и данные не возвращаются.

ssl_s_key_alg: string Возвращает имя алгоритма, использованного для генерации ключа сертификата, представленного сервером при установке исходящего соединения через транспортный уровень SSL/TLS.

ssl_s_notafter: string Возвращает дату окончания, представленную сервером в виде отформатированной строки YYMMDDhhmmss[Z] при установке исходящего соединения через транспортный уровень SSL/TLS.

ssl_s_notbefore: string Возвращает дату начала, представленную сервером в виде отформатированной строки YYMMDDhhmmss[Z] при установке исходящего соединения через транспортный уровень SSL/TLS.

ssl_s_s_dn([<entry>[,<occ>[,<format>]]]): string

ssl_s_s_dn([<entry>[,<occ>[,<format>]]]): string

Когда исходящее соединение установлено по транспортному протоколу SSL/TLS, возвращает полное различимое имя (DN) субъекта сертификата, представленного сервером, если <entry> не указан, либо значение первого вхождения указанного элемента, найденного с начала DN. Если необязательным вторым аргументом задан положительный/отрицательный номер вхождения, возвращается значение n-го вхождения указанного элемента с начала/конца DN. Например, “ssl_s_s_dn(OU,2)” возвращает второе подразделение организации, а “ssl_s_s_dn(CN)” — общее имя. Параметр <format> позволяет получить DN, пригодный для использования различными протоколами. Сейчас поддерживается rfc2253 для LDAP v3. Если требуется изменить только формат, первыми двумя параметрами можно указать пустую строку и ноль. Пример: ssl_s_s_dn(,0,rfc2253). Если значение ASN.1 запрашиваемого элемента (либо, когда <entry> не указан, любого элемента в DN) содержит встроенный байт NUL, за которым следуют другие данные, это значение считается некорректным и данные не возвращаются.

ssl_s_serial: binary Возвращает серийный номер сертификата, представленного сервером при установке исходящего соединения через транспортный уровень SSL/TLS. При использовании для ACL значения, с которыми нужно сравнивать, могут передаваться в шестнадцатеричном виде.

ssl_s_sha1: binary Возвращает отпечаток SHA-1 сертификата, представленного сервером при установке исходящего соединения через транспортный уровень SSL/TLS. Это может использоваться для определения, какой сертификат был выбран с помощью SNI.

ssl_s_sig_alg: string Возвращает имя алгоритма, использованного для подписи сертификата, представленного сервером при установке исходящего соединения через транспортный уровень SSL/TLS.

ssl_s_version: integer Возвращает версию сертификата, предоставленного сервером, если исходящее соединение установлено через транспортный уровень SSL/TLS.

txn.timer.user: integer Полное оценочное время с точки зрения клиента от момента принятия соединения прокси до закрытия обоих концов, без времени простоя. Соответствует %Tu в log-format и выражается в миллисекундах (ms). Подробнее см. раздел 8.4 «Временные события».

7.3.5. Извлечение образцов из содержимого буферов (уровень 6)

Извлечение образцов из содержимого буфера отличается от предыдущих извлечений образцов тем, что извлекаемые данные являются временными. Эти данные можно использовать только тогда, когда они доступны, и будут потеряны при передаче. В связи с этим образцы, извлечённые из содержимого буфера во время запроса, не могут быть использованы в ответе, например. Даже во время извлечения данные могут изменяться. Иногда необходимо установить задержки или объединить несколько методов извлечения образцов, чтобы гарантировать, что ожидаемые данные будут полными и пригодными к использованию, например, с помощью проверки содержимого запроса TCP. Подробнее см. ключевое слово “tcp-request content”.

Предупреждение: следующие извлечения образцов игнорируются, если используются в прокси HTTP. Они работают только с сырыми данными, найденными в буферах. С другой стороны, прокси HTTP используют структурированные данные. Таким образом, сырое представление этих данных не имеет смысла. При использовании ACL, зависящего от одного из следующих извлечений образцов, выдаётся предупреждение. Однако невозможно обнаружить все некорректные случаи использования (например, внутри пользовательского формата журнала или выражения образца). Будьте осторожны.

Сводка методов извлечения образцов в этом разделе и их соответствующие типы:

  Ключевое слово                                      Выходной тип
----------------------------------------------------+-------------
distcc_body(<token>[,<occ>])                          binary
distcc_param(<token>[,<occ>])                         integer
payload(<offset>,<length>)                            binary
payload_lv(<offset1>,<length>[,<offset2>])            binary
rdp_cookie([<name>])                                  string
rdp_cookie_cnt([name])                                integer
rep_ssl_hello_type                                    integer
req.len                                               integer
req.payload(<offset>,<length>)                        binary
req.payload_lv(<offset1>,<length>[,<offset2>])        binary
req.proto_http                                        boolean
req.rdp_cookie([<name>])                              string
req.rdp_cookie_cnt([name])                            integer
req.ssl_alpn                                          string
req.ssl_cipherlist                                    binary
req.ssl_ec_ext                                        boolean
req.ssl_hello_type                                    integer
req.ssl_keyshare_groups                               binary
req.ssl_sigalgs                                       binary
req.ssl_sni                                           string
req.ssl_st_ext                                        integer
req.ssl_supported_groups                              binary
req.ssl_ver                                           integer
req_len                                               integer
req_proto_http                                        boolean
req_ssl_hello_type                                    integer
req_ssl_sni                                           string
req_ssl_ver                                           integer
res.len                                               integer
res.payload(<offset>,<length>)                        binary
res.payload_lv(<offset1>,<length>[,<offset2>])        binary
res.ssl_hello_type                                    integer
----------------------------------------------------+-------------

Подробный список:

distcc_body(<token>[,<occ>]): binary

distcc_body(<token>[,<occ>]): binary

Анализирует сообщение distcc и возвращает тело, соответствующее вхождению #<occ> токена <token>. Вхождения начинаются с 1, и если номер не указан, может совпадать любое, хотя на практике пока проверяется только первое. Это можно использовать для извлечения имён файлов или аргументов в файлах, собранных с помощью distcc через HAProxy. См. документацию протокола distcc для полного списка поддерживаемых токенов.

distcc_param(<token>[,<occ>]): integer

distcc_param(<token>[,<occ>]): integer

Анализирует сообщение distcc и возвращает параметр, соответствующий вхождению #<occ> токена <token>. Вхождения начинаются с 1, и если номер не указан, может совпадать любое, хотя на практике пока проверяется только первое. Это можно использовать для извлечения определённой информации, такой как версия протокола, размер файла или аргумент в файлах, собранных с помощью distcc через HAProxy. Другой пример использования — ожидание начала содержимого предварительно обработанного файла перед подключением к серверу, чтобы избежать неактивных соединений. См. документацию протокола distcc для полного списка поддерживаемых токенов.

Пример:

# wait up to 20s for the pre-processed file to be uploaded
tcp-request inspect-delay 20s
tcp-request content accept if { distcc_param(DOTI) -m found }
# send large files to the big farm
use_backend big_farm if { distcc_param(DOTI) gt 1000000 }

payload(<offset>,<length>): binary (deprecated)

payload(<offset>,<length>): binary (deprecated)

Это псевдоним для “req.payload” при использовании в контексте запроса (например, “stick on”, “stick match”) и для “res.payload” при использовании в контексте ответа, например, в “stick store response”.

payload_lv(<offset1>,<length>[,<offset2>]): binary (deprecated)

payload_lv(<offset1>,<length>[,<offset2>]): binary (deprecated)

Это псевдоним для “req.payload_lv” при использовании в контексте запроса (например, “stick on”, “stick match”) и для “res.payload_lv” при использовании в контексте ответа, например, в “stick store response”.

req.len: integer req_len: integer (устарело) Возвращает целочисленное значение, соответствующее количеству байтов в буфере запроса. Используется в основном в ACL. Важно понимать, что этот тест не возвращает false, пока буфер изменяется. Это означает, что проверка на равенство нулю почти всегда немедленно совпадает в начале сессии, тогда как проверка наличия дополнительных данных будет ждать поступления данных и вернёт false только тогда, когда HAProxy уверен, что больше данных не поступит. Этот тест был разработан для использования с анализом содержимого запроса TCP.

req.payload(<offset>,<length>): binary

req.payload(<offset>,<length>): binary

Извлекает двоичный блок из <length> байтов, начиная с байта <offset> в буфере запроса. В качестве особого случая, если аргумент <length> равен нулю, извлекается весь буфер от <offset> до конца. Это можно использовать с ACL для проверки наличия определённого содержимого в буфере в любом месте.

Производные ACL:

req.payload(<offset>,<length>): двоичное сопоставление в шестнадцатеричном виде

req.payload_lv(<offset1>,<length>[,<offset2>]): binary

req.payload_lv(<offset1>,<length>[,<offset2>]): binary

Извлекает двоичный блок, размер которого записан в поле длиной <length> байтов по смещению <offset1>, а начало находится по смещению <offset2>, если оно указано, либо сразу после поля длины в буфере запроса. Параметр <offset2> также поддерживает относительные смещения, если перед ним стоит знак ‘+’ либо ‘-’.

Производные ACL:

req.payload_lv(<offset1>,<length>[,<offset2>]): двоичное сопоставление в шестнадцатеричном виде

Пример: см. пример для ключевого слова “stick store-response”.

req.proto_http: boolean req_proto_http: boolean (устарело) Возвращает true, когда данные в буфере запроса похожи на HTTP и правильно разбираются как HTTP. Используется тот же анализатор, что и для обычных запросов HTTP, поэтому неожиданностей быть не должно. Тест не даёт совпадения до завершения разбора запроса, ошибки или истечения тайм-аута. Можно использовать для указания протокола в журналах TCP, но основное применение — задерживать анализ запроса TCP до появления полного запроса HTTP в буфере, например для отслеживания заголовка.

Пример:

# track request counts per "base" (concatenation of Host+URL)
tcp-request inspect-delay 10s
tcp-request content reject if !HTTP
tcp-request content track-sc0 base table req-rate

req.rdp_cookie([<name>]): string

req.rdp_cookie([<name>]): string
rdp_cookie([<name>]): string (deprecated)

Когда буфер запроса похож на протокол RDP, извлекает cookie RDP <name> либо любой cookie, если имя не задано. Разбор проверяет только первый cookie, как показано в спецификации протокола RDP. Имя cookie нечувствительно к регистру. Обычно используется имя cookie “MSTS”, поскольку при надлежащей настройке клиента он может содержать имя пользователя клиента, подключающегося к серверу. Для привязки сеансов к серверам также часто используется cookie “MSTSHASH”.

Отличается от “balance rdp-cookie” тем, что может использоваться любой алгоритм балансировки, и поэтому распределение клиентов между серверами бэкенда не связано с хешем cookie RDP. Предполагается, что использование алгоритма балансировки, такого как “balance roundrobin” или “balance leastconn”, приведёт к более равномерному распределению клиентов между серверами бэкенда по сравнению с хешем, используемым в “balance rdp-cookie”.

Производные ACL:

req.rdp_cookie([<name>]): точное сопоставление строки

Пример:

listen tse-farm
    bind 0.0.0.0:3389
    # wait up to 5s for an RDP cookie in the request
    tcp-request inspect-delay 5s
    tcp-request content accept if RDP_COOKIE
    # apply RDP cookie persistence
    persist rdp-cookie
    # Persist based on the mstshash cookie
    # This is only useful makes sense if
    # balance rdp-cookie is not used
    stick-table type string size 204800
    stick on req.rdp_cookie(mstshash)
    server srv1 1.1.1.1:3389
    server srv1 1.1.1.2:3389

См. также “balance rdp-cookie”, “persist rdp-cookie”, “tcp-request” и ACL “req.rdp_cookie”.

req.rdp_cookie_cnt([name]): integer

req.rdp_cookie_cnt([name]): integer
rdp_cookie_cnt([name]): integer (deprecated)

Пытается разобрать буфер запроса как протокол RDP, затем возвращает целое число, соответствующее количеству найденных cookie RDP. Если указано необязательное имя cookie, учитываются только совпадающие по имени. Используется в основном в ACL.

Производные ACL:

req.rdp_cookie_cnt([<name>]): целочисленное сопоставление

req.ssl_alpn: string Возвращает строку со значениями расширения TLS согласования протокола прикладного уровня (ALPN, RFC7301), отправленного клиентом в сообщении SSL ClientHello. Обратите внимание, что это применяется только к необработанному содержимому буфера запроса, а не к содержимому, расшифрованному через слой данных SSL, поэтому не работает со строками “bind”, имеющими опцию “ssl”. Это полезно в ACL для принятия решения о маршрутизации на основе предпочтений ALPN клиента TLS, как в примере ниже. См. также “ssl_fc_alpn”. Это извлечение анализирует только первое сообщение ClientHello в буфере запроса; подробнее о последствиях этого ограничения (HelloRetryRequest, повторное согласование, Encrypted Client Hello) см. в документации ключевого слова “req.ssl_sni”.

Примеры:

# Wait for a client hello for at most 5 seconds
tcp-request inspect-delay 5s
tcp-request content accept if { req.ssl_hello_type 1 }
use_backend bk_acme if { req.ssl_alpn acme-tls/1 }
default_backend bk_default

req.ssl_cipherlist binary

req.ssl_cipherlist binary

Возвращает двоичную форму списка поддерживаемых клиентом вариантов симметричных шифров, указанных в содержимом сообщения ClientHello TLS. Обратите внимание, что это применяется только к сырым данным, найденным в буфере запроса, а не к данным, расшифрованным через уровень данных SSL, поэтому это не будет работать со строками “bind”, имеющими опцию “ssl”. См. “ssl_fc_cipherlist_bin”, который является эквивалентом для SSL bind, используемым при указании опции “ssl”. Это извлечение анализирует только первое сообщение ClientHello, найденное в буфере запроса, см. документацию ключевого слова “req.ssl_sni” для более подробной информации об ограничениях (HelloRetryRequest, повторное согласование, Encrypted Client Hello).

Примеры:

# Wait for a client hello for at most 5 seconds
tcp-request inspect-delay 5s
tcp-request content accept if { req.ssl_hello_type 1 }
use-server fe3 if { req.ssl_cipherlist,be2hex(:,2),lower -m sub 1302:009f }
server fe3  ${htst_fe3_addr}:${htst_fe3_port}

req.ssl_ec_ext: boolean Возвращает логическое значение, указывающее, отправил ли клиент расширение поддерживаемых эллиптических кривых, определённое в RFC4492, раздел 5.1 , в сообщении SSL ClientHello. Это позволяет предоставлять совместимым с ECC клиентам сертификат EC, а для всех остальных использовать RSA на том же адресе IP. Обратите внимание, что это применяется только к необработанному содержимому буфера запроса, а не к содержимому, расшифрованному через слой данных SSL, поэтому не работает со строками “bind”, имеющими опцию “ssl”. Это извлечение анализирует только первое сообщение ClientHello в буфере запроса; подробнее о последствиях этого ограничения (HelloRetryRequest, повторное согласование, Encrypted Client Hello) см. в документации ключевого слова “req.ssl_sni”.

req.ssl_hello_type: integer req_ssl_hello_type: integer (устарело) Возвращает целое число с типом сообщения приветствия SSL, найденного в буфере запроса, если данные буфера разбираются как полное сообщение приветствия клиента SSL (v3 или выше). Обратите внимание, что это применяется только к необработанному содержимому буфера запроса, а не к содержимому, расшифрованному через слой данных SSL, поэтому не работает со строками “bind”, имеющими опцию “ssl”. В основном используется в ACL для обнаружения сообщения приветствия SSL, которое предположительно содержит идентификатор сессии SSL, пригодный для привязки. Это извлечение анализирует только первое сообщение ClientHello в буфере запроса; подробнее о последствиях этого ограничения (HelloRetryRequest, повторное согласование, Encrypted Client Hello) см. в документации ключевого слова “req.ssl_sni”.

req.ssl_keyshare_groups binary

req.ssl_keyshare_groups binary

Возвращает двоичную форму списка криптографических параметров обмена ключами, поддерживаемых клиентом и указанных в TLS ClientHello. В TLS v1.3 keyshare входит в сообщение ClientHello и является последним расширением приветствия клиента. Обратите внимание, что это применяется только к необработанному содержимому буфера запроса, а не к содержимому, расшифрованному через слой данных SSL, поэтому не работает со строками “bind”, имеющими опцию “ssl”. Это извлечение анализирует только первое сообщение ClientHello в буфере запроса; подробнее о последствиях этого ограничения (HelloRetryRequest, повторное согласование, Encrypted Client Hello) см. в документации ключевого слова “req.ssl_sni”.

Примеры:

# Wait for a client hello for at most 5 seconds
tcp-request inspect-delay 5s
tcp-request content accept if { req.ssl_hello_type 1 }
use-server fe3 if { req.ssl_keyshare_groups,be2hex(:,2),lower -m sub 001d  }
server fe3  ${htst_fe3_addr}:${htst_fe3_port}

req.ssl_sigalgs binary

req.ssl_sigalgs binary

Возвращает двоичную форму списка алгоритмов подписи, поддерживаемых клиентом и указанных в TLS ClientHello. Он доступен как расширение приветствия клиента. Обратите внимание, что это применяется только к необработанному содержимому буфера запроса, а не к содержимому, расшифрованному через слой данных SSL, поэтому не работает со строками “bind”, имеющими опцию “ssl”. См. “ssl_fc_sigalgs_bin” — эквивалент для SSL bind, который можно использовать при указанной опции “ssl”. Это извлечение анализирует только первое сообщение ClientHello в буфере запроса; подробнее о последствиях этого ограничения (HelloRetryRequest, повторное согласование, Encrypted Client Hello) см. в документации ключевого слова “req.ssl_sni”.

Примеры:

# Wait for a client hello for at most 5 seconds
tcp-request inspect-delay 5s
tcp-request content accept if { req.ssl_hello_type 1 }
use-server fe4 if { req.ssl_sigalgs,be2hex(:,2),lower -m sub 0403:0805 }
server fe4  ${htst_fe4_addr}:${htst_fe4_port}

req.ssl_sni: string req_ssl_sni: string (устарело) Возвращает строку со значением расширения TLS имени сервера, отправленного клиентом в потоке TLS, проходящем через буфер запроса, если данные буфера разбираются как полное сообщение приветствия клиента SSL (v3 или выше). Обратите внимание, что это применяется только к необработанному содержимому буфера запроса, а не к содержимому, расшифрованному через слой данных SSL, поэтому не работает со строками “bind”, имеющими опцию “ssl”. Работает только с протоколами, использующими неявный TLS, такими как HTTPS (443), IMAPS (993), SMTPS (465), но не с протоколами с явным TLS, такими как SMTP (25/587) либо IMAP (143). SNI обычно содержит имя хоста, к которому клиент пытается подключиться (для современных браузеров). Этот тест предназначен для анализа содержимого запроса TCP. Если нужно переключение по содержимому, рекомендуется сначала дождаться полного приветствия клиента (тип 1), как в примере ниже. См. также “ssl_fc_sni”. Учитывайте, что по причинам, подробно описанным ниже (HelloRetryRequest, повторное согласование, Encrypted Client Hello), значение этого извлечения недостаточно надёжно для самостоятельного разрешения или запрета доступа к определённым хостам.

Это извлечение разбирает только первое сообщение ClientHello, найденное в буфере запроса. Если клиент отправляет несколько сообщений ClientHello в одном потоке TCP, например потому, что сервер запросил HelloRetryRequest (HRR) в рамках TLS 1.3, либо клиент начинает повторное согласование TLS (позже в том же потоке TCP отправляется новое ClientHello, возможно с другим SNI), возвращается только SNI самого первого ClientHello; содержимое любых последующих ClientHello игнорируется.

При использовании Encrypted Client Hello (ECH) в сети видно только “Outer” ClientHello, содержащее настоящее зашифрованное “Inner” ClientHello. В этом случае извлечение получает SNI из Outer ClientHello — подставной SNI, а не настоящий хост, к которому намерен обратиться клиент. Сейчас это извлечение не умеет расшифровывать или анализировать Inner ClientHello, поэтому при использовании ECH на него нельзя полагаться для решений о маршрутизации или контроле доступа.

Производные ACL:

req.ssl_sni: точное сопоставление строки

Примеры:

# Wait for a client hello for at most 5 seconds
tcp-request inspect-delay 5s
tcp-request content accept if { req.ssl_hello_type 1 }
use_backend bk_allow if { req.ssl_sni -f allowed_sites }
default_backend bk_sorry_page

req.ssl_st_ext: integer Возвращает 0, если клиент не отправил расширение TLS SessionTicket (RFC5077). Возвращает 1, если клиент отправил расширение TLS SessionTicket. Возвращает 2, если клиент также отправил TLS SessionTicket ненулевой длины. Обратите внимание, что это применяется только к необработанному содержимому буфера запроса, а не к содержимому, расшифрованному через слой данных SSL, поэтому не работает со строками “bind”, имеющими опцию “ssl”. Например, это позволяет обнаружить, отправил ли клиент SessionTicket, и выбрать привязку соответственно: при отсутствии SessionTicket использовать привязку по SessionID либо не применять привязку, поскольку при использовании SessionTickets состояние на стороне сервера отсутствует. Это извлечение анализирует только первое сообщение ClientHello в буфере запроса; подробнее о последствиях этого ограничения (HelloRetryRequest, повторное согласование, Encrypted Client Hello) см. в документации ключевого слова “req.ssl_sni”.

req.ssl_supported_groups binary

req.ssl_supported_groups binary

Возвращает двоичную форму списка поддерживаемых клиентом групп, указанных в TLS ClientHello и используемых для обмена ключами; они могут включать обмен как на эллиптических кривых, так и без EC. Обратите внимание, что это применяется только к необработанному содержимому буфера запроса, а не к содержимому, расшифрованному через слой данных SSL, поэтому не работает со строками “bind”, имеющими опцию “ssl”. См. “ssl_fc_eclist_bin” — эквивалент для SSL bind, который можно использовать при указанной опции “ssl”. Это извлечение анализирует только первое сообщение ClientHello в буфере запроса; подробнее о последствиях этого ограничения (HelloRetryRequest, повторное согласование, Encrypted Client Hello) см. в документации ключевого слова “req.ssl_sni”.

Примеры:

# Wait for a client hello for at most 5 seconds
tcp-request inspect-delay 5s
tcp-request content accept if { req.ssl_hello_type 1 }
use-server fe3 if { req.ssl_supported_groups, be2hex(:,2),lower -m sub 0017 }
server fe3  ${htst_fe3_addr}:${htst_fe3_port}

req.ssl_ver: integer req_ssl_ver: integer (устарело) Возвращает целое число с версией протокола SSL/TLS потока, присутствующего в буфере запроса. Поддерживаются сообщения приветствия SSLv2 и сообщения SSLv3. TLSv1 объявляется как версия SSL 3.1. Значение складывается из старшей версии, умноженной на 65536, и младшей версии. Обратите внимание, что это применяется только к необработанному содержимому буфера запроса, а не к содержимому, расшифрованному через слой данных SSL, поэтому не работает со строками “bind”, имеющими опцию “ssl”. Версия теста для ACL сопоставляет десятичную запись вида MAJOR.MINOR (например, 3.1). В основном это извлечение используется в ACL. Это извлечение анализирует только первое сообщение ClientHello в буфере запроса; подробнее о последствиях этого ограничения (HelloRetryRequest, повторное согласование, Encrypted Client Hello) см. в документации ключевого слова “req.ssl_sni”.

Производные ACL:

req.ssl_ver: сопоставление десятичных чисел

res.len: integer Возвращает целое число байтов, присутствующих в буфере ответа. В основном используется в ACL. Важно понимать, что этот тест не возвращает false, пока буфер меняется. Поэтому проверка равенства нулю почти всегда немедленно совпадёт в начале потока, тогда как проверка наличия большего объёма данных будет ждать их поступления и вернёт false только тогда, когда HAProxy уверен, что данные больше не поступят. Этот тест предназначен для анализа содержимого ответа TCP, но также может использоваться в правилах expect на основе tcp-check.

res.payload(<offset>,<length>): binary

res.payload(<offset>,<length>): binary

Извлекает двоичный блок длиной <length> байтов, начиная с байта <offset> в буфере ответа. Особый случай: если аргумент <length> равен нулю, извлекается весь буфер от <offset> до конца. Можно использовать с ACL для проверки наличия определённого содержимого в любом месте буфера. Также может использоваться в правилах expect на основе tcp-check.

res.payload_lv(<offset1>,<length>[,<offset2>]): binary

res.payload_lv(<offset1>,<length>[,<offset2>]): binary

Извлекает двоичный блок, размер которого записан в поле длиной <length> байтов по смещению <offset1>, а начало находится по смещению <offset2>, если оно указано, либо сразу после поля длины в буфере ответа. Параметр <offset2> также поддерживает относительные смещения, если перед ним стоит знак ‘+’ либо ‘-’. Также может использоваться в правилах expect на основе tcp-check.

Пример: см. пример для ключевого слова “stick store-response”.

res.ssl_hello_type: integer rep_ssl_hello_type: integer (устарело) Возвращает целое число с типом сообщения приветствия SSL, найденного в буфере ответа, если данные буфера разбираются как полное сообщение приветствия SSL (v3 или выше). Это применяется только к необработанному содержимому буфера ответа, а не к содержимому, расшифрованному через слой данных SSL, поэтому не работает со строками “server”, имеющими опцию “ssl”. В основном используется в ACL для обнаружения сообщения приветствия SSL, которое предположительно содержит идентификатор сессии SSL, пригодный для привязки.

7.3.6. Извлечение образцов HTTP (уровень 7)

Можно извлекать образцы из содержимого HTTP, запросов и ответов. Этот прикладной уровень также называют уровнем 7. Данные из этого раздела можно извлечь только после разбора полного запроса или ответа HTTP из соответствующего буфера запроса или ответа. Это всегда выполняется для всех правил, специфичных для HTTP, и секций с “mode http”. При анализе содержимого TCP может потребоваться задержка анализа, чтобы сначала дождаться запроса или ответа. Эти извлечения могут требовать несколько больше ресурсов CPU, чем извлечения уровня 4, но ненамного, поскольку запросы и ответы индексируются.

Примечание: обработка HTTP в правилах tcp-request content в прокси HTTP работает ожидаемым образом. Однако в прокси TCP без переключения на HTTP она работает только для содержимого HTTP/1. В содержимом HTTP/2 видна только начальная последовательность. Поэтому можно использовать только извлечения образцов “req.proto_http”, “req.ver” и, возможно, “method”. Все остальные извлечения образцов L7 завершаются неудачей. После переключения на HTTP они работают так же, как в прокси HTTP.

Сводка методов извлечения образцов в этом разделе и их соответствующие типы:

  Ключевое слово                                   Выходной тип
-------------------------------------------------+-------------
base                                               string
base32                                             integer
base32+src                                         binary
baseq                                              string
capture.req.hdr(<idx>)                             string
capture.req.method                                 string
capture.req.uri                                    string
capture.req.ver                                    string
capture.res.hdr(<idx>)                             string
capture.res.ver                                    string
cook([<name>])                                     string
cook_cnt([<name>])                                 integer
cook_val([<name>])                                 integer
cookie([<name>])                                   string
hdr([<name>[,<occ>]])                              string
hdr_cnt([<header>])                                integer
hdr_ip([<name>[,<occ>]])                           ip
hdr_val([<name>[,<occ>]])                          integer
http_auth(<userlist>)                              boolean
http_auth_bearer([<header>])                       string
http_auth_group(<userlist>)                        string
http_auth_pass                                     string
http_auth_type                                     string
http_auth_user                                     string
http_first_req                                     boolean
method                                             integer
path                                               string
pathq                                              string
query([<options>])                                 string
req.body                                           binary
req.body_len                                       integer
req.body_param([<name>[,i]])                       string
req.body_size                                      integer
req.cook([<name>])                                 string
req.cook_cnt([<name>])                             integer
req.cook_names([<delim>])                          string
req.cook_val([<name>])                             integer
req.fhdr(<name>[,<occ>])                           string
req.fhdr_cnt([<name>])                             integer
req.hdr([<name>[,<occ>]])                          string
req.hdr_cnt([<name>])                              integer
req.hdr_ip([<name>[,<occ>]])                       ip
req.hdr_names([<delim>])                           string
req.hdr_val([<name>[,<occ>]])                      integer
req.hdrs                                           string
req.hdrs_bin                                       binary
req.timer.hdr                                      integer
req.timer.idle                                     integer
req.timer.queue                                    integer
req.timer.tq                                       integer
req.ver                                            string
req_ver                                            string
request_date([<unit>])                             integer
res.body                                           binary
res.body_len                                       integer
res.body_size                                      integer
res.cache_hit                                      boolean
res.cache_name                                     string
res.comp                                           boolean
res.comp_algo                                      string
res.cook([<name>])                                 string
res.cook_cnt([<name>])                             integer
res.cook_names([<delim>])                          string
res.cook_val([<name>])                             integer
res.fhdr([<name>[,<occ>]])                         string
res.fhdr_cnt([<name>])                             integer
res.hdr([<name>[,<occ>]])                          string
res.hdr_cnt([<name>])                              integer
res.hdr_ip([<name>[,<occ>]])                       ip
res.hdr_names([<delim>])                           string
res.hdr_val([<name>[,<occ>]])                      integer
res.hdrs                                           string
res.hdrs_bin                                       binary
res.timer.hdr                                      integer
res.ver                                            string
resp_ver                                           string
scook([<name>])                                    string
scook_cnt([<name>])                                integer
scook_val([<name>])                                integer
server_status                                      integer
set-cookie([<name>])                               string
shdr([<name>[,<occ>]])                             string
shdr_cnt([<name>])                                 integer
shdr_ip([<name>[,<occ>]])                          ip
shdr_val([<name>[,<occ>]])                         integer
status                                             integer
txn.status                                         integer
txn.timer.total                                    integer
unique-id                                          string
url                                                string
url32                                              integer
url32+src                                          binary
url_ip                                             ip
url_param([<name>[,<delim>[,i]]])                  string
url_port                                           integer
urlp([<name>[,<delim>[,i]]])                       string
urlp_val([<name>[,<delim>[,i]]])                   integer
-------------------------------------------------+-------------

Подробный список:

base: string Возвращает объединение первого заголовка Host и части пути запроса, которая начинается с первой косой черты и заканчивается перед вопросительным знаком. В средах с виртуальным хостингом это полезно для обнаружения злоупотреблений URL и повышения эффективности общих кешей. Использование с таблицей привязок ограниченного размера также позволяет собирать статистику по наиболее часто запрашиваемым объектам для каждой пары хост/путь. В ACL это позволяет задавать простые правила переключения по содержимому, одновременно учитывающие хост и путь, например “www.example.com/favicon.ico ”. См. также “path” и “uri”.

Производные ACL:

base    : точное сопоставление строки
base_beg: сопоставление по префиксу
base_dir: сопоставление по подкаталогу
base_dom: сопоставление по домену
base_end: сопоставление по суффиксу
base_len: сопоставление по длине
base_reg: сопоставление по регулярному выражению
base_sub: сопоставление по подстроке

Примечание: производные ACL нельзя использовать с последующим преобразователем или в ACL с методом сопоставления шаблонов “-m”.

base32: integer Возвращает 32-битный хеш значения, возвращаемого описанным выше извлечением “base”. Это полезно для отслеживания активности по отдельным URL на сайтах с высоким трафиком без хранения всех URL. Вместо них сохраняется более короткий хеш, что существенно экономит память. Выходной тип — беззнаковое целое число. Используется хеш-функция SDBM с полным лавинным преобразованием результата. Технически base32 в точности равен “base,sdbm(1)”.

base32+src: binary Возвращает объединение результатов извлечения base32 выше и src ниже. Результат имеет двоичный тип и размер 8 или 20 байтов в зависимости от семейства исходного адреса. Можно использовать для отслеживания счётчиков по отдельным IP и URL.

baseq: string Возвращает объединение первого заголовка Host и части пути запроса вместе со строкой запроса, начиная с первой косой черты. Использование вместо “base” позволяет правильно определить целевой ресурс для статистики или кеширования. См. также “path”, “pathq” и “base”.

capture.req.hdr(<idx>): string

capture.req.hdr(<idx>): string

Извлекает содержимое заголовка, захваченного директивой “capture request header”; idx — позиция ключевого слова capture в конфигурации. Первая запись имеет индекс 0. См. также “capture request header”.

capture.req.method: string Извлекает метод (METHOD) запроса HTTP. Можно использовать как в запросе, так и в ответе. В отличие от “method”, доступно и в запросе, и в ответе, поскольку для этого значения выделяется память.

capture.req.uri: string Извлекает URI запроса, который начинается с первой косой черты и заканчивается перед первым пробелом в запросе (без части с хостом). В отличие от “path” и “url”, доступно и в запросе, и в ответе, поскольку для этого значения выделяется память.

capture.req.ver: string Извлекает версию HTTP из запроса и возвращает её в формате “HTTP/<major>.<minor>”. Можно использовать в запросах, ответах и журналах, поскольку используется сохраняемая информация. Если версия запроса недопустима, извлечение образца завершается неудачей.

capture.res.hdr(<idx>): string

capture.res.hdr(<idx>): string

Извлекает содержимое заголовка, захваченного директивой “capture response header”; idx — позиция ключевого слова capture в конфигурации. Первая запись имеет индекс 0. См. также “capture response header”.

capture.res.ver: string Извлекает версию HTTP из ответа и возвращает её в формате “HTTP/<major>.<minor>”. Можно использовать в журналах, поскольку используется сохраняемая информация. Если версия ответа недопустима, извлечение образца завершается неудачей.

cookie([<name>]): string (deprecated)

cookie([<name>]): string (deprecated)

Извлекает последнее вхождение cookie с именем <name> из строки заголовка “Cookie” в запросе либо заголовка “Set-Cookie” в ответе и возвращает его значение в виде строки. Обычно применяется, чтобы несколько клиентов с общим профилем использовали один сервер. Это похоже на поведение “appsession” с “request-learn”, но поддерживает синхронизацию между несколькими узлами и сохранение состояния при перезапусках. Если имя не задано, возвращается значение первого cookie. Это извлечение больше не следует использовать: его следует заменить на req.cook() либо res.cook(), поскольку направление неоднозначно определяется контекстом использования.

hdr([<name>[,<occ>]]): string

hdr([<name>[,<occ>]]): string

При использовании с запросами эквивалентно req.hdr(), а с ответами — res.hdr(). Подробности см. в описаниях этих извлечений. Если направление извлечения вызывает сомнения, используйте явные варианты. Обратите внимание, что в отличие от метода извлечения образцов hdr(), ключевые слова ACL hdr_* однозначно применяются к заголовкам запроса.

http_auth(<userlist>): boolean

http_auth(<userlist>): boolean

Возвращает логическое значение, указывающее, соответствуют ли полученные от клиента данные аутентификации имени пользователя и паролю, сохранённым в указанном userlist. Эта функция извлечения практически бесполезна вне ACL. Сейчас поддерживается только базовая аутентификация HTTP.

http_auth_bearer([<header>]): string

http_auth_bearer([<header>]): string

Возвращает предоставленный клиентом токен из данных авторизации при использовании схемы Bearer (например, для передачи JSON Web Tokens). Данные, отправленные клиентом, не проверяются. Если указан конкретный <header>, разбирается этот заголовок вместо Authorization.

http_auth_group(<userlist>): string

http_auth_group(<userlist>): string

Возвращает строку с именем пользователя из полученных от клиента данных аутентификации, если и имя пользователя, и пароль действительны согласно указанному userlist. Основное назначение — использование в ACL, где затем проверяется принадлежность пользователя к какой-либо группе из списка. Эта функция извлечения практически бесполезна вне ACL. Сейчас поддерживается только базовая аутентификация HTTP.

Производные ACL:

http_auth_group(<userlist>): group ...
Возвращает true, если пользователь, извлечённый из запроса, чей пароль
прошёл проверку по указанному userlist, принадлежит хотя бы одной
из групп.

http_auth_pass: string Возвращает пароль пользователя из данных аутентификации, полученных от клиента в заголовке Authorization. Это извлечение образца не выполняет проверок. Поддерживается только аутентификация Basic.

http_auth_type: string Возвращает метод аутентификации из данных аутентификации, полученных от клиента в заголовке Authorization. Это извлечение образца не выполняет проверок. Поддерживается только аутентификация Basic.

http_auth_user: string Возвращает имя пользователя из данных аутентификации, полученных от клиента в заголовке Authorization. Это извлечение образца не выполняет проверок. Поддерживается только аутентификация Basic.

http_first_req: boolean Возвращает true, когда обрабатываемый запрос является первым в соединении. Можно использовать для добавления или удаления заголовков, которые могут отсутствовать в некоторых запросах, если запрос не первый, либо для группировки запросов в журналах.

method: integer + string Возвращает целое число, соответствующее методу в запросе HTTP. Например, “GET” соответствует 1 (соответствие определяется по исходному коду). Значение 9 означает «другой метод» и может быть преобразовано в строку, извлечённую из потока. Это не следует использовать напрямую как образец: предназначено только для ACL, которые прозрачно преобразуют методы из шаблонов в эти значения integer + string. Некоторые предопределённые ACL уже проверяют наиболее распространённые методы.

Производные ACL:

method: сопоставление метода без учёта регистра

Пример:

# only accept GET and HEAD requests
acl valid_method method GET HEAD
http-request deny if ! valid_method

path: string Извлекает путь URL запроса, который начинается с первой косой черты и заканчивается перед вопросительным знаком (без части с хостом). Обычно используется с кешами, поддерживающими предварительное получение, и порталами, которым нужно объединять сведения из баз данных и хранить их в кешах. Для исходящих кешей разумнее использовать “url”. В ACL обычно применяется для сопоставления точных имён файлов (например, “/login.php”) либо частей каталогов с помощью производных форм. См. также методы извлечения “url” и “base”. Обратите внимание, что любая ссылка на фрагмент в URI (’#’ после пути) строго запрещена стандартом HTTP и будет отклонена. Однако, если во фронтенде, принимающем запрос, включена “option accept-unsafe-violations-in-http-request”, часть с фрагментом будет принята и также появится в path.

Производные ACL:

path    : точное сопоставление строки
path_beg: сопоставление по префиксу
path_dir: сопоставление по подкаталогу
path_dom: сопоставление по домену
path_end: сопоставление по суффиксу
path_len: сопоставление по длине
path_reg: сопоставление по регулярному выражению
path_sub: сопоставление по подстроке

Примечание: производные ACL нельзя использовать с последующим преобразователем или в ACL с методом сопоставления шаблонов “-m”.

pathq: string Извлекает путь URL запроса со строкой запроса, начиная с первой косой черты. Это извлечение образца удобно для получения относительного URI без схемы и части полномочий (authority), если они присутствуют. Именно так обычно представлена цель запроса HTTP/1.1, тогда как в HTTP/2 часто используется абсолютный URI. В обоих случаях это извлечение образца вернёт одинаковый результат. Обратите внимание, что любая ссылка на фрагмент в URI (’#’ после пути) строго запрещена стандартом HTTP и будет отклонена. Однако, если во фронтенде, принимающем запрос, включена “option accept-unsafe-violations-in-http-request”, часть с фрагментом будет принята и также появится в path.

query([<options>]): string

query([<options>]): string

Извлекает строку запроса, начинающуюся после первого вопросительного знака. Если вопросительного знака нет, извлечение ничего не возвращает. Если вопросительный знак есть, но после него ничего нет, возвращается пустая строка. Поэтому наличие строки запроса легко проверить методом сопоставления “found”. Это извлечение дополняет “path”, который заканчивается перед вопросительным знаком, и “query_string”, который включает вопросительный знак.

Необязательный параметр позволяет изменить возвращаемое значение. Поддерживаются следующие варианты:

- with_qm: добавить вопросительный знак в начало строки запроса,
            если она не пуста.

req.body: binary Возвращает доступное тело запроса HTTP в виде блока данных. Рекомендуется использовать “option http-buffer-request”, чтобы по возможности дождаться тела запроса.

req.body_len: integer Возвращает длину доступного тела запроса HTTP в байтах. Она может быть меньше объявленной длины, если тело больше буфера. Рекомендуется использовать “option http-buffer-request”, чтобы по возможности дождаться тела запроса.

req.body_param([<name>[,i]]): string

req.body_param([<name>[,i]]): string

Это извлечение предполагает, что тело запроса POST имеет кодировку URL. Пользователь может проверить, содержит ли “content-type” значение “application/x-www-form-urlencoded”. Извлекает первое вхождение параметра <name> в теле, которое заканчивается перед ‘&’. Имя параметра чувствительно к регистру, если вторым аргументом не добавлено “i”. Если имя не задано, подходит любой параметр и возвращается первый. Результат — строка со значением параметра <name> в том виде, в котором оно указано в теле запроса (декодирование URL не выполняется). Обратите внимание, что версия этого извлечения для ACL перебирает несколько параметров и последовательно возвращает значения всех параметров, если имя не задано.

req.body_size: integer Возвращает объявленную длину тела запроса HTTP в байтах. Это объявленное значение заголовка Content-Length либо размер доступных данных при передаче блоками.

req.cook([<name>]): string

req.cook([<name>]): string
cook([<name>]): string (deprecated)

Извлекает последнее вхождение cookie с именем <name> из строки заголовка “Cookie” в запросе и возвращает его значение в виде строки. Если имя не задано, возвращается значение первого cookie. В ACL вычисляются все подходящие cookie. Пробелы вокруг имени и значения игнорируются согласно спецификации заголовка Cookie (RFC6265). Имя cookie чувствительно к регистру. Пустые cookie допустимы, поэтому присутствующий пустой cookie может возвращать пустое значение. Для обнаружения присутствия используйте сопоставление “found”. Для cookie ответа, отправленных сервером, используйте вариант res.cook().

Производные ACL:

req.cook([<name>])    : точное сопоставление строки
req.cook_beg([<name>]): сопоставление по префиксу
req.cook_dir([<name>]): сопоставление по подкаталогу
req.cook_dom([<name>]): сопоставление по домену
req.cook_end([<name>]): сопоставление по суффиксу
req.cook_len([<name>]): сопоставление по длине
req.cook_reg([<name>]): сопоставление по регулярному выражению
req.cook_sub([<name>]): сопоставление по подстроке

Примечание: производные ACL нельзя использовать с последующим преобразователем или в ACL с методом сопоставления шаблонов “-m”.

req.cook_cnt([<name>]): integer

req.cook_cnt([<name>]): integer
cook_cnt([<name>]): integer (deprecated)

Возвращает целочисленное значение числа вхождений cookie <name> в запросе либо всех cookie, если <name> не указан.

req.cook_names([<delim>]): string

req.cook_names([<delim>]): string

Формирует строку путём объединения всех имён cookie в порядке их появления в запросе (заголовок Cookie) на момент вычисления правила. Разделитель по умолчанию — запятая (’,’), но его можно переопределить необязательным аргументом <delim>. В этом случае учитывается только первый символ <delim>.

req.cook_val([<name>]): integer

req.cook_val([<name>]): integer
cook_val([<name>]): integer (deprecated)

Извлекает последнее вхождение cookie с именем <name> из строки заголовка “Cookie” в запросе и преобразует его значение в возвращаемое целое число. Если имя не задано, возвращается значение первого cookie. В ACL перебираются все подходящие имена, пока не будет найдено совпадающее значение.

req.fhdr(<name>[,<occ>]): string

req.fhdr(<name>[,<occ>]): string

Возвращает полное значение последнего вхождения заголовка <name> в запросе HTTP. В отличие от req.hdr(), запятые в значении возвращаются как есть и не используются как разделители. Иногда это полезно для таких заголовков, как User-Agent.

При использовании в ACL все вхождения перебираются до нахождения совпадения.

Необязательно можно указать конкретное вхождение числом позиции. Положительные значения задают позицию от первого вхождения, где 1 — первое. Отрицательные значения задают позицию относительно последнего, где -1 — последнее.

req.fhdr_cnt([<name>]): integer

req.fhdr_cnt([<name>]): integer

Возвращает целое число вхождений поля заголовка запроса с именем <name> либо общее число полей заголовков, если <name> не указан. Как и req.fhdr(), отличается от res.hdr_cnt() тем, что не разделяет заголовки по запятым.

req.hdr([<name>[,<occ>]]): string

req.hdr([<name>[,<occ>]]): string

Возвращает последнее разделённое запятой значение заголовка <name> в запросе HTTP. Любая запятая считается разделителем отдельных значений. Это полезно для обработки заголовков, которые определены как списки значений, например Accept или X-Forwarded-For. Если нужны заголовки целиком, используйте req.fhdr(). Внимательно изучите RFC 7231, чтобы узнать, как следует разбирать конкретные заголовки. Кроме того, некоторые из них нечувствительны к регистру (например, Connection).

При использовании в ACL все вхождения перебираются до нахождения совпадения.

Необязательно можно указать конкретное вхождение числом позиции. Положительные значения задают позицию от первого вхождения, где 1 — первое. Отрицательные значения задают позицию относительно последнего, где -1 — последнее.

Обычно используется с заголовком X-Forwarded-For после преобразования в IP и с таблицей привязок IP.

Производные ACL:

hdr([<name>[,<occ>]])    : точное сопоставление строки
hdr_beg([<name>[,<occ>]]): сопоставление по префиксу
hdr_dir([<name>[,<occ>]]): сопоставление по подкаталогу
hdr_dom([<name>[,<occ>]]): сопоставление по домену
hdr_end([<name>[,<occ>]]): сопоставление по суффиксу
hdr_len([<name>[,<occ>]]): сопоставление по длине
hdr_reg([<name>[,<occ>]]): сопоставление по регулярному выражению
hdr_sub([<name>[,<occ>]]): сопоставление по подстроке

Примечание: производные ACL нельзя использовать с последующим преобразователем или в ACL с методом сопоставления шаблонов “-m”.

req.hdr_cnt([<name>]): integer

req.hdr_cnt([<name>]): integer
hdr_cnt([<header>]): integer (deprecated)

Возвращает целое число вхождений поля заголовка запроса с именем <name> либо общее число значений полей заголовков, если <name> не указан. Как и req.hdr(), считает каждую часть значения заголовка, отделённую запятой. Если нужно считать заголовки целиком, следует использовать req.fhdr_cnt().

В ACL можно использовать для обнаружения наличия, отсутствия или злоупотребления конкретным заголовком, а также для блокировки атак контрабанды запросов путём отклонения запросов, содержащих более одного экземпляра определённых заголовков.

Дополнительные сведения о сопоставлении заголовков см. в req.hdr().

req.hdr_ip([<name>[,<occ>]]): ip

req.hdr_ip([<name>[,<occ>]]): ip
hdr_ip([<name>[,<occ>]]): ip (deprecated)

Извлекает последнее вхождение заголовка <name> в запросе HTTP, преобразует его в адрес IPv4 или IPv6 и возвращает этот адрес. В ACL проверяются все вхождения; если <name> опущен, проверяется каждое значение каждого заголовка. Разбор строго следует формату RFC7239 с расширением: за адресом IPv4 необязательно могут следовать двоеточие (’:’) и допустимый десятичный номер порта (от 0 до 65535), который будет молча отброшен. Все остальные формы не совпадают и приводят к игнорированию адреса.

Параметр <occ> обрабатывается так же, как в req.hdr().

Обычно используется с заголовками X-Forwarded-For и X-Client-IP.

req.hdr_names([<delim>]): string

req.hdr_names([<delim>]): string

Формирует строку путём объединения всех имён заголовков в порядке их появления в запросе на момент вычисления правила. Разделитель по умолчанию — запятая (’,’), но его можно переопределить необязательным аргументом <delim>. В этом случае учитывается только первый символ <delim>.

req.hdr_val([<name>[,<occ>]]): integer

req.hdr_val([<name>[,<occ>]]): integer
hdr_val([<name>[,<occ>]]): integer (deprecated)

Извлекает последнее вхождение заголовка <name> в запросе HTTP и преобразует его в целое число. В ACL проверяются все вхождения; если <name> опущен, проверяется каждое значение каждого заголовка.

Параметр <occ> обрабатывается так же, как в req.hdr().

Обычно используется с заголовком X-Forwarded-For.

req.hdrs: string Возвращает текущие заголовки запроса в виде строки, включая завершающую пустую строку, отделяющую заголовки от тела запроса. По завершающей пустой строке можно обнаружить усечённый блок заголовков. Это извлечение образца полезно для некоторых анализаторов заголовков SPOE и расширенного журналирования.

req.hdrs_bin: binary Возвращает текущие заголовки запроса в предварительно разобранной двоичной форме. Это полезно для передачи части обработки через SPOE. Каждая строка описывается длиной, за которой следует указанное этой длиной число байтов. Длина представлена целым числом переменной длины в кодировке, подробно описанной в документации SPOE. Конец списка обозначается парой пустых имени и значения заголовка (оба имеют длину 0).

*(<str:header-name>``<str:header-value>)<empty string>``<empty string>

int: сведения о кодировании см. в документации SPOE str: <int:length>``<bytes>

req.timer.hdr: integer Полное время получения клиентского запроса (только в режиме HTTP). Это время от получения первых байтов до момента, когда прокси получил пустую строку, обозначающую конец заголовков HTTP. Выражается в миллисекундах (ms) и соответствует %TR в log-format. Подробнее см. раздел 8.4 «Временные события».

req.timer.idle: integer Время простоя перед запросом HTTP (только в режиме HTTP). Таймер отсчитывает время от завершения рукопожатий до первого байта запроса HTTP. Выражается в миллисекундах и соответствует %Ti в log-format. Подробнее см. раздел 8.4 «Временные события».

req.timer.queue: integer Полное время, проведённое в очередях в ожидании свободного места для соединения. Выражается в миллисекундах и соответствует %Tw в log-format. Подробнее см. раздел 8.4 «Временные события».

req.timer.tq: integer Полное время получения клиентского запроса с момента принятия соединения либо отправки последнего байта предыдущего ответа. Выражается в миллисекундах и соответствует %Tq в log-format. Подробнее см. раздел 8.4 «Временные события».

req.ver: string req_ver: string (устарело) Возвращает строку версии из запроса HTTP в формате “<major>.<minor>”. Это может быть полезно для ACL. Некоторые предопределённые ACL уже проверяют распространённые версии. Можно использовать в запросах, ответах и журналах, поскольку используется сохраняемая информация. Если версия запроса недопустима, извлечение образца завершается неудачей.

Обычные значения: “1.0”, “1.1”, “2.0” или “3.0”.

Производные ACL:

req.ver: точное сопоставление строки

request_date([<unit>]): integer

request_date([<unit>]): integer

Точная дата получения HAProxy первого байта запроса HTTP (псевдоним %tr в log-format). Вычисляется как accept_date + время рукопожатия (%Th) + время простоя (%Ti).

Возвращает значение в секундах с эпохи.

<unit> необязателен и может быть установлен в “s” для секунд (поведение по умолчанию), “ms” для миллисекунд или “us” для микросекунд. Если указана единица измерения, возвращаемое значение — целое число, отражающее количество секунд, миллисекунд или микросекунд с эпохи. Полезно, когда требуется разрешение времени менее одной секунды.

res.body: binary Возвращает доступное тело ответа HTTP в виде блока данных. В отличие от обработки запросов, директивы для ожидания тела ответа нет. Это извлечение образца особенно полезно (и применимо) в контексте проверок работоспособности.

Можно использовать в правилах expect на основе tcp-check.

res.body_len: integer Возвращает длину доступного тела ответа HTTP в байтах. В отличие от обработки запросов, директивы для ожидания тела ответа нет. Это извлечение образца особенно полезно (и применимо) в контексте проверок работоспособности.

Можно использовать в правилах expect на основе tcp-check.

res.body_size: integer Возвращает объявленную длину тела ответа HTTP в байтах. Это объявленное значение заголовка Content-Length либо размер доступных данных при передаче блоками. В отличие от обработки запросов, директивы для ожидания тела ответа нет. Это извлечение образца особенно полезно (и применимо) в контексте проверок работоспособности.

Можно использовать в правилах expect на основе tcp-check.

res.cache_hit: boolean Возвращает логическое значение “true”, если ответ сформирован из записи кеша HTTP; в противном случае возвращает логическое значение “false”.

res.cache_name: string Возвращает строку с именем кеша HTTP, использованного для формирования ответа HTTP, если res.cache_hit имеет значение true; иначе возвращает пустую строку.

res.comp: boolean Возвращает логическое значение “true”, если ответ был сжат HAProxy, иначе возвращает логическое значение “false”. Это можно использовать для добавления информации в журналы.

res.comp_algo: string Возвращает строку с именем алгоритма, использованного для сжатия ответа HAProxy, например “deflate”. Это можно использовать для добавления информации в журналы.

res.cook([<name>]): string

res.cook([<name>]): string
scook([<name>]): string (deprecated)

Извлекает последнее вхождение cookie с именем <name> из строки заголовка “Set-Cookie” в ответе и возвращает его значение в виде строки. Если имя не указано, возвращается значение первого cookie.

Можно использовать в правилах expect на основе tcp-check.

Производные ACL:

res.scook([<name>]: точное сопоставление строки

res.cook_cnt([<name>]): integer

res.cook_cnt([<name>]): integer
scook_cnt([<name>]): integer (deprecated)

Возвращает целое число вхождений cookie <name> в ответе либо всех cookie, если <name> не указан. В основном это полезно вместе с ACL для обнаружения подозрительных ответов.

Можно использовать в правилах expect на основе tcp-check.

res.cook_names([<delim>]): string

res.cook_names([<delim>]): string

Формирует строку путём объединения всех имён cookie в порядке их появления в ответе (заголовки Set-Cookie) на момент вычисления правила. Разделитель по умолчанию — запятая (’,’), но его можно переопределить необязательным аргументом <delim>. В этом случае учитывается только первый символ <delim>.

Можно использовать в правилах expect на основе tcp-check.

res.cook_val([<name>]): integer

res.cook_val([<name>]): integer
scook_val([<name>]): integer (deprecated)

Извлекает последнее вхождение cookie с именем <name> из строки заголовка “Set-Cookie” в ответе, преобразует его значение в целое число и возвращает результат. Если имя не указано, возвращается значение первого cookie.

Можно использовать в правилах expect на основе tcp-check.

res.fhdr([<name>[,<occ>]]): string

res.fhdr([<name>[,<occ>]]): string

Работает так же, как метод извлечения req.fhdr(), но действует на заголовки ответа HTTP.

Как и req.fhdr(), метод извлечения res.fhdr() возвращает полные значения. Если заголовок определён как список, следует использовать res.hdr().

Этот метод извлечения иногда полезен с такими заголовками, как Date или Expires.

Можно использовать в правилах expect на основе tcp-check.

res.fhdr_cnt([<name>]): integer

res.fhdr_cnt([<name>]): integer

Работает так же, как метод извлечения req.fhdr_cnt(), но действует на заголовки ответа HTTP.

Как и req.fhdr_cnt(), метод извлечения res.fhdr_cnt() обрабатывает полные значения. Если заголовок определён как список, следует использовать res.hdr_cnt().

Можно использовать в правилах expect на основе tcp-check.

res.hdr([<name>[,<occ>]]): string

res.hdr([<name>[,<occ>]]): string
shdr([<name>[,<occ>]]): string (deprecated)

Работает так же, как метод извлечения req.hdr(), но действует на заголовки ответа HTTP.

Как и req.hdr(), метод извлечения res.hdr() считает запятую разделителем. Если это нежелательно, следует использовать res.fhdr().

Можно использовать в правилах expect на основе tcp-check.

Производные ACL:

res.hdr([<name>[,<occ>]])    : точное сопоставление строки
res.hdr_beg([<name>[,<occ>]]): сопоставление по префиксу
res.hdr_dir([<name>[,<occ>]]): сопоставление по подкаталогу
res.hdr_dom([<name>[,<occ>]]): сопоставление по домену
res.hdr_end([<name>[,<occ>]]): сопоставление по суффиксу
res.hdr_len([<name>[,<occ>]]): сопоставление по длине
res.hdr_reg([<name>[,<occ>]]): сопоставление по регулярному выражению
res.hdr_sub([<name>[,<occ>]]): сопоставление по подстроке

Примечание: производные ACL нельзя использовать с последующим преобразователем или в ACL с методом сопоставления шаблонов “-m”.

res.hdr_cnt([<name>]): integer

res.hdr_cnt([<name>]): integer
shdr_cnt([<name>]): integer (deprecated)

Работает так же, как метод извлечения req.hdr_cnt(), но действует на заголовки ответа HTTP.

Как и req.hdr_cnt(), метод извлечения res.hdr_cnt() считает запятую разделителем. Если это нежелательно, следует использовать res.fhdr_cnt().

Можно использовать в правилах expect на основе tcp-check.

res.hdr_ip([<name>[,<occ>]]): ip

res.hdr_ip([<name>[,<occ>]]): ip
shdr_ip([<name>[,<occ>]]): ip (deprecated)

Работает так же, как метод извлечения req.hdr_ip(), но действует на заголовки ответа HTTP.

Можно использовать для сохранения некоторых данных в таблице привязок.

Можно использовать в правилах expect на основе tcp-check.

res.hdr_names([<delim>]): string

res.hdr_names([<delim>]): string

Формирует строку путём объединения всех имён заголовков в порядке их появления в ответе на момент вычисления правила. Разделитель по умолчанию — запятая (’,’), но его можно переопределить необязательным аргументом <delim>. В этом случае учитывается только первый символ <delim>.

Можно использовать в правилах expect на основе tcp-check.

res.hdr_val([<name>[,<occ>]]): integer

res.hdr_val([<name>[,<occ>]]): integer
shdr_val([<name>[,<occ>]]): integer (deprecated)

Работает так же, как метод извлечения req.hdr_val(), но действует на заголовки ответа HTTP.

Можно использовать для сохранения некоторых данных в таблице привязок.

Можно использовать в правилах expect на основе tcp-check.

res.hdrs: string Возвращает текущие заголовки ответа в виде строки, включая завершающую пустую строку, отделяющую заголовки от тела запроса. По завершающей пустой строке можно обнаружить усечённый блок заголовков. Это извлечение образца полезно для некоторых анализаторов заголовков SPOE и расширенного журналирования.

Также можно использовать в правилах expect на основе tcp-check.

res.hdrs_bin: binary Возвращает текущие заголовки ответа в предварительно разобранной двоичной форме. Это полезно для передачи части обработки через SPOE. Можно использовать в правилах expect, основанных на tcp-check. Каждая строка описывается длиной, за которой следует указанное этой длиной число байтов. Длина представлена целым числом переменной длины в кодировке, подробно описанной в документации SPOE. Конец списка обозначается парой пустых имени и значения заголовка (оба имеют длину 0).

*(<str:header-name>``<str:header-value>)<empty string>``<empty string>

int: сведения о кодировании см. в документации SPOE str: <int:length>``<bytes>

res.timer.hdr: integer Время от установления соединения TCP с сервером до момента, когда сервер отправил все заголовки ответа. Выражается в миллисекундах и соответствует %Tr в log-format. Подробнее см. раздел 8.4 «Временные события».

res.ver: string resp_ver: string (устарело) Возвращает строку версии из ответа HTTP в формате “<major>.<minor>”. Это может быть полезно для журналов, но главным образом предназначено для ACL. Если версия ответа недопустима, извлечение образца завершается неудачей.

Можно использовать в правилах expect на основе tcp-check.

Производные ACL:

resp.ver: точное сопоставление строки

server_status: integer Возвращает целое число, содержащее код состояния HTTP, полученный от сервера. Если ответ от сервера не получен, извлечение образца завершается неудачей.

set-cookie([<name>]): string (deprecated)

set-cookie([<name>]): string (deprecated)

Извлекает последнее вхождение cookie с именем <name> из строки заголовка “Set-Cookie” в ответе и использует соответствующее значение для сопоставления. Это сопоставимо с поведением “appsession” при параметрах по умолчанию, но с поддержкой синхронизации между несколькими узлами и сохранения состояния при перезапусках.

Этот метод извлечения устарел; его заменил метод “res.cook”. Это ключевое слово вскоре исчезнет.

status: integer Возвращает целое число, содержащее код состояния HTTP в ответе HTTP, например 302. В основном используется в ACL и с диапазонами целых чисел, например для удаления любого заголовка Location, если ответ не относится к 3xx. Клиент получит этот код состояния, если его не изменить, например действием ‘set-status’.

Можно использовать в правилах expect на основе tcp-check.

txn.status: integer Возвращает целое число с кодом состояния HTTP транзакции, указанным в журнале.

txn.timer.total: integer Полное время активной обработки запроса HTTP от момента получения прокси первого байта заголовка запроса до отправки последнего байта тела ответа. Соответствует %Ta в log-format и выражается в миллисекундах (ms). Подробнее см. раздел 8.4 «Временные события».

unique-id: string Возвращает unique-id, связанный с запросом. Директива “unique-id-format” должна быть задана. Если она не задана, извлечение образца unique-id завершается неудачей. Хотя unique-id обычно используется с запросами HTTP, это извлечение образца можно использовать и с другими протоколами. Разумеется, при использовании с протоколами, отличными от HTTP, директива unique-id-format не должна содержать части, относящиеся к HTTP. См.: unique-id-format и unique-id-header

url: string Извлекает URL запроса в том виде, в котором он указан в запросе. Обычно используется с кешами, поддерживающими предварительное получение, и с порталами, которым нужно объединять сведения из баз данных и сохранять их в кешах. В ACL предпочтительнее использовать “path”, чем “url”, поскольку клиенты могут отправлять полный URL, как обычно делают при работе с прокси. Единственный реальный вариант применения — сопоставление “*”, которое не выполняется в “path” и для которого уже есть предопределённый ACL. См. также “path” и “base”. Обратите внимание, что любая ссылка на фрагмент в URI (’#’ после пути) строго запрещена стандартом HTTP и будет отклонена. Однако, если во фронтенде, принимающем запрос, включена “option accept-unsafe-violations-in-http-request”, часть с фрагментом будет принята и также появится в url.

Производные ACL:

url    : точное сопоставление строки
url_beg: сопоставление по префиксу
url_dir: сопоставление по подкаталогу
url_dom: сопоставление по домену
url_end: сопоставление по суффиксу
url_len: сопоставление по длине
url_reg: сопоставление по регулярному выражению
url_sub: сопоставление по подстроке

Примечание: производные ACL нельзя использовать с последующим преобразователем или в ACL с методом сопоставления шаблонов “-m”.

url32: integer Возвращает 32-битный хеш значения, полученного объединением первого заголовка Host и всего URL, включая параметры (а не только часть пути запроса, как в извлечении “base32” выше). Это полезно для отслеживания активности по отдельным URL. Сохраняется более короткий хеш, что существенно экономит память. Выходной тип — беззнаковое целое число.

url32+src: binary Возвращает объединение результатов извлечения “url32” и “src”. Результат имеет двоичный тип и размер 8 или 20 байтов в зависимости от семейства исходного адреса. Можно использовать для отслеживания счётчиков по отдельным адресам IP и URL.

url_ip: ip Извлекает адрес IP из URL запроса, когда часть с хостом представлена адресом IP. Если в ней указано имя, извлечение завершается неуспешно, поскольку разрешение имён не выполняется. Применение весьма ограничено. Например, система мониторинга может использовать это поле вместо исходного адреса IP, чтобы проверить, какой путь прошёл бы заданный исходный адрес, либо принудительно создать запись в таблице для заданного исходного адреса. Можно использовать вместе с ‘http-request set-dst’ для воспроизведения прежнего поведения ‘option http_proxy’.

url_port: integer Извлекает порт из URL запроса. Если порт в запросе не указан, предполагается порт 80. Как и “url_ip”, это работает только тогда, когда часть authority в URL представлена адресом. При имени хоста извлечение завершается неуспешно, поскольку разрешение имён здесь не выполняется.

urlp([<name>[,<delim>[,i]]]): string

urlp([<name>[,<delim>[,i]]]): string
url_param([<name>[,<delim>[,i]]]): string

Извлекает первое вхождение параметра <name> в строке запроса, которая начинается после ‘?’ либо <delim> и заканчивается перед ‘&’, ‘;’ либо <delim>. Имя параметра чувствительно к регистру, если третьим аргументом не добавлено “i”. Если имя не задано, подходит любой параметр и возвращается первый. Результат — строка со значением параметра <name> в том виде, в котором оно указано в запросе (декодирование URL не выполняется). Это можно использовать для привязки сеанса по идентификатору клиента, извлечения cookie приложения, переданного параметром URL, либо для проверок в ACL. Обратите внимание, что версия этого извлечения для ACL перебирает несколько параметров и последовательно возвращает значения всех параметров, если имя не задано.

Производные ACL:

urlp(<name>[,<delim>])    : точное сопоставление строки
urlp_beg(<name>[,<delim>]): сопоставление по префиксу
urlp_dir(<name>[,<delim>]): сопоставление по подкаталогу
urlp_dom(<name>[,<delim>]): сопоставление по домену
urlp_end(<name>[,<delim>]): сопоставление по суффиксу
urlp_len(<name>[,<delim>]): сопоставление по длине
urlp_reg(<name>[,<delim>]): сопоставление по регулярному выражению
urlp_sub(<name>[,<delim>]): сопоставление по подстроке

Примечание: производные ACL нельзя использовать с последующим преобразователем или в ACL с методом сопоставления шаблонов “-m”.

Пример:

# match http://example.com/foo?PHPSESSIONID=some_id
stick on urlp(PHPSESSIONID)
# match http://example.com/foo;JSESSIONID=some_id
stick on urlp(JSESSIONID,;)

urlp_val([<name>[,<delim>[,i]]]): integer

urlp_val([<name>[,<delim>[,i]]]): integer

См. “urlp” выше. Извлекает параметр URL <name> в запросе и преобразует его в целое число. Это можно использовать, например, для привязки сеанса по идентификатору пользователя либо с ACL для сопоставления номера страницы или цены.

7.3.7. Извлечение образцов для разработчиков

Этот набор методов извлечения образцов предназначен для разработчиков; его никогда нельзя использовать в рабочей среде, кроме случаев, когда разработчик требует этого для отладки. Кроме того, особое внимание обратной совместимости уделяться не будет. Нет гарантии, что перечисленные ниже методы извлечения образцов не изменятся, не будут переименованы или просто удалены. Поэтому при необходимости использовать их следует соблюдать особую осторожность. Во избежание неоднозначности они помещены в отдельную область “internal”, например “internal.strm.is_htx”.

Сводка методов извлечения образцов в этом разделе и их соответствующие типы:

  Ключевое слово                                   Выходной тип
-------------------------------------------------+-------------
internal.htx.data                                  integer
internal.htx.free                                  integer
internal.htx.free_data                             integer
internal.htx.has_eom                               boolean
internal.htx.nbblks                                integer
internal.htx.size                                  integer
internal.htx.used                                  integer
internal.htx_blk.size(<idx>)                       integer
internal.htx_blk.type(<idx>)                       string
internal.htx_blk.data(<idx>)                       binary
internal.htx_blk.hdrname(<idx>)                    string
internal.htx_blk.hdrval(<idx>)                     string
internal.htx_blk.start_line(<idx>)                 string
internal.strm.is_htx                               boolean
-------------------------------------------------+-------------

Подробный список:

internal.htx.data: integer Возвращает размер в байтах, занимаемый данными в сообщении HTX, связанном с каналом. Канал выбирается в зависимости от направления образца.

internal.htx.free: integer Возвращает свободное место (size - used) в байтах в сообщении HTX, связанном с каналом. Канал выбирается в зависимости от направления образца.

internal.htx.free_data: integer Возвращает свободное место для данных в байтах в сообщении HTX, связанном с каналом. Канал выбирается в зависимости от направления образца.

internal.htx.has_eom: boolean Возвращает true, если сообщение HTX, связанное с каналом, содержит флаг конца сообщения (EOM). В противном случае возвращает false. Канал выбирается в зависимости от направления образца.

internal.htx.nbblks: integer Возвращает число блоков в сообщении HTX, связанном с каналом. Канал выбирается в зависимости от направления образца.

internal.htx.size: integer Возвращает полный размер в байтах сообщения HTX, связанного с каналом. Канал выбирается в зависимости от направления образца.

internal.htx.used: integer Возвращает общий занятый размер в байтах (данные + метаданные) в сообщении HTX, связанном с каналом. Канал выбирается в зависимости от направления образца.

internal.htx_blk.size(<idx>): integer

internal.htx_blk.size(<idx>): integer

Возвращает размер блока в позиции <idx> в сообщении HTX, связанном с каналом, либо 0, если блока нет. Канал выбирается в зависимости от направления образца. <idx> может быть любым положительным целым числом или одним из специальных значений: * head : наиболее давно добавленный блок * tail : последний добавленный блок * first: первый блок, с которого следует (пере)начать анализ.

internal.htx_blk.type(<idx>): string

internal.htx_blk.type(<idx>): string

Возвращает тип блока в позиции <idx> в сообщении HTX, связанном с каналом, либо “HTX_BLK_UNUSED”, если блока нет. Канал выбирается в зависимости от направления образца. <idx> может быть любым положительным целым числом или одним из специальных значений: * head : наиболее давно добавленный блок * tail : последний добавленный блок * first: первый блок, с которого следует (пере)начать анализ.

internal.htx_blk.data(<idx>): binary

internal.htx_blk.data(<idx>): binary

Возвращает значение блока DATA в позиции <idx> в сообщении HTX, связанном с каналом, либо пустую строку, если блока нет или это не блок DATA. Канал выбирается в зависимости от направления образца. <idx> может быть любым положительным целым числом или одним из специальных значений:

* head : наиболее давно добавленный блок
* tail : последний добавленный блок
* first: первый блок, с которого следует (пере)начать анализ

internal.htx_blk.hdrname(<idx>): string

internal.htx_blk.hdrname(<idx>): string

Возвращает имя заголовка блока HEADER в позиции <idx> в сообщении HTX, связанном с каналом, либо пустую строку, если блока нет или это не блок HEADER. Канал выбирается в зависимости от направления образца. <idx> может быть любым положительным целым числом или одним из специальных значений:

* head : наиболее давно добавленный блок
* tail : последний добавленный блок
* first: первый блок, с которого следует (пере)начать анализ

internal.htx_blk.hdrval(<idx>): string

internal.htx_blk.hdrval(<idx>): string

Возвращает значение заголовка блока HEADER в позиции <idx> в сообщении HTX, связанном с каналом, либо пустую строку, если блока нет или это не блок HEADER. Канал выбирается в зависимости от направления образца. <idx> может быть любым положительным целым числом или одним из специальных значений:

* head : наиболее давно добавленный блок
* tail : последний добавленный блок
* first: первый блок, с которого следует (пере)начать анализ

internal.htx_blk.start_line(<idx>): string

internal.htx_blk.start_line(<idx>): string

Возвращает значение блока REQ_SL или RES_SL в позиции <idx> в сообщении HTX, связанном с каналом, либо пустую строку, если блока нет или это не блок SL. Канал выбирается в зависимости от направления образца. <idx> может быть любым положительным целым числом или одним из специальных значений:

* head : наиболее давно добавленный блок
* tail : последний добавленный блок
* first: первый блок, с которого следует (пере)начать анализ

internal.strm.is_htx: boolean Возвращает true, если текущий поток является потоком HTX: данные в буферах каналов хранятся во внутреннем представлении HTX. В противном случае возвращает false.

7.4. Предопределённые ACL

Некоторые предопределённые ACL встроены в код, поэтому их не нужно объявлять в каждом фронтенде, которому они нужны. Во избежание путаницы все их имена записаны в верхнем регистре. Их эквивалентные выражения приведены ниже.

Имя ACL           Эквивалентное выражение      Назначение
---------------+----------------------------------+------------------------------------------------------
FALSE            always_false                       никогда не совпадает
HTTP             req.proto_http                     совпадает, если протокол запроса — корректный HTTP
HTTP_1.0         req.ver 1.0                        совпадает, если версия запроса HTTP — 1.0
HTTP_1.1         req.ver 1.1                        совпадает, если версия запроса HTTP — 1.1
HTTP_2.0         req.ver 2.0                        совпадает, если версия запроса HTTP — 2.0
HTTP_3.0         req.ver 3.0                        совпадает, если версия запроса HTTP — 3.0
HTTP_CONTENT     req.hdr_val(content-length) gt 0   совпадает при наличии content-length в запросе HTTP
HTTP_URL_ABS     url_reg ^[^/:]*://                 совпадает с абсолютным URL со схемой
HTTP_URL_SLASH   url_beg /                          совпадает с URL, начинающимся с "/"
HTTP_URL_STAR    url     *                          совпадает с URL, равным "*"
LOCALHOST        src 127.0.0.1/8::1                совпадает с соединением с локального узла
METH_CONNECT     method  CONNECT                    совпадает с методом HTTP CONNECT
METH_DELETE      method  DELETE                     совпадает с методом HTTP DELETE
METH_GET         method  GET HEAD                   совпадает с методом HTTP GET или HEAD
METH_HEAD        method  HEAD                       совпадает с методом HTTP HEAD
METH_OPTIONS     method  OPTIONS                    совпадает с методом HTTP OPTIONS
METH_POST        method  POST                       совпадает с методом HTTP POST
METH_PUT         method  PUT                        совпадает с методом HTTP PUT
METH_TRACE       method  TRACE                      совпадает с методом HTTP TRACE
RDP_COOKIE       req.rdp_cookie_cnt gt 0            совпадает при наличии RDP cookie в буфере запроса
REQ_CONTENT      req.len gt 0                       совпадает при наличии данных в буфере запроса
TRUE             always_true                        всегда совпадает
WAIT_END         wait_end                           ожидает окончания анализа содержимого
---------------+----------------------------------+------------------------------------------------------