7. ACL и извлечение образцов
HAProxy может извлекать данные из потоков запросов или ответов, сведений о клиенте или сервере, таблиц, сведений об окружении и т. д. Извлечение таких данных называется извлечением образца. Полученные образцы могут использоваться для разных целей, например как ключ таблицы привязок, но чаще всего их сопоставляют с предопределёнными постоянными данными, называемыми шаблонами.
7.1. Основы ACL
Списки контроля доступа (ACL) позволяют объявить именованный метод сравнения любых данных со списком предопределённых шаблонов. Их следует считать практически эквивалентными функциям в большинстве языков программирования: объявление делает их доступными для последующего вызова по мере необходимости. Результат вычисления — только совпадение или несовпадение, что сопоставимо с логическими значениями во многих языках программирования. В отличие от функций в языках программирования, ACL можно перегружать сколько угодно раз, определяя дополнительные методы сопоставления для одного и того же имени. В этом случае они будут вычисляться в порядке объявления до первого совпадения.
ACL предоставляют гибкий способ переключения содержимого и, в более общем случае, принятия решений на основе данных, извлечённых из запроса, ответа или сведений о состоянии окружения. Принцип прост:
- извлечь образец данных из потока, таблицы или окружения
- при необходимости преобразовать формат извлечённого образца
- применить к образцу один или несколько методов сопоставления с шаблонами
- выполнить действия, только если шаблон совпадает с образцом
Действия обычно заключаются в блокировке запроса, выборе бэкенда или добавлении заголовка.
Для определения проверки используется ключевое слово “acl”. Синтаксис:
Эта запись создаёт новый ACL <aclname> или дополняет существующий новыми проверками. Проверки применяются к части запроса или ответа, указанной в <criterion>, и могут уточняться необязательными флагами [flags]. Некоторые критерии также поддерживают оператор, который можно указать перед набором значений. При необходимости к образцу можно применить операторы преобразования: они задаются списком ключевых слов через запятую сразу после первого ключевого слова. Значения должны иметь тип, поддерживаемый критерием, и разделяются пробелами.
Имена ACL должны состоять из прописных и строчных букв, цифр, ‘-’ (дефиса), ‘_’ (подчёркивания), ‘.’ (точки) и ‘:’ (двоеточия). Имена ACL чувствительны к регистру, поэтому “my_acl” и “My_Acl” — два разных ACL.
Число ACL не ограничено. Неиспользуемые ACL не влияют на производительность и лишь занимают небольшой объём памяти.
Критерий обычно представляет собой имя метода извлечения образца или одного из его вариантов для ACL. Метод проверки по умолчанию определяется типом результата этого метода извлечения образца. Варианты для ACL могут задавать другие методы сопоставления для одного и того же метода извлечения образца. Преобразования поддерживают только методы извлечения образцов.
Методы извлечения образцов возвращают данные следующих типов:
- логическое значение
- целое число (со знаком или без знака)
- адрес IPv4 или IPv6
- строка
- блок данных
Преобразователи преобразуют данные любого из этих типов в любой из них. Например, одни преобразователи могут привести строку к нижнему регистру, а другие — преобразовать строку в адрес IPv4 или применить сетевую маску к IP-адресу. Тип итогового образца определяется последним преобразователем в списке; по умолчанию это тип результата метода извлечения образца.
Каждый образец или преобразователь возвращает данные определённого типа, указанного в этой документации рядом с его ключевым словом. При объявлении ACL с помощью стандартного метода извлечения образца для некоторых типов автоматически выбирается метод сопоставления по умолчанию; эти соответствия приведены в таблице ниже:
Для сопоставления двоичных образцов обязательно нужно указать метод сопоставления; см. ниже.
Механизм ACL может сопоставлять эти типы с шаблонами следующих типов:
- логическое значение
- целое число или диапазон целых чисел
- IP-адрес / сеть
- строка (точное совпадение, подстрока, суффикс, префикс, подкаталог, домен)
- регулярное выражение
- блок шестнадцатеричных данных
В настоящее время поддерживаются следующие флаги ACL:
После флага “-f” указывается имя, которое должно соответствовать формату имён карт и ACL, описанному в разделе 2.7. Если шаблоны нужно загрузить из нескольких списков, можно передать несколько аргументов “-f”. При ссылке на существующий файл каждая его строка считывается как отдельное значение. Пустые строки и строки, начинающиеся с решётки (’#’), игнорируются. Все начальные пробелы и символы табуляции удаляются. Если необходимо указать допустимый шаблон, начинающийся с решётки, перед ним достаточно добавить пробел, чтобы строка не считалась комментарием. В зависимости от типа данных и метода сопоставления HAProxy может загружать строки в двоичное дерево, что обеспечивает очень быстрый поиск. Это применяется к IPv4 и точному сопоставлению строк. В таком случае дубликаты автоматически удаляются.
Флаг “-M” позволяет ACL использовать карту. Если этот флаг задан, список разбирается как записи из двух столбцов. Первый столбец содержит шаблоны, используемые ACL, а второй — образцы. Образец впоследствии может использоваться картой. Это полезно в некоторых редких случаях, когда ACL нужен лишь для проверки наличия шаблона в карте перед применением отображения.
Флаг “-u” принудительно задаёт уникальный идентификатор ACL. Этот идентификатор используется через сокетный интерфейс для идентификации ACL и динамического изменения его значений. Обратите внимание: файл всегда идентифицируется по имени, даже если задан идентификатор.
Также обратите внимание: флаг “-i” применяется к последующим записям, но не к записям, загруженным из файлов, указанных перед ним. Например:
В этом примере каждая строка из “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, можно записать:
Чтобы применить регулярное выражение к первым 500 байтам данных в буфере, используется следующий ACL:
В системах, где библиотека регулярных выражений значительно медленнее работает с “-i”, образец можно перед сопоставлением привести к нижнему регистру:
Все критерии, специфичные для ACL, подразумевают метод сопоставления по умолчанию. Чаще всего такие критерии образуются объединением имени исходного метода извлечения образца и имени метода сопоставления. Например, “hdr_beg” применяет сопоставление “beg” к образцам, полученным методом извлечения “hdr”. Такой метод сопоставления применяется, только когда ключевое слово используется само по себе, без преобразователей. Если после такого ключевого слова ACL применяется преобразователь, метод сопоставления по умолчанию из ключевого слова ACL просто игнорируется: значение имеет тип результата последнего преобразователя. Поскольку все критерии, специфичные для ACL, основаны на методе извлечения образца, вместо них всегда можно использовать исходный метод извлечения и явно указать метод сопоставления с помощью “-m”.
Если для критерия, специфичного для ACL, с помощью “-m” задан другой метод сопоставления, он просто применяется к лежащему в основе критерия методу извлечения образца. Например, все следующие ACL в точности эквивалентны:
В таблице ниже приведена матрица совместимости типов образцов или преобразователей с типами шаблонов для сопоставления. Для каждой совместимой комбинации указано имя необходимого метода сопоставления. Угловые скобки “>” и “<” вокруг имени означают, что этот метод используется по умолчанию и работает без “-m”.
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 поддерживают десятичные числа, которые фактически представляют собой два целых числа, разделённых точкой. Это используется, например, в некоторых проверках версий. К таким десятичным числам применимы все свойства целых чисел, в том числе диапазоны и операторы.
Для удобства также поддерживаются операторы сравнения. Обратите внимание: использование операторов с диапазонами не имеет особого смысла и настоятельно не рекомендуется. Аналогично, сравнение на больше или меньше с набором значений также не имеет особого смысла.
Для целочисленного сопоставления доступны следующие операторы:
Например, следующий ACL соответствует любому отрицательному значению заголовка Content-Length:
Этот ACL соответствует версиям SSL от 3.0 до 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.
Пример:
7.1.4. Сопоставление по регулярным выражениям (regex)
Как и при строковом сопоставлении, при сопоставлении по регулярным выражениям строки используются буквально, в том виде, в каком переданы, за исключением обратной косой черты ("\"), позволяющей экранировать некоторые символы, например пробел. Если перед первым регулярным выражением указан флаг “-i”, сопоставление выполняется без учёта регистра. Для сопоставления со строкой “-i” нужно либо указать её второй, либо перед первой строкой передать флаг “–”. Тот же принцип, разумеется, применяется и к сопоставлению со строкой “–”.
7.1.5. Сопоставление произвольных блоков данных
Извлечённые образцы можно сопоставлять с двоичным блоком, который не всегда можно безопасно представить строкой. Для этого при двоичном методе сопоставления шаблоны должны передаваться последовательностью из чётного числа шестнадцатеричных цифр. Каждая пара цифр представляет байт. Шестнадцатеричные цифры можно записывать в верхнем или нижнем регистре.
Пример:
7.1.6. Сопоставление адресов IPv4 и IPv6
Значения адресов IPv4 можно задавать как обычные адреса или с сетевой маской. Во втором случае адрес IPv4 совпадает, если находится в указанной сети. Вместо обычного адреса можно также указать разрешаемое имя узла, но обычно это не рекомендуется, поскольку затрудняет чтение и отладку конфигурации. Если используются имена узлов, следует как минимум обеспечить их наличие в /etc/hosts, чтобы конфигурация не зависела от случайного результата DNS в момент её разбора.
Поддерживается как обычная точечная запись адреса IPv4, так и сокращённая форма, в которой опущены октеты со значением 0:
Обратите внимание: это отличается от записи адресов 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” или оператором “||”)
- отрицание с восклицательным знаком ("!")
Условие задаётся в дизъюнктивной форме:
Такие условия обычно используются после “if” или “unless”, указывающих, когда условие запускает действие.
Например, чтобы заблокировать запросы HTTP к URL “*” с методами, отличными от “OPTIONS”, а также запросы POST без content-length, запросы GET или HEAD с content-length больше 0 и, наконец, все запросы, метод которых не входит в GET/HEAD/POST/OPTIONS!
Чтобы выбрать другой бэкенд для запросов статического содержимого сайта “www”, а также для всех запросов к узлам “img”, “video”, “download” и “ftp”:
Также можно составлять правила с помощью «анонимных ACL». Это безымянные выражения ACL, создаваемые на месте без предварительного объявления. Они должны заключаться в фигурные скобки, с пробелом перед каждой скобкой и после неё: скобки должны восприниматься как отдельные слова. Пример:
Обычно использовать эту конструкцию не рекомендуется: при такой записи гораздо легче оставить в конфигурации ошибки. Однако для очень простых правил, например сопоставляющих только один IP-адрес источника, она может быть уместнее, чем объявление ACL с произвольными именами. Ещё один пример подходящего применения:
Подробное описание ключевых слов “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>*])
Возвращает значения запрошенных свойств строкой, разделяя их разделителем, заданным параметром “51degrees-property-separator”. Устройство определяется по заголовку User-Agent, переданному преобразователю. Функции можно передать до пяти имён свойств; если имя свойства не найдено, возвращается значение “NoData”.
Пример:
add(<value>)
Прибавляет <value> к входному значению типа целого числа со знаком и возвращает результат как целое число со знаком. <value> может быть числом или именем переменной. Подробности о переменных см. в разделе 2.8
.
add_item(<delim>[,<var>[,<suff>]])
Присоединяет к текущему образцу от 2 до 3 полей, после чего образец преобразуется в строку. Первое поле, <delim>, — постоянная строка, добавляемая сразу после существующего образца, если он не пуст и при этом хотя бы одно из полей <var> или <suff> не пусто. Второе поле, <var>, — имя переменной. Переменная ищется, её содержимое преобразуется в строку и добавляется сразу после части <delim>. Если переменная не найдена, ничего не добавляется. Этот аргумент необязателен; после него можно также указать постоянную строку <suff>. Однако если <var> опущен, <suff> обязателен. Преобразователь похож на concat и позволяет создавать новые переменные из последовательности других переменных. Основное отличие в том, что он проверяет, имеет ли смысл добавлять разделитель: например, это не нужно, если текущий образец пуст. С преобразователем concat в таком случае потребовались бы 2 отдельных правила, причём первое должно было бы проверять, пуста ли строка текущего образца, прежде чем добавлять разделитель. Если разделителем должна быть запятая или закрывающая круглая скобка, её нужно защитить кавычками или обратными косыми чертами. Сами эти символы также должны быть защищены от удаления парсером первого уровня; о кавычках и экранировании см. раздел 2.2
. Примеры приведены ниже.
Пример:
aes_cbc_dec(<bits>,<nonce>,<key>[,<aad>])
Расшифровывает входные необработанные байты алгоритмом AES128-CBC, AES192-CBC или AES256-CBC в зависимости от параметра <bits>. Все остальные параметры должны быть закодированы в base64, а результат возвращается в виде необработанных байтов. Параметр <aad> необязателен. Если проверка <aad> не проходит, преобразователь не возвращает данных. <nonce>, <key> и <aad> могут быть строками или переменными. Для этого преобразователя требуется OpenSSL версии не ниже 1.0.1.
Пример:
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.
Пример:
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.
Пример:
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.
Пример:
and(<value>)
Выполняет побитовое “AND” между <value> и входным значением типа целого числа со знаком; результат возвращается как целое число со знаком. <value> может быть числом или именем переменной. Подробности о переменных см. в разделе 2.8
.
b64dec
Преобразует (декодирует) входную строку, закодированную в base64, в двоичное представление. Это операция, обратная base64(). Для варианта base64url(“URL and Filename Safe Alphabet” (RFC 4648)) см. “ub64dec”.
base2
Преобразует входной двоичный образец в строку двоичных цифр, содержащую восемь цифр на каждый входной байт. Используется для сопоставления по самому длинному префиксу с типами, чьё собственное представление не допускает сопоставления по префиксу, например с IP-префиксами.
base64
Преобразует входной двоичный образец в строку base64. Используется для записи в журнал или передачи двоичного содержимого в виде, пригодном для надёжной передачи; например, идентификатор SSL можно скопировать в заголовок. Для варианта base64url(“URL and Filename Safe Alphabet” (RFC 4648)) см. “ub64enc”.
be2dec(<separator>,<chunk_size>[,<truncate>])
Преобразует входной двоичный образец с порядком байтов от старшего к младшему в строку, содержащую по одному беззнаковому целому числу на каждые <chunk_size> входных байтов. Если указан <separator>, он вставляется через каждые <chunk_size> двоичных входных байтов. Флаг <truncate> определяет, усекаются ли входные двоичные данные по границам <chunk_size>. Максимальное значение <chunk_size> ограничено размером long long int (8 байт).
Пример:
le2dec(<separator>,<chunk_size>[,<truncate>])
Преобразует входной двоичный образец с порядком байтов от младшего к старшему в строку, содержащую по одному беззнаковому целому числу на каждые <chunk_size> входных байтов. Если указан <separator>, он вставляется через каждые <chunk_size> двоичных входных байтов. Флаг <truncate> определяет, усекаются ли входные двоичные данные по границам <chunk_size>. Максимальное значение <chunk_size> ограничено размером long long int (8 байт).
Пример:
be2hex([<separator>[,<chunk_size>[,<truncate>]]])
Преобразует входной двоичный образец с порядком байтов от старшего к младшему в шестнадцатеричную строку, содержащую по две цифры на каждый входной байт. Используется для записи в журнал или передачи шестнадцатеричных дампов двоичных входных данных в виде, пригодном для надёжной передачи; например, идентификатор SSL можно скопировать в заголовок. Если указан <separator>, он вставляется через каждые <chunk_size> двоичных входных байтов. Флаг <truncate> определяет, усекаются ли входные двоичные данные по границам <chunk_size>.
Пример:
bool
Возвращает логическое TRUE, если входное значение типа целого числа со знаком ненулевое, иначе возвращает FALSE. Совместно с and() может использоваться для получения true/false при проверке битов входного значения, например для проверки наличия флага.
bytes(<offset>[,<length>])
Извлекает несколько байтов из входного двоичного образца. Результат — двоичный образец, начинающийся с указанного смещения (в байтах) относительно исходного образца и при необходимости усечённый до заданной длины. <offset> и <length> могут быть числами или именами переменных. Преобразователь возвращает пустой образец, если <offset> или <length> недопустимо. Недопустимое <offset> — отрицательное значение или значение >= длины входного образца. Недопустимое <length> — отрицательное значение.
Пример:
capture-req(<id>)
Сохраняет строковое значение в слоте запроса <id> и возвращает его без изменений. Если слот не существует, захват завершается неудачей без сообщения об ошибке.
См. также: “declare capture”, “http-request capture”, “http-response capture”, “capture.req.hdr” и “capture.res.hdr” (методы извлечения образцов).
capture-res(<id>)
Сохраняет строковое значение в слоте ответа <id> и возвращает его без изменений. Если слот не существует, захват завершается неудачей без сообщения об ошибке.
См. также: “declare capture”, “http-request capture”, “http-response capture”, “capture.req.hdr” и “capture.res.hdr” (методы извлечения образцов).
concat([<start>[,<var>[,<end>]]])
Присоединяет к текущему образцу до 3 полей, после чего образец преобразуется в строку. Первое поле, <start>, — постоянная строка, добавляемая сразу после существующего образца. Если она не нужна, поле можно опустить. Второе поле, <var>, — имя переменной. Переменная ищется, её содержимое преобразуется в строку и добавляется сразу после части <first>. Если переменная не найдена, ничего не добавляется. Это поле тоже можно опустить. Третье поле, <end>, — постоянная строка, добавляемая после переменной; её также можно опустить. Вместе эти элементы позволяют присоединять переменные с разделителями к уже существующему набору переменных. Так можно создавать новые переменные из последовательности других переменных, например со значениями, разделёнными двоеточиями. Если разделителем должна быть запятая или закрывающая круглая скобка, её нужно защитить кавычками или обратными косыми чертами. Сами эти символы также должны быть защищены от удаления парсером первого уровня. Это часто используется для создания составных переменных из других, хотя иногда удобнее использовать строку формата с несколькими полями. Примеры приведены ниже.
Пример:
cpl
Вычисляет обратный код входного целого числа со знаком (инвертирует все биты) и возвращает результат как целое число со знаком.
crc32([<avalanche>])
Хэширует двоичный входной образец в беззнаковое 32-битное значение с использованием хэш-функции CRC32. К результату можно дополнительно применить хеш-функцию с полным лавинным эффектом, если необязательный аргумент <avalanche> равен 1. Этот преобразователь использует те же функции, что и различные алгоритмы балансировки нагрузки на основе хэширования, поэтому обеспечивает точно такие же результаты. Предназначен для совместимости с другими программными продуктами, которым требуется вычисление CRC32 на основе входных ключей, следуя наиболее распространённой реализации, как в Ethernet, Gzip, PNG и т.д. Он медленнее других алгоритмов, но может обеспечить лучшее или по крайней мере менее предсказуемое распределение. Не должен использоваться в целях безопасности, так как хэш размером 32 бит легко взломать. См. также “djb2”, “sdbm”, “wt6”, “crc32c” и директиву “hash-type”.
crc32c([<avalanche>])
Хэширует двоичный входной образец в беззнаковое 32-битное значение с использованием хэш-функции CRC32C. К результату можно дополнительно применить хеш-функцию с полным лавинным эффектом, если необязательный аргумент <avalanche> равен 1. Этот преобразователь использует те же функции, что описаны в RFC4960, Приложение B [8]. Предназначен для совместимости с другими программными продуктами, которым требуется вычисление CRC32C на основе входных ключей. Он медленнее других алгоритмов и не должен использоваться в целях безопасности, так как хэш размером 32 бит легко взломать. См. также “djb2”, “sdbm”, “wt6”, “crc32” и директиву “hash-type”.
cut_crlf
Обрезает строковое представление входного образца по первому символу возврата каретки (’\r’) или новой строки (’\n’). Изменяется только длина строки.
da-csv-conv(<prop>[,<prop>*])
Вызывает преобразователь DeviceAtlas для распознавания переданной на вход строки User Agent и возвращает строку из объединённых свойств, перечисленных в аргументе. Они разделяются символом, заданным глобальным ключевым словом “deviceatlas-property-separator”, а по умолчанию — вертикальной чертой (’|’). Язык конфигурации HAProxy ограничивает число различных свойств значением 12.
Пример:
date
Этот преобразователь используется для преобразования даты из заголовка HTTP. Это может быть дата в формате IMF, ASCTIME или RFC850. Выводит метку времени в формате UNIX.
Пример:
debug([<prefix][,<destination>])
Этот преобразователь используется для отладки. Он захватывает входной образец и отправляет его в приёмник событий <destination>, который может обозначать кольцевой буфер, например “buf0”, а также “stdout” или “stderr”. Доступные приёмники можно посмотреть во время работы командой “show events” в CLI. Если приёмник не указан, вывод направляется в “buf0”, который можно просмотреть командой CLI “show events”. Чтобы различать вывод нескольких выражений, можно передать необязательный префикс <prefix>. Он появится перед двоеточием в выводимом сообщении. Входной образец передаётся на выход без изменений, поэтому преобразователь debug можно безопасно вставить в любое место цепочки, даже для образцов непечатаемых типов.
Пример:
digest(<algorithm>)
Преобразует входной двоичный образец в хеш сообщения. Результат — двоичный образец. <algorithm> должен быть именем хеш-функции OpenSSL, например sha256.
Обратите внимание: этот преобразователь доступен только в том случае, если HAProxy собран с USE_OPENSSL.
div(<value>)
Делит входное целое число со знаком на <value> и возвращает результат как целое число со знаком. Если <value> равен нулю, возвращается наибольшее беззнаковое целое число, обычно 2^63-1. <value> может быть числом или именем переменной. Подробности о переменных см. в разделе 2.8
.
djb2([<avalanche>])
Хэширует двоичный входной образец в беззнаковое 32-битное значение с использованием хэш-функции DJB2. К результату можно дополнительно применить хеш-функцию с полным лавинным эффектом, если необязательный аргумент <avalanche> равен 1. Этот преобразователь использует те же функции, что и различные алгоритмы балансировки нагрузки на основе хэширования, поэтому обеспечивает точно такие же результаты. В основном предназначен для отладки, но может использоваться как запись в таблице привязок для сбора приблизительной статистики. Не должен использоваться в целях безопасности, так как хэш размером 32 бит легко взломать. См. также “crc32”, “sdbm”, “wt6”, “crc32c” и директиву “hash-type”.
eth.data
Используется с входным образцом, представляющим двоичный кадр Ethernet, который возвращает “fc_saved_syn”, когда параметр “tcp-ss” директивы bind равен “2”. Пропускает весь заголовок Ethernet, включая возможные VLAN, и возвращает блок двоичных данных, начинающийся с протокола уровня 3 (обычно IPv4 или IPv6). См. также “fc_saved_syn” и “tcp-ss”.
eth.dst
Используется с входным образцом, представляющим двоичный кадр Ethernet, который возвращает “fc_saved_syn”, когда параметр “tcp-ss” директивы bind равен “2”. Возвращает 6 байт заголовка Ethernet, соответствующих адресу назначения кадра, как двоичный блок. См. также “fc_saved_syn” и “tcp-ss”.
eth.hdr
Используется с входным образцом, представляющим двоичный кадр Ethernet, который возвращает “fc_saved_syn”, когда параметр “tcp-ss” директивы bind равен “2”. Обрезает всё, что находится после заголовка Ethernet, но сохраняет возможные VLAN, и возвращает этот заголовок как двоичный блок. См. также “fc_saved_syn” и “tcp-ss”.
eth.proto
Используется с входным образцом, представляющим двоичный кадр Ethernet, который возвращает “fc_saved_syn”, когда параметр “tcp-ss” директивы bind равен “2”. Возвращает номер протокола (также известный как EtherType), найденный в заголовке Ethernet после любого необязательного VLAN, в виде целого числа. Обычно это 0x800 для IPv4 или 0x86DD для IPv6. См. также “fc_saved_syn” и “tcp-ss”.
eth.src
Используется с входным образцом, представляющим двоичный кадр Ethernet, который возвращает “fc_saved_syn”, когда параметр “tcp-ss” директивы bind равен “2”. Возвращает 6 байт заголовка Ethernet, соответствующих адресу источника кадра, как двоичный блок. См. также “fc_saved_syn” и “tcp-ss”.
eth.vlan
Используется с входным образцом, представляющим двоичный кадр Ethernet, который возвращает “fc_saved_syn”, когда параметр “tcp-ss” директивы bind равен “2”. Возвращает последний VLAN ID, найденный в заголовке Ethernet, в виде целого числа. См. также “fc_saved_syn” и “tcp-ss”.
even
Возвращает логическое TRUE, если входное целое число со знаком чётное, иначе возвращает FALSE. Функционально эквивалентен “not,and(1),bool”.
field(<index>,<delimiters>[,<count>])
Извлекает из входной строки подстроку по заданному индексу с учётом указанных разделителей. Отсчёт ведётся от начала при положительном индексе или от конца при отрицательном. Индексы начинаются с 1 или -1, а разделители задаются списком символов в виде строки. Можно указать количество извлекаемых полей <count>; по умолчанию оно равно 1. Значение 0 означает извлечение всех оставшихся полей.
Пример:
fe_exists
Принимает на вход имя фронтенда и возвращает логическое TRUE, если фронтенд с таким именем существует в текущей конфигурации; иначе возвращает FALSE. Может использоваться там, где полезна проверка наличия фронтенда по динамическому имени, например при поиске в таблице соответствий или ответе на внешнюю проверку.
Пример:
fix_is_valid
Разбирает двоичную полезную нагрузку и выполняет проверки корректности для FIX (Financial Information eXchange):
- проверяет, что все идентификаторы тегов и их значения не пустые, а идентификаторы тегов — корректные числа
- проверяет, что тег BeginString является первым тегом с допустимой версией FIX
- проверяет, что тег BodyLength — второй тег с правильной длиной тела
- проверяет, что тег MsgType — третий тег
- проверяет, что последний тег в сообщении — это тег CheckSum с корректной контрольной суммой
Из-за текущего устройства HAProxy можно разобрать только первое сообщение клиента и первое сообщение сервера.
Этот преобразователь возвращает логическое значение: true, если полезная нагрузка содержит корректное сообщение FIX, и false — в противном случае.
См. также преобразователь fix_tag_value.
Пример:
fix_tag_value(<tag>)
Анализирует сообщение FIX (Financial Information eXchange) и извлекает значение из тега <tag>. <tag> может быть строкой или целым числом, указывающим на нужный тег. Любое целочисленное значение допускается, но только следующие строки преобразуются в их целочисленные эквиваленты: BeginString, BodyLength, MsgType, SenderCompID, TargetCompID, CheckSum. Другие имена тегов можно легко добавить.
Из-за текущего устройства HAProxy можно разобрать только первое сообщение клиента и первое сообщение сервера. Этот преобразователь не проверяет корректность сообщения. Настоятельно рекомендуется сначала проверить сообщение преобразователем fix_is_valid.
См. также преобразователь fix_is_valid.
Пример:
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).
Примеры:
hex
Преобразует двоичный образец в шестнадцатеричную строку, содержащую по две шестнадцатеричные цифры на каждый байт входных данных. Используется для ведения журнала или передачи шестнадцатеричных дампов некоторых двоичных данных таким образом, чтобы их можно было надёжно передавать (например, идентификатор SSL может быть скопирован в заголовок).
hex2i
Преобразует шестнадцатеричную строку, содержащую по две шестнадцатеричные цифры на каждый байт входных данных, в целое число. Если входное значение содержит символ, не являющийся шестнадцатеричной цифрой, преобразователь завершается неуспешно и ничего не возвращает. Это позволяет отличить некорректные входные данные от допустимого нулевого значения.
hmac(<algorithm>,<key>)
Преобразует двоичный образец в код аутентификации сообщения с заданным ключом. Результат — двоичный образец. Параметр <algorithm> должен быть одним из зарегистрированных имён хеш-функций OpenSSL (например, sha256). Параметр <key> должен быть закодирован в base64 и может быть строкой или переменной.
Обратите внимание: этот преобразователь доступен только в том случае, если HAProxy собран с USE_OPENSSL.
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
Преобразует входное целое число в его 32-битное двоичное представление с сетевым порядком байтов. Поскольку методы извлечения образцов используют 64-битные целые числа со знаком, этот преобразователь сначала приводит входное число к беззнаковому 32-битному целому.
http_date([<offset[,<unit>]])
Преобразует целое число, рассматриваемое как дата, отсчитанная от начала эпохи, в строку с этой датой в формате, пригодном для полей заголовков HTTP. Если задано смещение, оно прибавляется к дате до преобразования. Это особенно полезно для формирования заголовка Date, значений Expires в ответах при положительном смещении или значений Last-Modified при отрицательном. Если задана единица измерения, временная метка трактуется как число секунд от начала эпохи при “s” (по умолчанию), миллисекунд при “ms” или микросекунд при “us”. Смещение считается заданным в тех же единицах, что и входная временная метка.
iif(<true>,<false>)
Возвращает строку <true>, если входное значение истинно. В противном случае возвращает строку <false>.
Пример:
in_table([<table>])
Использует входной образец для поиска в таблице привязок текущего прокси или в указанной таблице привязок. Если ключ не найден в таблице, возвращается логическое значение false. В противном случае — логическое значение true. Может использоваться для проверки наличия определённого ключа в таблице, отслеживающей некоторые элементы (например, был ли уже виден IP-адрес источника или заголовок Authorization).
ip.data
Используется с входным образцом, представляющим двоичный кадр Ethernet, который возвращает “fc_saved_syn”, когда параметр “tcp-ss” директивы bind равен “1”, либо с результатом “eth.data”. Пропускает заголовок IP и любые необязательные опции или расширения, и возвращает блок двоичных данных, начинающийся с транспортного протокола (обычно TCP или UDP). См. также “fc_saved_syn”, “tcp-ss” и “eth.data”.
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
Используется с входным образцом, представляющим двоичный кадр Ethernet, который возвращает “fc_saved_syn”, когда параметр “tcp-ss” директивы bind равен “1”, либо с результатом “eth.data”. Возвращает адрес назначения IPv4 или IPv6 из заголовка IPv4/v6. См. также “fc_saved_syn”, “tcp-ss” и “eth.data”.
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 \
"src=%[var(sess.syn),ip.src] fp=%[var(sess.syn),ip.fp(5),hex]\n"
См. также “fc_saved_syn”, “tcp-ss”, “eth.data”, “ip.df”, “ip.ttl”, “tcp.win”, “tcp.options.mss” и “tcp.options_list”.
ip.hdr
Используется с входным образцом, представляющим двоичный кадр Ethernet, который возвращает “fc_saved_syn”, когда параметр “tcp-ss” директивы bind равен “1”, либо с результатом “eth.data”. Возвращает блок двоичных данных, начинающийся с заголовка IP и заканчивающийся после последней опции или расширения, до начала заголовка транспортного протокола. См. также “fc_saved_syn”, “tcp-ss” и “eth.data”.
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
Используется с входным образцом, представляющим двоичный кадр Ethernet, который возвращает “fc_saved_syn”, когда параметр “tcp-ss” директивы bind равен “1”, либо с результатом “eth.data”. Возвращает адрес источника IPv4 или IPv6 из заголовка IPv4/v6. См. также “fc_saved_syn”, “tcp-ss” и “eth.data”.
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
Используется с входным образцом, представляющим двоичный кадр 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
Используется с входным образцом, представляющим двоичный кадр 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>])
Применяет маску к IP-адресу и использует результат для поиска и хранения. Это позволяет всем узлам в пределах заданной маски использовать общие записи таблицы и, следовательно, один сервер. mask4 можно задать в записи с точками, например 255.255.255.0, или в форме CIDR, например 24. mask6 можно задать группами из четырёх шестнадцатеричных цифр, например ffff:ffff::, или в форме CIDR, например 64. Если mask6 не задана, преобразование адресов IPv6 завершается неудачей по соображениям обратной совместимости.
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.
Пример:
Входящий запрос от клиента 127.0.0.1:
Полученная запись журнала:
json_query(<json_path>[,<output_type>])
Преобразователь json_query поддерживает типы JSON string, boolean, number и array. Числа с плавающей точкой возвращаются строкой. Если задать output_type ‘int’, значение преобразуется в целое число. Массивы возвращаются строкой, которая начинается и заканчивается квадратными скобками. Содержимое имеет формат CSV. В зависимости от типа данных значения массива могут заключаться в кавычки. Если значения массива имеют сложные типы, строка содержит полное представление JSON каждого значения через запятую. Пример результата запроса ролей к JWT:
Если преобразование невозможно, преобразователь json_query завершается с ошибкой.
<json_path> должен быть корректной строкой JSON Path, определённой в https://datatracker.ietf.org/doc/draft-ietf-jsonpath-base/
Примечание: в зависимости от контекста и реализации результат извлечения повторяющихся ключей JSON не определён: может быть возвращено первое, последнее или любое другое вхождение одного ключа во входном содержимом. Если имена ключей переданы в закодированном виде, они не всегда будут сопоставлены. Таким образом, этот преобразователь не подходит для очистки содержимого.
Пример:
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, а результат возвращается в необработанном виде. В случае ошибки при разборе токена, проверке подписи или расшифровке содержимого будет возвращена пустая строка.
Пример:
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 .
Пример:
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, а результат возвращается в необработанном виде. В случае ошибки при разборе токена, проверке подписи или расшифровке содержимого будет возвращена пустая строка.
Пример:
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>]])
При получении на вход 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:
Алгоритм “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 при неуспешной проверке и строго отрицательное значение при любой другой ошибке. Из-за этих ненулевых кодов ошибок результат преобразователя никогда не следует преобразовывать в логическое значение. Полный список возможных возвращаемых значений приведён ниже.
Возможные возвращаемые значения следующие:
Обратите внимание: этот преобразователь доступен только в том случае, если HAProxy собран с USE_OPENSSL.
Пример:
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:
-
<key>может быть строкой или именем переменной (см. также “set-var”), содержащей путь к сертификату.Сертификаты должны быть стандартными сертификатами PEM, начинающимися с BEGIN CERTIFICATE. Их путь можно передать преобразователю напрямую или через переменную. При использовании переменной соответствующие сертификаты можно объявить в crt-store либо динамически загрузить через сокет статистики. Если путь задан напрямую и соответствующий сертификат ещё не загружен во внутреннее хранилище сертификатов, он будет загружен при разборе конфигурации. Поэтому он уже должен существовать, иначе возникнет ошибка.
Можно использовать только те сертификаты, которые явно определены как пригодные для проверки JWT. См. опцию “jwt” crt-store.
Сертификаты можно динамически обновлять и добавлять через сокет статистики. См. также “set ssl cert” и “new ssl cert” в руководстве по управлению.
Возвращает 1 при успешной проверке, 0 при неуспешной проверке и строго отрицательное значение при любой другой ошибке. Из-за этих ненулевых кодов ошибок результат преобразователя никогда не следует преобразовывать в логическое значение. Полный список возможных возвращаемых значений приведён ниже.
Возможные возвращаемые значения следующие:
Обратите внимание: этот преобразователь доступен только в том случае, если HAProxy собран с USE_OPENSSL.
Пример:
language(<value>[,<default>])
Возвращает значение с наибольшим коэффициентом q из списка, извлечённого из заголовка “accept-language” с помощью “req.fhdr”. Значения без коэффициента q имеют коэффициент q равный 1. Значения с коэффициентом q 0 отбрасываются. Учитываются только значения, входящие в список, разделённый точкой с запятой <values>. Синтаксис аргумента <value> — “lang[;lang[;lang[;…]]]”. Если ни одно значение не соответствует заданному списку и указано значение по умолчанию, оно возвращается. Обратите внимание, что имена языков могут содержать вариант после дефиса (’-’). Если такой вариант присутствует в списке, он будет сопоставлен, но если его нет — проверяется только базовый язык. Сопоставление чувствительно к регистру, а выходная строка всегда является одной из указанных в аргументах. Порядок аргументов не имеет значения, важен только порядок значений в запросе, поскольку при одинаковом коэффициенте q используется первое значение среди совпадающих.
Пример:
length
Возвращает длину строки. Этот преобразователь можно размещать только после функции извлечения строкового образца или после ключевого слова преобразования, возвращающего строку. Результат имеет целочисленный тип.
lower
Приводит строковый образец к нижнему регистру. Этот преобразователь можно размещать только после функции извлечения строкового образца или после ключевого слова преобразования, возвращающего строку. Результат имеет строковый тип.
ltime(<format>[,<offset>])
Преобразует целое число, рассматриваемое как дата от начала эпохи, в строку с этой датой в местном времени по формату <format> с помощью strftime(3). Это позволяет использовать в журналах любой формат даты. К входной дате можно применить необязательное положительное или отрицательное смещение <offset> в секундах. Поддерживаемый операционной системой формат описан на странице руководства strftime(). См. также преобразователь utime.
Пример:
ltrim(<chars>)
Пропускает любые символы из <chars> в начале строкового представления входного образца.
map(<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-адреса и строки хранятся в деревьях, поэтому используется первое совпадение с наибольшей точностью. Другие ключи хранятся в списках, поэтому используется первое совпадающее вхождение.
В следующей таблице перечислены все доступные функции таблиц соответствий с сортировкой по типу входных данных, методу сопоставления и типу результата.
Преобразователь “map_regm” ожидает группы захвата в регулярном выражении и изменяет результат, заменяя обратные ссылки, например “\1”, соответствующим совпавшим текстом.
Тип вывода “key” означает, что будет возвращён ключ найденного элемента (как он указан в файле таблицы соответствий) в виде строки вместо значения. Обратите внимание, что не поддерживается необязательный аргумент <default_value> при использовании типа вывода “key”.
Файлы, указанные в <map_name>, содержат по одной паре ключ + значение в строке. Строки, начинающиеся с ‘#’, игнорируются, как и пустые строки. Начальные табуляции и пробелы удаляются. Ключ — первое «слово», то есть последовательность символов без пробелов и табуляций. Значение — всё после следующей за ключом последовательности пробелов и табуляций до конца строки, без завершающих пробелов и табуляций.
Пример:
mod(<value>)
Делит входное целое число со знаком на <value> и возвращает остаток как целое число со знаком. Если <value> равен нулю, возвращается ноль. <value> может быть числом или именем переменной. Подробности о переменных см. в разделе 2.8
.
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):
Ещё не поддерживается:
- CONNACK (или 2): flags, protocol_version, reason_code ИЛИ любой идентификатор свойства в виде числа (только для пакетов MQTT v5.0):
Ещё не поддерживается:
Из-за текущей архитектуры HAProxy можно разобрать только первый пакет, отправленный клиентом, и первый ответ, отправленный сервером. Следовательно, этот преобразователь может извлекать данные только из типов пакетов CONNECT и CONNACK. CONNECT — это первый пакет, отправленный клиентом, а CONNACK — первый ответ, отправленный сервером.
Пример:
mqtt_is_valid
Проверяет, представляют ли двоичные входные данные корректный пакет MQTT. Возвращает логическое значение.
Из-за текущей архитектуры HAProxy можно разобрать только первый пакет, отправленный клиентом, и первый ответ, отправленный сервером. Следовательно, этот преобразователь может извлекать данные только из типов пакетов CONNECT и CONNACK. CONNECT — это первый пакет, отправленный клиентом, а CONNACK — первый ответ, отправленный сервером.
Поддерживаются только MQTT 3.1, 3.1.1 и 5.0.
Пример:
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”.
Пример:
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”.
Пример:
mul(<value>)
Умножает входное целое число со знаком на <value> и возвращает произведение как целое число со знаком. При переполнении возвращается предельное значение для соответствующего знака, чтобы избежать циклического перехода при переполнении. <value> может быть числом или именем переменной. Подробности о переменных см. в разделе 2.8
.
nbsrv
Принимает на вход строку, трактует её как имя бэкенда и возвращает число пригодных к использованию серверов в этом бэкенде. Может использоваться там, где требуется найти бэкенд по динамическому имени, например по результату поиска в таблице соответствий.
neg
Принимает входное целое число со знаком, вычисляет противоположное значение и возвращает остаток как целое число со знаком. 0 не изменяется. Оператор предназначен для обратного вычитания: чтобы вычесть входное значение из константы, достаточно выполнить “neg,add(value)”.
not
Возвращает логическое FALSE, если входное целое число со знаком ненулевое; иначе возвращает TRUE. Совместно с and() позволяет получить true/false при проверке битов входного значения, например при проверке отсутствия флага.
odd
Возвращает логическое TRUE, если входное целое число со знаком нечётное; иначе возвращает FALSE. Функционально эквивалентен “and(1),bool”.
or(<value>)
Выполняет побитовое “OR” между <value> и входным целым числом со знаком и возвращает результат как целое число со знаком. <value> может быть числом или именем переменной. Подробности о переменных см. в разделе 2.8
.
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.
Пример:
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>])
Извлекает поле сообщения 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>])
Применяет замену на основе регулярного выражения к входной строке. Выполняет ту же операцию, что и известный инструмент “sed” с “s/<regex>/<subst>/”. По умолчанию заменяет во входной строке первое вхождение наибольшего фрагмента, соответствующего регулярному выражению <regex>, на строку замены <subst>. Возможна замена всех вхождений вместо одного, если добавить флаг “g” в третий аргумент <flags>. Также возможно сделать регулярное выражение нечувствительным к регистру, добавив флаг “i” в <flags>. Поскольку <flags> — это строка, она состоит из конкатенации всех желаемых флагов. Таким образом, если нужны и “i”, и “g”, использование “gi” или “ig” даст одинаковый результат. Первое применение этого преобразователя — замена определённых символов или последовательностей на другие.
Настоятельно рекомендуется заключать регулярное выражение в защищённые кавычки, чтобы улучшить читаемость и не спутать его закрывающую скобку со скобкой функции. Как и в оболочке Bourne, первый уровень кавычек обрабатывается при выделении групп слов в строке, а второй можно использовать для аргументов. Рекомендуется использовать одинарные кавычки снаружи, поскольку они не интерпретируют обратные косые черты и знаки доллара.
Примеры:
reverse
Переворачивает входную строку байт за байтом.
Этот преобразователь не зависит от кодировки и переворачивает байты, а не символы; он не подходит для переворота текста, закодированного в UTF-8.
Это превращает поиск по суффиксу исходной строки в поиск по префиксу перевёрнутой строки и позволяет использовать в больших таблицах соответствий индексированные методы сопоставления по префиксу, такие как “map_beg”.
Примеры:
reverse_dom
Преобразует строку с именем хоста в формате, напоминающем FQDN в представление с обратным порядком меток. Одна конечная точка во входной строке игнорируется. Пустые метки приводят к неудаче преобразования.
Этот преобразователь не приводит входные данные к нижнему регистру и не удаляет порт. Он предназначен для использования в сочетании с существующими преобразователями, такими как “lower” или “host_only”, при необходимости.
Обработка точки в конце намеренно оставлена на усмотрение вызывающей стороны. Это позволяет ей решать, следует ли сопоставлять также корневой домен или только поддомены.
Форма с обратным порядком меток удобна для больших таблиц соответствий доменов: поиск по суффиксу домена превращается в поиск по префиксу, что позволяет использовать индексированные методы сопоставления по префиксу, такие как “map_beg”.
Примеры:
rfc7239_field(<field>)
Извлекает одно поле/параметр из входного значения заголовка, соответствующего формату RFC 7239.
Поддерживаемые поля: - proto: ‘http’ или ‘https’ - host: узел в формате HTTP - for: узел RFC7239 - by: узел RFC7239
Дополнительная информация здесь:
Пример:
rfc7239_is_valid
Возвращает true, если входное значение заголовка соответствует RFC 7239, и false в противном случае.
Пример:
rfc7239_n2nn
Преобразует узел RFC7239, полученный из полей заголовка ‘for’ или ‘by’ 7239, в соответствующее конечное представление nodename: - адрес ipv4 - адрес ipv6 - ‘unknown’ - идентификатор ‘_obfs’
Пример:
rfc7239_n2np
Преобразует узел RFC7239, полученный из полей заголовка ‘for’ или ‘by’ 7239, в соответствующее конечное представление nodeport: - беззнаковое целое число - идентификатор ‘_obfs’
Пример:
rfc7239_nn
Преобразует переданный адрес или строку в имя узла, соответствующее RFC7239. Можно использовать для ручного формирования полей заголовка ‘for’ или ‘by’ 7239.
Если входные данные — строка, она автоматически будет предварена символом ‘_’ для представления обфусцированного идентификатора. Строка должна соответствовать набору символов RFC7239. Если строка пустая, она преобразуется в идентификатор “unknown”.
Пример:
См. также: “rfc7239_np”
rfc7239_np
Преобразует переданное беззнаковое целое число или строку в порт узла, соответствующий RFC7239. Можно использовать для ручного формирования полей заголовка ‘for’ или ‘by’ 7239.
Если входные данные — строка, она автоматически будет предварена символом ‘_’ для представления обфусцированного идентификатора. Строка должна соответствовать набору символов RFC7239 и не может быть пустой.
Пример:
См. также: “rfc7239_nn”
rtrim(<chars>)
Пропускает любые символы из <chars> в конце строкового представления входного образца.
sdbm([<avalanche>])
Хеширует входной двоичный образец в 32-битное беззнаковое значение с помощью хеш-функции SDBM. Если необязательный аргумент <avalanche> равен 1, к результату можно применить хеш-функцию с полным лавинным эффектом. Этот преобразователь использует те же функции, что и различные алгоритмы балансировки нагрузки на основе хеша, поэтому даёт точно такие же результаты. Он предназначен преимущественно для отладки, но может использоваться как запись таблицы привязок для сбора приблизительной статистики. Его нельзя использовать для обеспечения безопасности: 32-битный хеш легко взломать. См. также “crc32”, “djb2”, “wt6”, “crc32c” и директиву “hash-type”.
secure_memcmp(<var>)
Сравнивает содержимое <var> с входным значением. Оба значения обрабатываются как двоичная строка. Возвращает логическое значение, указывающее на совпадение двух двоичных строк.
Если обе двоичные строки имеют одинаковую длину, сравнение будет выполнено за постоянное время.
Обратите внимание: этот преобразователь доступен только в том случае, если HAProxy собран с USE_OPENSSL.
Пример:
set-var(<var>[,<cond>...])
Присваивает переменной входное содержимое и возвращает его на выход без изменений, если все указанные условия истинны (список возможных условий приведён ниже). Переменная сохраняет значение и соответствующий входной тип. Подробнее о переменных см. в разделе 2.8 .
Преобразователю можно передать не более четырёх условий из следующего списка:
- “ifexists”/“ifnotexists”:
- “ifempty”/“ifnotempty”:
- “ifset”/“ifnotset”:
- “ifgt”/“iflt”:
sha1
Преобразует двоичный входной образец в дайджест SHA-1. Результат — двоичный образец длиной 20 байт.
sha2([<bits>])
Преобразует двоичный входной образец в дайджест из семейства SHA-2. Результат — двоичный образец длиной <bits>/8 байт.
Допустимые значения для <bits> — 224, 256, 384, 512, каждое из которых соответствует SHA-<bits>. Значение по умолчанию — 256.
Обратите внимание: этот преобразователь доступен только в том случае, если HAProxy собран с USE_OPENSSL.
srv_is_up
Принимает входное значение строкового типа, либо имя сервера, либо формат <backend>/<server>, и возвращает true, если указанный сервер в настоящее время находится в состоянии UP. Может использоваться в местах, где необходимо проверить состояние сервера по динамическому имени, например, значению cookie (например, req.cook(SRVID),srv_is_up) и затем принять решение о перенаправлении запроса. Перед использованием имейте в виду, что применение этого преобразователя к неконтролируемым данным может позволить внешнему наблюдателю запросить состояние любого сервера в конфигурации, что может быть недопустимо в некоторых средах.
srv_queue
Принимает входное значение строкового типа, либо имя сервера, либо формат <backend>/<server>, и возвращает число потоков в очереди на этом сервере. Может использоваться в местах, где необходимо проверить число потоков в очереди по динамическому имени, например, значению cookie (например, req.cook(SRVID),srv_queue) и затем принять решение о разрыве привязки или перенаправлении запроса. Перед использованием имейте в виду, что применение этого преобразователя к неконтролируемым данным может позволить внешнему наблюдателю запросить состояние любого сервера в конфигурации, что может быть недопустимо в некоторых средах.
strcmp(<var>)
Сравнивает содержимое <var> с входным значением типа строка. Возвращает результат как знаковое целое, совместимое с strcmp(3): 0, если обе строки идентичны. Значение меньше 0, если левая строка лексикографически меньше правой или если левая строка короче. Значение больше 0 в остальных случаях (правая строка больше левой или правая строка короче).
См. также преобразователь secure_memcmp, если требуется сравнить две двоичные строки за постоянное время.
Пример:
sub(<value>)
Вычитает <value> из входного значения типа знаковое целое и возвращает результат как знаковое целое. Примечание: чтобы вычесть входное значение из константы, достаточно выполнить “neg,add(value)”. <value> может быть числовым значением или именем переменной. См. раздел 2.8
о переменных для подробностей.
table_bytes_in_rate([<table>])
Использует входной образец для поиска в таблице привязок текущего прокси или в указанной таблице привязок. Если ключ не найден в таблице, возвращается целое значение ноль. В противном случае преобразователь возвращает среднюю интенсивность передачи данных от клиента к серверу, связанную с входным образцом в указанной таблице, измеряемую в количестве байт за период, настроенный в таблице. См. также ключевое слово извлечения образца sc_bytes_in_rate.
table_bytes_out_rate([<table>])
Использует входной образец для поиска в таблице привязок текущего прокси или в указанной таблице привязок. Если ключ не найден в таблице, возвращается целое значение ноль. В противном случае преобразователь возвращает среднюю интенсивность передачи данных от сервера к клиенту, связанную с входным образцом в указанной таблице, измеряемую в количестве байт за период, настроенный в таблице. См. также ключевое слово извлечения образца sc_bytes_out_rate.
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>])
Использует входной образец для поиска в таблице привязок текущего прокси или в указанной таблице привязок. Очищает первый счётчик общего назначения ‘0’ и возвращает его предыдущее значение. Если запись не найдена, она создаётся, и возвращается 0. Обычно используется как второй ACL в выражении для отметки соединения при истинном результате первого ACL:
Пример:
См. также ключевое слово извлечения образца sc_clr_gpc0.
table_clr_gpc1([<table>])
Использует входной образец для поиска в таблице привязок текущего прокси или в указанной таблице привязок. Очищает первый счётчик общего назначения ‘1’ и возвращает его предыдущее значение. Если запись не найдена, она создаётся, и возвращается 0. Обычно используется как второй ACL в выражении для отметки соединения при истинном результате первого ACL. См. также ключевое слово извлечения образца sc_clr_gpc1.
table_conn_cnt([<table>])
Использует входной образец для поиска в таблице привязок текущего прокси или в указанной таблице привязок. Если ключ не найден в таблице, возвращается целое значение ноль. В противном случае преобразователь возвращает общее количество входящих соединений, связанных с входным образцом в указанной таблице. См. также ключевое слово извлечения образца sc_conn_cnt.
table_conn_cur([<table>])
Использует входной образец для поиска в таблице привязок текущего прокси или в указанной таблице привязок. Если ключ не найден в таблице, возвращается целое значение ноль. В противном случае преобразователь возвращает текущее количество одновременных отслеживаемых соединений, связанных с входным образцом в указанной таблице. См. также ключевое слово извлечения образца sc_conn_cur.
table_conn_rate([<table>])
Использует входной образец для поиска в таблице привязок текущего прокси или в указанной таблице привязок. Если ключ не найден в таблице, возвращается целое значение ноль. В противном случае преобразователь возвращает среднюю интенсивность входящих соединений, связанных с входным образцом в указанной таблице. См. также ключевое слово извлечения образца sc_conn_rate.
table_expire([<table>[,<default_value>]])
Использует входной образец для поиска в таблице привязок текущего прокси или в указанной таблице привязок. Если ключ не найден в таблице, преобразователь завершается с ошибкой, за исключением случая, когда установлено <default_value>: тогда преобразователь успешно выполняется и возвращает <default_value>. Если ключ найден, преобразователь возвращает время до истечения срока действия ключа, связанную с входным образцом в указанной таблице. См. также ключевое слово извлечения образца table_idle.
table_glitch_cnt([<table>])
Использует входной образец для поиска в таблице привязок текущего прокси или в указанной таблице привязок. Если ключ не найден в таблице, возвращается целое значение ноль. В противном случае преобразователь возвращает общее количество сбоев входящих соединений, связанных с входным образцом в указанной таблице. См. также ключевое слово извлечения образца sc_glitch_cnt и fc_glitches для значения, измеренного на текущем входящем соединении.
table_glitch_rate([<table>])
Использует входной образец для поиска в таблице привязок текущего прокси или в указанной таблице привязок. Если ключ не найден в таблице, возвращается целое значение ноль. В противном случае преобразователь возвращает среднюю интенсивность сбоев входящих соединений, связанных с входным образцом в указанной таблице. См. также ключевое слово извлечения образца sc_glitch_rate.
table_gpc(<idx>[,<table>])
Использует входной образец для поиска в таблице привязок текущего прокси или в указанной
таблице привязок. Если ключ не найден в таблице, возвращается целое значение ноль. В противном случае
преобразователь возвращает текущее значение счётчика общего назначения по индексу <idx> массива,
связанного с входным образцом в указанной таблице <table>. <idx> — целое число от 0 до 99.
Если по этому индексу нет сохранённого GPC, также возвращается целочисленное значение 0. Это относится только к
data_type массива ‘gpc’ (а не к устаревшим data_types ‘gpc0’ или ‘gpc1’). См. также
ключевое слово извлечения образца sc_get_gpc.
table_gpc0([<table>])
Использует входной образец для поиска в таблице привязок текущего прокси или в указанной таблице привязок. Если ключ не найден в таблице, возвращается целочисленное значение ноль. В противном случае преобразователь возвращает текущее значение первого счётчика общего назначения, связанного с входным образцом в указанной таблице. См. также ключевое слово извлечения образца sc_get_gpc0.
table_gpc0_rate([<table>])
Использует входной образец для поиска в таблице привязок текущего прокси или в указанной таблице привязок. Если ключ не найден в таблице, возвращается целочисленное значение ноль. В противном случае преобразователь возвращает частоту увеличения счётчика gpc0 за настроенный период в таблице, связанную с входным образцом в указанной таблице. См. также ключевое слово извлечения образца sc_get_gpc0_rate.
table_gpc1([<table>])
Использует входной образец для поиска в таблице привязок текущего прокси или в указанной таблице привязок. Если ключ не найден в таблице, возвращается целочисленное значение ноль. В противном случае преобразователь возвращает текущее значение второго счётчика общего назначения, связанного с входным образцом в указанной таблице. См. также ключевое слово извлечения образца sc_get_gpc1.
table_gpc1_rate([<table>])
Использует входной образец для поиска в таблице привязок текущего прокси или в указанной таблице привязок. Если ключ не найден в таблице, возвращается целочисленное значение ноль. В противном случае преобразователь возвращает частоту увеличения счётчика gpc1 за настроенный период в таблице, связанную с входным образцом в указанной таблице. См. также ключевое слово извлечения образца sc_get_gpc1_rate.
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>])
Использует входной образец для поиска в таблице привязок текущего прокси или в указанной
таблице привязок. Если ключ не найден в таблице, возвращается целое значение ноль. В противном случае
преобразователь возвращает текущее значение метки общего назначения по индексу <idx> массива,
связанного с входным образцом в указанной таблице <table>. <idx> — целое число от 0 до 99.
Если по этому индексу нет сохранённого GPT, также возвращается целочисленное значение 0. Это относится только к
data_type массива ‘gpt’ (а не к устаревшему типу данных ‘gpt0’). См. также sc_get_gpt —
ключевое слово извлечения образца.
table_gpt0([<table>])
Использует входной образец для поиска в таблице привязок текущего прокси или в указанной таблице привязок. Если ключ не найден в таблице, возвращается целочисленное значение ноль. В противном случае преобразователь возвращает текущее значение первой метки общего назначения, связанного с входным образцом в указанной таблице. См. также ключевое слово извлечения образца sc_get_gpt0.
table_http_err_cnt([<table>])
Использует входной образец для поиска в таблице привязок текущего прокси или в указанной таблице привязок. Если ключ не найден в таблице, возвращается целочисленное значение ноль. В противном случае преобразователь возвращает общее количество ошибок типа HTTP, связанных с входным образцом в указанной таблице. См. также ключевое слово извлечения образца sc_http_err_cnt.
table_http_err_rate([<table>])
Использует входной образец для поиска в таблице привязок текущего прокси или в указанной таблице привязок. Если ключ не найден в таблице, возвращается целочисленное значение ноль. В противном случае преобразователь возвращает среднюю частоту ошибок типа HTTP, связанных с входным образцом в указанной таблице, измеряемую как количество ошибок за период, настроенный в таблице. См. также ключевое слово извлечения образца sc_http_err_rate.
table_http_fail_cnt([<table>])
Использует входной образец для поиска в таблице привязок текущего прокси или в указанной таблице привязок. Если ключ не найден в таблице, возвращается целочисленное значение ноль. В противном случае преобразователь возвращает общее количество сбоев типа HTTP, связанных с входным образцом в указанной таблице. См. также ключевое слово извлечения образца sc_http_fail_cnt.
table_http_fail_rate([<table>])
Использует входной образец для поиска в таблице привязок текущего прокси или в указанной таблице привязок. Если ключ не найден в таблице, возвращается целочисленное значение ноль. В противном случае преобразователь возвращает среднюю частоту сбоев типа HTTP, связанных с входным образцом в указанной таблице, измеряемую как количество сбоев за период, настроенный в таблице. См. также ключевое слово извлечения образца sc_http_fail_rate.
table_http_req_cnt([<table>])
Использует входной образец для поиска в таблице привязок текущего прокси или в указанной таблице привязок. Если ключ не найден в таблице, возвращается целочисленное значение ноль. В противном случае преобразователь возвращает общее количество запросов типа HTTP, связанных с входным образцом в указанной таблице. См. также ключевое слово извлечения образца sc_http_req_cnt.
table_http_req_rate([<table>])
Использует входной образец для поиска в таблице привязок текущего прокси или в указанной таблице привязок. Если ключ не найден в таблице, возвращается целочисленное значение ноль. В противном случае преобразователь возвращает среднюю частоту запросов типа HTTP, связанных с входным образцом в указанной таблице, измеряемую как количество запросов за период, настроенный в таблице. См. также ключевое слово извлечения образца sc_http_req_rate.
table_idle([<table>[,<default_value>]])
Использует входной образец для поиска в таблице привязок текущего прокси или в указанной таблице привязок. Если ключ не найден в таблице, преобразователь завершается с ошибкой, за исключением случая, когда установлено <default_value>: это делает преобразователь успешным и возвращает значение <default_value>. Если ключ найден, преобразователь возвращает время, в течение которого запись, связанная с входным образцом в указанной таблице, оставалась неактивной с момента последнего обновления. См. также ключевое слово извлечения образца table_expire.
table_inc_gpc(<idx>[,<table>])
Использует входной образец для поиска в таблице привязок текущего прокси или в указанной таблице привязок. Увеличивает значение счётчика общего назначения по индексу <idx> массива и возвращает его новое значение. <idx> — целое число от 0 до 99. Если запись не найдена, она создаётся, и возвращается значение 1. Этот преобразователь применяется только к data_type массива ‘gpc’ (а не к устаревшим data_types ‘gpc0’ или ‘gpc1’). См. также sc_inc_gpc.
table_inc_gpc0([<table>])
Использует входной образец для поиска в таблице привязок текущего прокси или в указанной таблице привязок. Увеличивает счётчик общего назначения ‘0’ и возвращает его новое значение. Если запись не найдена, она создаётся, и возвращается 1. См. также sc0/sc2/sc2_inc_gpc0. Обычно используется как второй ACL в выражении, чтобы отметить соединение при истинном результате первого ACL:
Пример:
table_inc_gpc1([<table>])
Использует входной образец для поиска в таблице привязок текущего прокси или в указанной таблице привязок. Увеличивает счётчик общего назначения ‘1’ и возвращает его новое значение. Если запись не найдена, она создаётся, и возвращается 1. См. также sc0/sc2/sc2_inc_gpc1. Обычно используется как второй ACL в выражении, чтобы отметить соединение при истинном результате первого ACL.
table_kbytes_in([<table>])
Использует входной образец для поиска в таблице привязок текущего прокси или в указанной таблице привязок. Если ключ не найден в таблице, возвращается целочисленное значение ноль. В противном случае преобразователь возвращает общее количество данных от клиента к серверу, связанных с входным образцом в указанной таблице, измеряемое в килобайтах. Тест в настоящее время выполняется на 32-битных целых числах, что ограничивает значения до 4 терабайт. См. также ключевое слово извлечения образца sc_kbytes_in.
table_kbytes_out([<table>])
Использует входной образец для поиска в таблице привязок текущего прокси или в указанной таблице привязок. Если ключ не найден в таблице, возвращается целочисленное значение ноль. В противном случае преобразователь возвращает общее количество данных от сервера к клиенту, связанных с входным образцом в указанной таблице, измеряемое в килобайтах. Тест в настоящее время выполняется на 32-битных целых числах, что ограничивает значения до 4 терабайт. См. также ключевое слово извлечения образца sc_kbytes_out.
table_server_id([<table>])
Использует входной образец для поиска в таблице привязок текущего прокси или в указанной таблице привязок. Если ключ не найден в таблице, возвращается целочисленное значение ноль. В противном случае преобразователь возвращает идентификатор сервера, связанный с входным образцом в указанной таблице. Идентификатор сервера привязывается к образцу правилом “stick” при успешном подключении к серверу. Идентификатор сервера ноль означает, что ключу не присвоен никакой сервер.
table_sess_cnt([<table>])
Использует входной образец для поиска в таблице привязок текущего прокси или в указанной таблице привязок. Если ключ не найден в таблице, возвращается целочисленное значение ноль. В противном случае преобразователь возвращает общее количество входящих сеансов, связанных с входным образцом в указанной таблице. Примечание: под сеансом здесь понимается входящее соединение, принятое правилами набора “tcp-request connection”. См. также ключевое слово извлечения образца sc_sess_cnt.
table_sess_rate([<table>])
Использует входной образец для поиска в таблице привязок текущего прокси или в указанной таблице привязок. Если ключ не найден в таблице, возвращается целочисленное значение ноль. В противном случае преобразователь возвращает среднюю частоту входящих сеансов, связанных с входным образцом в указанной таблице. Примечание: под сеансом здесь понимается входящее соединение, принятое правилами набора “tcp-request connection”. См. также ключевое слово извлечения образца sc_sess_rate.
table_trackers([<table>])
Использует входной образец для поиска в таблице привязок текущего прокси или в указанной таблице привязок. Если ключ не найден в таблице, возвращается целочисленное значение ноль. В противном случае преобразователь возвращает текущее количество одновременных соединений, отслеживающих тот же ключ, что и входной образец, в указанной таблице. Отличается от table_conn_cur тем, что не полагается на хранящуюся информацию, а использует счётчик ссылок таблицы (значение “use”, возвращаемое командой “show table” на CLI). Это может быть более подходящим для отслеживания layer7. Например, позволяет сообщить серверу число одновременных соединений от заданного адреса. См. также ключевое слово извлечения образца sc_trackers.
tcp.dst
Используется со входным образцом, представляющим двоичный заголовок TCP, возвращаемый “ip.data”. Возвращает целое число, представляющее порт назначения, содержащийся в заголовке TCP. См. также “fc_saved_syn”, “tcp-ss” и “ip.data”.
tcp.flags
Используется со входным образцом, представляющим двоичный заголовок TCP, возвращаемый “ip.data”. Возвращает целое число, представляющее флаги TCP из этого заголовка TCP. Извлекаются все 8 флагов от FIN до CWR. Каждый флаг может быть проверен с помощью преобразователя “and()”. См. RFC9293 для значений каждого флага. Также см. “fc_saved_syn”, “tcp-ss” и “ip.data”.
tcp.options.mss
Используется со входным образцом, представляющим двоичный заголовок TCP, возвращаемый “ip.data”. Ищет опцию TCP типа “MSS”, и если найдена, возвращает целое значение, соответствующее объявленному значению в этой опции, в противном случае — ноль. Значение MSS — это максимальный размер сегмента и указывает наибольший размер сегмента, который может принять другая сторона, в байтах. См. также “fc_saved_syn”, “tcp-ss” и “ip.data”.
tcp.options.sack
Используется со входным образцом, представляющим двоичный заголовок TCP, возвращаемый “ip.data”. Ищет опцию TCP типа “Sack-Permitted”, и если найдена, возвращает 1, в противном случае — ноль. См. также “fc_saved_syn”, “tcp-ss” и “ip.data”.
tcp.options.tsopt
Используется со входным образцом, представляющим двоичный заголовок TCP, возвращаемый “ip.data”. Ищет опцию TCP типа “Timestamp”, и если найдена, возвращает 1, в противном случае — ноль. См. также “fc_saved_syn”, “tcp-ss” и “ip.data”.
tcp.options.tsval
Используется со входным образцом, представляющим двоичный заголовок TCP, возвращаемый “ip.data”. Ищет опцию TCP типа “Timestamp”, и если найдена, возвращает значение временной метки, переданное другой стороной, в противном случае не возвращает ничего. Обратите внимание, что временные метки — это беззнаковые значения длиной 32 бит без определённой единицы измерения, выбираемой только другой стороной, и временные метки предполагаются независимыми между различными соединениями. См. также “fc_saved_syn”, “tcp-ss” и “ip.data”.
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, возвращаемый “ip.data”. Ищет опцию TCP типа “Window Scale”, и если найдена, возвращает 1, в противном случае — 0. См. также “fc_saved_syn”, “tcp-ss”, “ip.data”, “tcp.options.wscale”.
tcp.options_list
Используется со входным образцом, представляющим двоичный заголовок TCP, возвращаемый “ip.data”. Строит двоичную последовательность всех видов опций TCP в том же порядке, в каком они появляются в заголовке TCP. Может выдать от 0 до 60 байт (в худшем случае). Маркер конца опций не включается в результат. См. также “fc_saved_syn”, “tcp-ss” и “ip.data”.
tcp.seq
Используется со входным образцом, представляющим двоичный заголовок TCP, возвращаемый “ip.data”. Возвращает целое число, представляющее номер последовательности, используемый удалённым узлом в заголовке TCP. Номера последовательности являются беззнаковыми значениями размером 32 бит. См. также “fc_saved_syn”, “tcp-ss” и “ip.data”.
tcp.src
Используется со входным образцом, представляющим двоичный заголовок TCP, возвращаемый “ip.data”. Возвращает целое число, представляющее номер порта источника, содержащийся в заголовке TCP. См. также “fc_saved_syn”, “tcp-ss” и “ip.data”.
tcp.win
Используется со входным образцом, представляющим двоичный заголовок TCP, возвращаемый “ip.data”. Возвращает целое число, представляющее размер окна, объявленный удалённым узлом в заголовке TCP. Значение предоставляется без изменений, как 16-битное беззнаковое значение, без применения коэффициента масштабирования окна. См. также “fc_saved_syn”, “tcp-ss” и “ip.data”.
ub64dec
Этот преобразователь — вариант преобразователя b64dec для base64url. Кодирование base64url — вариант кодирования base64 с алфавитом, безопасным для URL и имён файлов. Оно также используется в стандарте JWT (JSON Web Token).
Пример:
ub64enc
Этот преобразователь — вариант base64url преобразователя base64.
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
Пример:
Например, если тело запроса состоит из значения объекта “Rectangle” (два сообщения protocol buffers PPoint), четыре поля protocol buffers можно извлечь с помощью следующих директив “ungrpc”:
Можно также извлечь промежуточное поле 48.59 как двоичный образец следующим образом:
Поскольку сообщение gRPC всегда состоит из заголовка gRPC, за которым следуют сообщения protocol buffers, в предыдущем примере поле “latitude” первого PPoint “lo” можно извлечь следующими эквивалентными директивами:
Обратите внимание, что первый преобразователь должен быть “ungrpc”, остальные должны быть “protobuf”, и только последний может иметь или не иметь второй аргумент для интерпретации предыдущего двоичного образца.
unset-var(<var>)
Сбрасывает переменную, если входные данные определены. Имя переменной начинается с обозначения её области действия. Подробнее о переменных см. в разделе 2.8 .
upper
Преобразует строковый образец в верхний регистр. Может использоваться только после функции извлечения строкового образца или после ключевого слова преобразования, возвращающего тип строки. Результат имеет тип string.
url_dec([<in_form>])
Принимает URL-кодированную строку в качестве входных данных и возвращает декодированную версию в качестве выходных данных. Входные и выходные данные имеют тип string. Если аргумент <in_form> установлен в ненулевое целочисленное значение, входная строка считается частью формы или строки запроса, и символ ‘+’ будет заменён на пробел (’ ‘). В противном случае это произойдёт только после знака вопроса, указывающего на строку запроса (’?’).
url_enc([<enc_type>])
Принимает строку в качестве входных данных и возвращает закодированную версию в качестве выходных данных. Входные и выходные данные имеют тип string. По умолчанию тип кодирования предназначен для типа query. В настоящее время другие типы не поддерживаются, но опциональный аргумент предусмотрен для будущих изменений.
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”.
Пример:
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”.
Пример:
utime(<format>[,<offset>])
Преобразует целое число, которое предполагается датой, отсчитанной от начала эпохи, в строку с этой датой в UTC. Формат задаётся строкой <format> с помощью strftime(3). Это позволяет использовать в журналах произвольный формат даты. К входной дате можно применить необязательное смещение <offset> в секундах (положительное или отрицательное). Поддерживаемые операционной системой форматы описаны на странице руководства strftime(). См. также преобразователь “ltime”, а также “ms_utime” и “us_utime”.
Пример:
when(<condition>[,<args>...])
Оценивает условие и, если оно истинно, передаёт входной образец без изменений на выход, в противном случае — ничего не возвращает. Предназначен специально для получения редко необходимых данных, которые следует выводить только при определённых условиях, например отладочной информации при возникновении ошибки.
Условие состоит из ключевого слова из приведённого ниже списка, необязательно предваряемого восклицательным знаком (’!’) для отрицания, и необязательно сопровождаемого аргументами, специфичными для этого условия:
- "error" возвращает true, когда во время обработки запроса или потока возникла ошибка. Используются те же правила, что и для "dontlog-normal" (например, успешное повторное распределение считается ошибкой).
- "forwarded" возвращает true, если запрос был перенаправлен на сервер бэкенда
- "normal" возвращает true, если ошибка не произошла (что эквивалентно "!error").
- "processed" возвращает true, если запрос был либо перенаправлен на сервер бэкенда, либо обработан апплетом.
- "stopping" возвращает true, если во время вычисления правила процесс
сейчас останавливается
- "toapplet" возвращает true, если запрос был обработан апплетом.
- "acl" возвращает true, если ACL, указанный следующим аргументом,
даёт результат true. ACL вычисляется непосредственно преобразователем,
поэтому то, к чему он обращается, должно быть допустимым в этом контексте.
Один из вариантов использования — проверить, слишком ли велико общее
время передачи, прежде чем записывать в журнал подробности
аномально долгих передач.
Обратите внимание, что содержимое всегда оценивается, поэтому такое действие не предотвращает генерацию этой информации. Оно предназначено только для предотвращения её вывода.
Например, можно добавлять отладочную информацию по потоку бэкенда в журнал только при возникновении ошибки во время обработки, или записывать дополнительные данные в журнал при остановке и т. д.
Пример:
Пример
Пример
Поскольку он прерывает оценку выражения, если условие не выполняется, его также можно использовать для предотвращения вызова последующего преобразователя. Например, это может быть использовано для вызова преобразователя debug() только при возникновении ошибки, чтобы логировать элемент только в случае необходимости.
Пример:
См. также: преобразователь отладки
word(<index>,<delimiters>[,<count>])
Извлекает n-е слово, считая с начала (положительный индекс) или с конца (отрицательный индекс), из входной строки с учётом заданных разделителей. Индексы начинаются с 1 или -1, разделители — это строка, содержащая список символов. Пустые слова пропускаются. Это означает, что разделители в начале или конце входной строки игнорируются, а последовательные разделители внутри строки считаются одним разделителем. Необязательно можно указать <count> извлекаемых слов (по умолчанию: 1). Значение 0 означает извлечение всех оставшихся слов.
Пример:
wt6([<avalanche>])
Хэширует двоичный входной образец в беззнаковое 32-битное значение с использованием хэш-функции WT6. К результату можно дополнительно применить хеш-функцию с полным лавинным эффектом, если необязательный аргумент <avalanche> равен 1. Этот преобразователь использует те же функции, что и различные алгоритмы балансировки нагрузки на основе хэширования, поэтому обеспечивает точно такие же результаты. В основном предназначен для отладки, но может использоваться как запись в таблице привязок для сбора приблизительной статистики. Не должен использоваться в целях безопасности, так как хэш размером 32 бит легко взломать. См. также “crc32”, “djb2”, “sdbm”, “crc32c” и директиву “hash-type”.
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.
Пример:
xor(<value>)
Выполняет побитовую операцию “XOR” (исключающее ИЛИ) между <value> и входным значением типа знаковое целое и возвращает результат как знаковое целое. <value> может быть числом или именем переменной. Подробнее о переменных см. в разделе 2.8
.
xxh3([<seed>])
Хеширует входной двоичный образец в 64-битное знаковое значение с помощью 64-битного варианта XXH3 хеш-функции XXhash. Хеш поддерживает начальное значение, по умолчанию равное нулю; другое значение можно передать аргументом <seed>. Эта хеш-функция известна хорошими свойствами и высокой скоростью, поэтому её можно использовать для хеширования URLs и/или параметров URL в качестве ключей таблиц привязок, собирающих статистику с низкой частотой коллизий. Однако следует соблюдать осторожность: алгоритм не считается криптографически безопасным.
xxh32([<seed>])
Хэширует двоичный входной образец в беззнаковое количество 32 бит с использованием варианта XXHash хэш-функции размером 32 бит. Этот хэш поддерживает начальное значение (seed), по умолчанию равное нулю, но может быть задано другое значение через аргумент <seed>. Этот хэш известен своей высокой эффективностью и скоростью, поэтому его можно использовать для хэширования URL и/или параметров URL в качестве ключей таблицы привязок для сбора статистики с низкой вероятностью коллизий, хотя следует помнить, что алгоритм не считается криптографически безопасным.
xxh64([<seed>])
Хэширует двоичный входной образец в знаковое количество 64 бит с использованием варианта XXHash хэш-функции размером 64 бит. Этот хэш поддерживает начальное значение (seed), по умолчанию равное нулю, но может быть задано другое значение через аргумент <seed>. Этот хэш известен своей высокой эффективностью и скоростью, поэтому его можно использовать для хэширования URL и/или параметров URL в качестве ключей таблицы привязок для сбора статистики с низкой вероятностью коллизий, хотя следует помнить, что алгоритм не считается криптографически безопасным.
7.3.2. Извлечение образцов из внутренних состояний
Первый набор методов извлечения образцов применяется к внутренней информации, не связанной даже с какими-либо данными клиента. Эти методы иногда используются с директивами “monitor fail” для передачи внутреннего состояния внешним наблюдателям. Методы извлечения образцов, описанные в этом разделе, могут использоваться в любом месте.
Сводка методов извлечения образцов в этом разделе и их соответствующие типы:
Подробный список:
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
Возвращает общее количество соединений в очереди в указанном бэкенде, делённое на количество активных серверов. Если бэкенд не указан, используется текущий. Это очень похоже на “queue”, за исключением того, что учитывается размер фермы, чтобы получить более точную оценку времени обработки нового соединения. Основное применение — с ACL для возврата страницы с извинением новым пользователям, когда становится очевидным, что они получат обслуживание ухудшенного качества, или для передачи бэкенд-серверам в заголовке, чтобы те решили работать в ухудшённом режиме или отключить некоторые функции для ускорения обработки. Обратите внимание, что в случае, если больше не останется активных серверов, будет считаться удвоенное количество соединений в очереди. Это разумная оценка, поскольку мы ожидаем, что один из серверов скоро вернётся, но всё же предпочтительнее направлять новую нагрузку на другой бэкенд, если он в лучшем состоянии. См. также методы извлечения образцов “queue”, “be_conn” и “be_sess_rate”.
be_conn([<backend>]): integer
Применяется к количеству установленных соединений в бэкенде, возможно, включая соединение, которое оценивается. Если имя бэкенда не указано, используется текущий. Также возможно проверить другой бэкенд. Может использоваться для выбора конкретной фермы, когда основная заполнена. См. также критерии “fe_conn”, “queue”, “be_conn_free” и “be_sess_rate”.
be_conn_free([<backend>]): integer
Возвращает целое значение, соответствующее количеству доступных соединений на доступных серверах в бэкенде. Места в очереди не учитываются. Резервные серверы также не учитываются, кроме случая, когда все остальные серверы недоступны. Если имя бэкенда не указано, используется текущий. Также возможно проверить другой бэкенд. Может использоваться для выбора конкретной фермы, когда основная заполнена. См. также критерии “be_conn”, “connslots” и “srv_conn_free”.
ДРУГИЕ ОГОВОРКИ И ПРИМЕЧАНИЯ: если любое из значений maxconn или maxqueue сервера равно 0 (то есть неограничено), то это извлечение образца не имеет смысла, в таком случае возвращаемое значение будет -1.
be_sess_rate([<backend>]): integer
Возвращает целочисленное значение, соответствующее скорости создания сессий в бэкенде, в количестве новых сессий в секунду. Используется с ACL для переключения на альтернативный бэкенд, когда дорогой или уязвимый бэкенд достигает слишком высокой скорости сессий, либо для ограничения злоупотребления сервисом (например, предотвращение массового скачивания онлайн-словаря). Также может быть полезно добавить этот элемент в логи с помощью директивы log-format.
Пример:
bin(<hex>): bin
Возвращает двоичную цепочку. Входные данные — шестнадцатеричное представление строки.
bool(<bool>): bool
Возвращает логическое значение. <bool> может быть ’true’, ‘false’, ‘1’ или ‘0’. Значения ‘false’ и ‘0’ эквивалентны. Значения ’true’ и ‘1’ эквивалентны.
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
Возвращает текущую дату как число секунд с начала эпохи (с 01/01/1970).
Если указано смещение, то оно добавляется к текущей дате перед возвратом значения. Это особенно полезно для вычисления относительных дат, так как допускаются как положительные, так и отрицательные смещения. Полезно использовать вместе с преобразователем http_date.
Параметр <unit> необязателен и может быть установлен в “s” для секунд (поведение по умолчанию), “ms” для миллисекунд или “us” для микросекунд. Если указана единица измерения, возвращаемое значение — целое число, отражающее количество секунд, миллисекунд или микросекунд с эпохи, плюс смещение. Полезно, когда требуется разрешение времени менее одной секунды.
Пример:
date_us: integer Возвращает микросекунды даты (часть “секунды” возвращается образцом date). Этот образец согласован с образцом date, поскольку берётся из той же структуры timeval.
env(<name>): string
Возвращает строку, содержащую значение переменной среды <name>. Напоминаем, что переменные среды являются специфичными для процесса и извлекаются при запуске процесса. Это может быть полезно для передачи некоторой информации следующему узлу или с использованием ACL для выполнения определённых действий при запуске процесса определённым образом.
Примеры:
fe_conn([<frontend>]): integer
Возвращает количество текущих установленных соединений на фронтенде, возможно, включая соединение, которое оценивается. Если имя фронтенда не указано, используется текущий. Также возможно проверить другой фронтенд. Может использоваться для возврата страницы с извинением перед жёсткой блокировкой или для использования определённого бэкенда для отвода новых запросов, когда ферма считается перегруженной. В основном используется с ACL, но также может применяться для передачи некоторых статистических данных серверам в заголовках HTTP. См. также извлечения образцов “dst_conn”, “be_conn”, “fe_sess_rate”.
fe_req_rate([<frontend>]): integer
Возвращает целое значение, соответствующее количеству запросов HTTP в секунду, отправленных на фронтенд. Это число может отличаться от “fe_sess_rate” в ситуациях, когда включено keep-alive на стороне клиента.
fe_sess_rate([<frontend>]): integer
Возвращает целое значение, соответствующее скорости создания сессий на фронтенде, в количестве новых сессий в секунду. Используется с ACL для ограничения скорости входящих сессий до приемлемого диапазона, чтобы предотвратить злоупотребление сервисом на ранней стадии, например, в сочетании с другими ACL уровня 4 для вынуждения клиентов немного подождать, пока скорость не упадёт ниже порога. Также может быть полезно добавить этот элемент в журналы с помощью директивы log-format. См. также директиву “rate-limit sessions” для использования на фронтендах.
Пример:
hostname: string Возвращает имя хоста системы.
int(<integer>): signed integer
Возвращает знаковое целое число.
ipv4(<ipv4>): ipv4
Возвращает IPv4.
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”.
Для фильтра возвращается его идентификатор, определённый разработчиками. Если идентификатор не определён, возвращается шестнадцатеричное значение, соответствующее уникальному внутреннему идентификатору.
Основная цель этой функции — возможность указывать в журналах последнюю сущность, прервавшую обработку, для упрощения отладки проблем. Информация о сущностях может меняться со временем и не должна использоваться для других целей, кроме отладки.
Пример:
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
Возвращает метод.
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
Возвращает общее количество соединений в очередях указанного бэкенда, включая все соединения в очередях серверов. Если имя бэкенда не указано, используется текущий, но также возможно проверить другой. Полезно с ACL или для передачи статистики серверам бэкенда. Может использоваться для принятия действий при превышении известного уровня очереди, как правило, указывающего на всплеск трафика или значительное замедление на серверах. Одним из возможных действий может быть отклонение новых пользователей, но при этом принимаются старые. См. также извлечения образцов “avg_queue”, “be_conn” и “be_sess_rate”.
quic_enabled: boolean Возвращает true, если поддержка транспортного протокола QUIC была скомпилирована и если слушатели QUIC не отключены глобальным параметром “tune.quic.listen”. См. также глобальный параметр “tune.quic.listen”.
rand([<range>]): integer
Возвращает случайное целое число в диапазоне из <range> возможных значений, начиная с нуля. Если диапазон не указан, по умолчанию используется 2^32, что даёт числа от 0 до 4294967295. Может быть полезно для передачи некоторых значений, необходимых для принятия решений о маршрутизации, например, или просто для отладки. Этот случайный выбор не должен использоваться в целях безопасности.
srv_conn([<backend>/]<server>): integer
Возвращает целое значение, соответствующее количеству установленных соединений на указанном сервере, включая, возможно, оцениваемое соединение. Если <backend> опущен, сервер ищется в текущем бэкенде. Может использоваться для выбора конкретной фермы при заполнении одного сервера или для информирования сервера о нашем представлении количества активных соединений с ним. См. также методы извлечения “fe_conn”, “be_conn”, “queue” и “srv_conn_free”.
srv_conn_free([<backend>/]<server>): integer
Возвращает целое значение, соответствующее количеству доступных соединений на указанном сервере, включая, возможно, оцениваемое соединение. Значение не включает места в очереди. Если <backend> опущен, сервер ищется в текущем бэкенде. Может использоваться для выбора конкретной фермы при заполнении одного сервера или для информирования сервера о нашем представлении количества активных соединений с ним. См. также методы извлечения “be_conn_free” и “srv_conn”.
ДРУГИЕ ОГОВОРКИ И ПРИМЕЧАНИЯ: если maxconn сервера равно 0, то данное извлечение образца явно не имеет смысла, в таком случае возвращаемое значение будет -1.
srv_is_up([<backend>/]<server>): boolean
Возвращает true, если указанный сервер находится в состоянии UP, и false — если он находится в состоянии DOWN или в режиме обслуживания. Если <backend> опущен, сервер ищется в текущем бэкенде. Используется в основном для принятия решений на основе внешнего статуса, сообщённого через проверку работоспособности (например, доступность географического сайта). Другое возможное применение, которое скорее является обходным приёмом, заключается в использовании фиктивных серверов как логических переменных, которые могут быть включены или выключены через CLI, чтобы правила, зависящие от таких ACL, можно было настраивать в реальном времени.
srv_iweight([<backend>/]<server>): integer
Возвращает целое значение, соответствующее начальному весу сервера. Если <backend> опущен, сервер ищется в текущем бэкенде. См. также “srv_weight” и “srv_uweight”.
srv_queue([<backend>/]<server>): integer
Возвращает целое значение, соответствующее количеству соединений, ожидающих в очереди на указанном сервере. Если <backend> опущен, сервер ищется в текущем бэкенде. Иногда может использоваться совместно с директивой “use-server” для принудительного использования заведомо более быстрого сервера при небольшой загрузке. См. также методы извлечения образца “srv_conn”, “avg_queue” и “queue”.
srv_sess_rate([<backend>/]<server>): integer
Возвращает целое значение, соответствующее интенсивности создания сессий на указанном сервере, в количестве новых сессий в секунду. Если <backend> опущен, сервер ищется в текущем бэкенде. В основном используется с ACL, но может быть полезно и при ведении журнала. Используется для переключения на альтернативный бэкенд когда дорогостоящий или уязвимый бэкенд достигает слишком высокой интенсивности создания сессий, либо для ограничения злоупотребления сервисом (например, предотвращение перегрузки серверов из-за латентных запросов).
Пример:
srv_uweight([<backend>/]<server>): integer
Возвращает целое значение, соответствующее видимому пользователю весу сервера. Если <backend> опущен, сервер ищется в текущем бэкенде. См. также “srv_weight” и “srv_iweight”.
srv_weight([<backend>/]<server>): integer
Возвращает целое значение, соответствующее текущему (или эффективному) весу сервера. Если <backend> опущен, сервер ищется в текущем бэкенде. См. также “srv_iweight” и “srv_uweight”.
stopping: boolean Возвращает TRUE, если процесс, вызывающий функцию, в настоящее время останавливается. Это может быть полезно для ведения журнала или для смягчения определённых проверок или помощи при закрытии соединений во время мягкой остановки.
str(<string>): string
Возвращает строку.
table_avl([<table>]): integer
Возвращает общее количество доступных записей в таблице привязок текущего прокси или в указанной таблице привязок. См. также “table_cnt”.
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” или в сообщениях журнала, значение всегда равно “–”.
Пример:
uptime: integer Возвращает время работы текущего рабочего процесса HAProxy в секундах.
uuid([<version>]): string
Возвращает UUID в соответствии со стандартом RFC 9562. Если версия не указана, возвращается UUID версии 4 (полностью случайный).
Поддерживаются версии 4 и 7.
var(<var-name>[,<default>]): undefined
Возвращает переменную с сохранённым типом. Если переменная не задана, извлечение образца завершается неудачей, кроме случая, когда указано значение по умолчанию: тогда оно возвращается как строка. Допускаются пустые строки. Подробнее о переменных см. в разделе 2.8 .
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>(необязательно): строка-разделитель переменных. По умолчанию — “, " (запятая с пробелом). Может быть настроена на любую строку. Напоминание: для передачи запятых или пробелов в аргументе функции их необходимо заключить в одинарные или двойные кавычки (если выражение уже находится в кавычках, используйте другие).
Возвращаемое значение:
- При успехе: строка, содержащая все подходящие переменные
- При неудаче: пусто (извлечение образца завершается неудачей), если буфер вывода слишком мал. Функция не усекает вывод; она целиком завершается неудачей, чтобы не возвращать неполные данные.
Это особенно полезно для отладки, ведения журнала или экспорта состояний переменных.
Примеры:
wait_end: boolean Это извлечение либо возвращает true, когда период проверки завершён, либо не возвращает образец. Используется только в ACL, в сочетании с анализом содержимого для предотвращения преждевременного принятия неверного решения. Может также использоваться для откладывания некоторых действий, например, задержанного отказа для определённых адресов. Поскольку оно либо останавливает оценку правил, либо немедленно возвращает true, рекомендуется использовать этот ACL последним в правиле. Обратите внимание, что предопределённый ACL “WAIT_END” всегда доступно без предварительного объявления. Этот тест был разработан для использования с анализом содержимого запроса TCP.
Примеры:
waiting_entity: string Возвращает идентификатор сущности, которая ожидала продолжения обработки при возникновении ошибки или тайм-аута. Это может быть правило или фильтр, например. Однако этот список не является исчерпывающим, и формат всех возможных сущностей не обязательно документирован.
Когда сущность — правило, возвращается её расположение. Это имя конфигурационного файла, содержащего правило, за которым следует номер строки, где определено это правило, разделённые двоеточием.
Для фильтра возвращается его идентификатор, определённый разработчиками. Если идентификатор не определён, возвращается шестнадцатеричное значение, соответствующее уникальному внутреннему идентификатору.
Основная цель этой функции — возможность указать в журнале сущность, блокирующую анализ потока при возникновении ошибки или тайм-аута, прервавших обработку, для упрощения отладки. Информация о сущностях может изменяться со временем и не должна использоваться для других целей, кроме отладки.
Пример:
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
Точная дата получения соединения 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
Возвращает время приёма-передачи (RTT), измеренное ядром для соединения с бэкендом. Аргумент <unit> необязателен; единица измерения по умолчанию — миллисекунды. <unit> может принимать значение “ms” для миллисекунд или “us” для микросекунд. Если соединение с сервером не установлено, не использует TCP или операционная система не поддерживает TCP_INFO (например, ядра Linux до 2.4), извлечение образца завершается неудачей.
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 ). Полный список кодов ошибок и соответствующих сообщений приведён ниже:
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
Возвращает значение 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
Если соединение не использует ни TCP, ни QUIC, извлечение образца завершается неудачей. Для QUIC возвращает сглаженное время приёма-передачи для соединения с клиентом. Для TCP возвращает время приёма-передачи (RTT), измеренное ядром для соединения с клиентом. Аргумент <unit> необязателен; единица измерения по умолчанию — миллисекунды. <unit> может принимать значение “ms” для миллисекунд или “us” для микросекунд. Если соединение с сервером не установлено или операционная система не поддерживает TCP_INFO (например, ядра Linux до 2.4), извлечение образца завершается неудачей.
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”. Пример (ниже поля вручную разделены и снабжены комментариями):
Преобразователь “bytes()” помогает извлечь из пакета отдельные поля. be2dec() также позволяет читать фрагменты и выводить их как целые числа. Для более точного извлечения см. преобразователи “eth.XXX”.
Пример со входными данными IPv4:
См. также действие “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
Возвращает среднюю интенсивность передачи байт от клиента к серверу из текущих отслеживаемых счётчиков, измеряемую числом байт за период, настроенный в таблице. См. также “table_bytes_in_rate”.
sc_bytes_out_rate(<ctr>[,<table>]): integer
Возвращает среднюю интенсивность передачи байт от сервера к клиенту из текущих отслеживаемых счётчиков, измеряемую числом байт за период, настроенный в таблице. См. также “table_bytes_out_rate”.
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
Обнуляет первый счётчик общего назначения, связанный с текущими отслеживаемыми счётчиками, и возвращает его предыдущее значение. До первого вызова сохранённое значение равно нулю, поэтому первый вызов всегда возвращает ноль. Обычно используется как второй ACL в выражении, чтобы отметить соединение при истинном результате первого ACL:
Пример:
sc_clr_gpc1(<ctr>[,<table>]): integer
Обнуляет второй счётчик общего назначения, связанный с текущими отслеживаемыми счётчиками, и возвращает его предыдущее значение. До первого вызова сохранённое значение равно нулю, поэтому первый вызов всегда возвращает ноль. Обычно используется как второй ACL в выражении, чтобы отметить соединение при истинном результате первого ACL.
sc_conn_cnt(<ctr>[,<table>]): integer
Возвращает суммарное число входящих соединений из текущих отслеживаемых счётчиков. См. также “table_conn_cnt”.
sc_conn_cur(<ctr>[,<table>]): integer
Возвращает текущее число одновременных соединений, отслеживающих те же счётчики. Это число автоматически увеличивается при начале отслеживания и уменьшается при его прекращении. См. также “table_conn_cur”.
sc_conn_rate(<ctr>[,<table>]): integer
Возвращает среднюю интенсивность соединений из текущих отслеживаемых счётчиков, измеряемую числом соединений за период, настроенный в таблице. См. также “table_conn_rate”.
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
Возвращает значение первого счётчика общего назначения, связанного с текущими отслеживаемыми счётчиками. См. также “table_gpc0” и sc/sc0/sc1/sc2_inc_gpc0.
sc_get_gpc1(<ctr>[,<table>]): integer
Возвращает значение второго счётчика общего назначения, связанного с текущими отслеживаемыми счётчиками. См. также “table_gpc1” и sc/sc0/sc1/sc2_inc_gpc1.
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
Возвращает значение первой метки общего назначения, связанной с текущими отслеживаемыми счётчиками. См. также “table_gpt0”.
sc_glitch_cnt(<ctr>[,<table>]): integer
Возвращает суммарное число протокольных сбоев, наблюдавшихся в клиентских соединениях, связанных с текущими отслеживаемыми счётчиками. Обычно эти сбои приводят к прекращению запросов или соединений, поэтому возвращаемое значение часто относится к прежним соединениям. Хорошего или плохого значения нет, но некачественный клиент может иногда вызывать несколько сбоев на соединение, а очень некорректный или злонамеренный клиент — быстро добавлять тысячи событий в одном соединении. См. также fc_glitches для числа сбоев в текущем соединении, src_glitch_cnt для поиска по источнику и sc_glitch_rate для измерения интенсивности событий.
sc_glitch_rate(<ctr>[,<table>]): integer
Возвращает среднюю интенсивность протокольных сбоев в клиентских соединениях для текущих отслеживаемых счётчиков, измеряемую числом событий за период, настроенный в таблице. Обычно эти сбои приводят к прекращению запросов или соединений, поэтому возвращаемое значение часто относится к прежним соединениям. Хорошего или плохого значения нет, но некачественный клиент может иногда вызывать несколько сбоев на соединение, поэтому обычно ожидается низкая интенсивность. Однако очень некорректный или злонамеренный клиент может быстро добавлять тысячи событий на соединение и поддерживать здесь высокую интенсивность. См. также “table_glitch_rate” и “sc_glitch_cnt”.
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
Возвращает среднюю интенсивность увеличения первого счётчика общего назначения, связанного с текущими отслеживаемыми счётчиками. Показывает частоту увеличения счётчика 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
Возвращает среднюю интенсивность увеличения второго счётчика общего назначения, связанного с текущими отслеживаемыми счётчиками. Показывает частоту увеличения счётчика 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
Возвращает суммарное число ошибок HTTP из текущих отслеживаемых счётчиков. Включает как ошибки запросов, так и ответы с ошибками 4xx. См. также “table_http_err_cnt”.
sc_http_err_rate(<ctr>[,<table>]): integer
Возвращает среднюю интенсивность ошибок HTTP из текущих отслеживаемых счётчиков, измеряемую числом ошибок за период, настроенный в таблице. Включает как ошибки запросов, так и ответы с ошибками 4xx. См. также src_http_err_rate.
sc_http_fail_cnt(<ctr>[,<table>]): integer
Возвращает суммарное число сбоев ответов HTTP из текущих отслеживаемых счётчиков. Включает как ошибки ответов, так и коды состояния 5xx, кроме 501 и 505. См. также “table_http_fail_cnt”.
sc_http_fail_rate(<ctr>[,<table>]): integer
Возвращает среднюю интенсивность сбоев ответов HTTP из текущих отслеживаемых счётчиков, измеряемую числом сбоев за период, настроенный в таблице. Включает как ошибки ответов, так и коды состояния 5xx, кроме 501 и 505. См. также “table_http_fail_rate”.
sc_http_req_cnt(<ctr>[,<table>]): integer
Возвращает суммарное число запросов HTTP из текущих отслеживаемых счётчиков. Включает все начатые запросы, корректные и некорректные. См. также src_http_req_cnt.
sc_http_req_rate(<ctr>[,<table>]): integer
Возвращает среднюю интенсивность запросов HTTP из текущих отслеживаемых счётчиков, измеряемую числом запросов за период, настроенный в таблице. Включает все начатые запросы, корректные и некорректные. См. также src_http_req_rate.
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
Увеличивает первый счётчик общего назначения, связанный с текущими отслеживаемыми счётчиками, и возвращает его новое значение. До первого вызова сохранённое значение равно нулю, поэтому первый вызов увеличивает его до 1 и возвращает 1. Обычно используется как второй ACL в выражении, чтобы отметить соединение при истинном результате первого ACL:
Пример:
sc_inc_gpc1(<ctr>[,<table>]): integer
Увеличивает второй счётчик общего назначения, связанный с текущими отслеживаемыми счётчиками, и возвращает его новое значение. До первого вызова сохранённое значение равно нулю, поэтому первый вызов увеличивает его до 1 и возвращает 1. Обычно используется как второй ACL в выражении, чтобы отметить соединение при истинном результате первого ACL.
sc_kbytes_in(<ctr>[,<table>]): integer
Возвращает общий объём данных от клиента к серверу из текущих отслеживаемых счётчиков в килобайтах. Сейчас проверка выполняется с 32-битными целыми числами, что ограничивает значения 4 терабайтами. См. также “table_kbytes_in”.
sc_kbytes_out(<ctr>[,<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
Возвращает суммарное число входящих соединений, преобразованных в сеансы, то есть принятых правилом “tcp-request connection”, из текущих отслеживаемых счётчиков. Бэкенд может насчитать больше сеансов, чем соединений: каждое соединение может породить множество сеансов бэкенда, если соединение с клиентом использует постоянные соединения HTTP keep-alive. См. также “table_sess_cnt”.
sc_sess_rate(<ctr>[,<table>]): integer
Возвращает среднюю интенсивность сеансов из текущих отслеживаемых счётчиков, измеряемую числом сеансов за период, настроенный в таблице. Сеанс — это соединение, прошедшее ранние правила “tcp-request connection”. Бэкенд может насчитать больше сеансов, чем соединений: каждое соединение может породить множество сеансов бэкенда, если соединение с клиентом использует постоянные соединения HTTP keep-alive. См. также “table_sess_rate”.
sc_tracked(<ctr>[,<table>]): boolean
Возвращает true, если указанный счётчик сеанса сейчас отслеживается текущим сеансом. Может быть полезен при решении, следует ли задавать определённые значения в заголовке, передаваемом серверу.
sc_trackers(<ctr>[,<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: запоздалый ответ может вновь открыть соединение, закрытое по тайм-ауту, и поменять представление о том, какая сторона является источником, а какая — назначением.
Пример:
src_bytes_in_rate([<table>]): integer
Работает как преобразователь “table_bytes_in_rate”, при этом ключом служит адрес источника входящего соединения.
Эквивалентно: src,table_bytes_in_rate([<table>])
src_bytes_out_rate([<table>]): integer
Работает как преобразователь “table_bytes_out_rate”, при этом ключом служит адрес источника входящего соединения.
Эквивалентно: src,table_bytes_out_rate([<table>])
src_clr_gpc(<idx>[,<table>]): integer
Работает как преобразователь “table_clr_gpc”, при этом ключом служит адрес источника входящего соединения.
Эквивалентно: src,table_clr_gpc(<idx>[,<table>])
src_clr_gpc0([<table>]): integer
Работает как преобразователь “table_clr_gpc0”, при этом ключом служит адрес источника входящего соединения.
Эквивалентно: src,table_clr_gpc0([<table>])
src_clr_gpc1([<table>]): integer
Работает как преобразователь “table_clr_gpc1”, при этом ключом служит адрес источника входящего соединения.
Эквивалентно: src,table_clr_gpc1([<table>])
src_conn_cnt([<table>]): integer
Работает как преобразователь “table_conn_cnt”, при этом ключом служит адрес источника входящего соединения.
Эквивалентно: src,table_conn_cnt([<table>])
src_conn_cur([<table>]): integer
Работает как преобразователь “table_conn_cur”, при этом ключом служит адрес источника входящего соединения.
Эквивалентно: src,table_conn_cur([<table>])
src_conn_rate([<table>]): integer
Работает как преобразователь “table_conn_rate”, при этом ключом служит адрес источника входящего соединения.
Эквивалентно: src,table_conn_rate([<table>])
src_get_gpc(<idx>[,<table>]): integer
Работает как преобразователь “table_gpc”, при этом ключом служит адрес источника входящего соединения.
Эквивалентно: src,table_gpc(<idx>[,<table>])
src_get_gpc0([<table>]): integer
Работает как преобразователь “table_gpc0”, при этом ключом служит адрес источника входящего соединения.
Эквивалентно: src,table_gpc0([<table>])
src_get_gpc1([<table>]): integer
Работает как преобразователь “table_gpc1”, при этом ключом служит адрес источника входящего соединения.
Эквивалентно: src,table_gpc1([<table>])
src_get_gpt(<idx>[,<table>]): integer
Работает как преобразователь “table_gpt”, при этом ключом служит адрес источника входящего соединения.
Эквивалентно: src,table_gpt(<idx>[,<table>])
src_get_gpt0([<table>]): integer
Работает как преобразователь “table_gpt0”, при этом ключом служит адрес источника входящего соединения.
Эквивалентно: src,table_gpt0([<table>])
src_glitch_cnt([<table>]): integer
Работает как преобразователь “table_glitch_cnt”, при этом ключом служит адрес источника входящего соединения.
Эквивалентно: src,table_glitch_cnt([<table>])
src_glitch_rate([<table>]): integer
Работает как преобразователь “table_glitch_rate”, при этом ключом служит адрес источника входящего соединения.
Эквивалентно: src,table_glitch_rate([<table>])
src_gpc_rate(<idx>[,<table>]): integer
Работает как преобразователь “table_gpc_rate”, при этом ключом служит адрес источника входящего соединения.
Эквивалентно: src,table_gpc_rate(<idx>[,<table>])
src_gpc0_rate([<table>]): integer
Работает как преобразователь “table_gpc0_rate”, при этом ключом служит адрес источника входящего соединения.
Эквивалентно: src,table_gpc0_rate([<table>])
src_gpc1_rate([<table>]): integer
Работает как преобразователь “table_gpc1_rate”, при этом ключом служит адрес источника входящего соединения.
Эквивалентно: src,table_gpc1_rate([<table>])
src_http_err_cnt([<table>]): integer
Работает как преобразователь “table_http_err_cnt”, при этом ключом служит адрес источника входящего соединения.
Эквивалентно: src,table_http_err_cnt([<table>])
src_http_err_rate([<table>]): integer
Работает как преобразователь “table_http_err_rate”, при этом ключом служит адрес источника входящего соединения.
Эквивалентно: src,table_http_err_rate([<table>])
src_http_fail_cnt([<table>]): integer
Работает как преобразователь “table_http_fail_cnt”, при этом ключом служит адрес источника входящего соединения.
Эквивалентно: src,table_http_fail_cnt([<table>])
src_http_fail_rate([<table>]): integer
Работает как преобразователь “table_http_fail_rate”, при этом ключом служит адрес источника входящего соединения.
Эквивалентно: src,table_http_fail_rate([<table>])
src_http_req_cnt([<table>]): integer
Работает как преобразователь “table_http_req_cnt”, при этом ключом служит адрес источника входящего соединения.
Эквивалентно: src,table_http_req_cnt([<table>])
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”, при этом ключом служит адрес источника входящего соединения.
Эквивалентно: src,table_inc_gpc(<idx>[,<table>])
src_inc_gpc0([<table>]): integer
Работает как преобразователь “src_inc_gpc0”, при этом ключом служит адрес источника входящего соединения.
Эквивалентно: src,table_inc_gpc0([<table>])
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
Работает как преобразователь “table_kbytes_in”, при этом ключом служит адрес источника входящего соединения.
Эквивалентно: src,table_kbytes_in([<table>])
src_kbytes_out([<table>]): integer
Работает как преобразователь “table_kbytes_out”, при этом ключом служит адрес источника входящего соединения.
Эквивалентно: src,table_kbytes_out([<table>])
src_port: integer Возвращает целочисленное значение, соответствующее исходному порту TCP соединения на стороне клиента, то есть порту, с которого подключился клиент. Любые правила tcp/http могут изменить этот адрес. Использование этой функции ограничено, поскольку современные протоколы в настоящее время не уделяют большого внимания исходным портам.
src_sess_cnt([<table>]): integer
Работает как преобразователь “table_sess_cnt”, при этом ключом служит адрес источника входящего соединения.
Эквивалентно: src,table_sess_cnt([<table>])
src_sess_rate([<table>]): integer
Работает как преобразователь “table_sess_rate”, при этом ключом служит адрес источника входящего соединения.
Эквивалентно: src,table_sess_rate([<table>])
src_updt_conn_cnt([<table>]): integer
Создаёт или обновляет запись, связанную с адресом источника входящего соединения в таблице привязок текущего прокси или в указанной таблице привязок. Эта таблица должна быть настроена для хранения типа данных “conn_cnt”, иначе сопоставление будет проигнорировано. Текущее значение счётчика увеличивается на единицу, и таймер истечения обновляется. Возвращается обновлённое значение счётчика, поэтому результат не может быть нулевым. Использовалось для блокировки злоупотребляющих сервисом по их адресу источника. Примечание: рекомендуется использовать более полные действия “track-sc*” в правилах “tcp-request” вместо этого.
Пример:
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
Возвращает значения запрошенных свойств в виде строки, где значения разделены разделителем, указанным с помощью “51degrees-property-separator”. Устройство идентифицируется с использованием всех важных заголовков HTTP из запроса. Функция может принимать до пяти имён свойств, и если имя свойства не найдено, возвращается значение “NoData”.
Пример:
bs.aborted: boolean Возвращает true, если для текущего потока от сервера получено прерывание. В противном случае возвращает false.
bs.debug_str([<bitmap>]): string
Эта функция предназначена для использования разработчиками в ходе сложных сессий устранения неполадок. Она извлекает некоторые внутренние состояния из нижних уровней потока и соединения бэкенда и упорядочивает их в виде строки, обычно в форме последовательности “name=value”, разделённых пробелами. Необязательный аргумент <bitmap> указывает, из каких уровней извлекать информацию, и представляет собой арифметическую операцию ИЛИ (или сумму) следующих значений: - уровень сокета: 16 - уровень соединения: 8 - транспортный уровень (например SSL): 4 - соединение мультиплексора: 2 - поток мультиплексора: 1
Эти значения могут меняться между версиями. Значение по умолчанию ноль является особым и включает все уровни. Не следует полагаться на вывод этой функции для долгосрочного мониторинга рабочей системы. Она предназначена для эволюции даже в стабильной ветке по мере роста потребности в детализации. Одним из типичных применений является объединение этой информации в конце log-format вместе с fs.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
Эта функция предназначена для использования разработчиками в ходе сложных сессий устранения неполадок. Она извлекает некоторые внутренние состояния из нижних уровней потока и соединения фронтенда и упорядочивает их в виде строки, обычно в форме последовательности “name=value”, разделённых пробелами. Необязательный аргумент <bitmap> указывает, из каких уровней извлекать информацию, и представляет собой арифметическую операцию ИЛИ (или сумму) следующих значений: - уровень сокета: 16 - уровень соединения: 8 - транспортный уровень (например SSL): 4 - соединение мультиплексора: 2 - поток мультиплексора: 1
Эти значения могут меняться между версиями. Значение по умолчанию ноль является особым и включает все уровни. Не следует полагаться на вывод этой функции для долгосрочного мониторинга рабочей системы. Она предназначена для эволюции даже в стабильной ветке по мере роста потребности в детализации. Одним из типичных применений является объединение этой информации в конце log-format вместе с 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/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/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/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), содержащихся в данном сертификате, разделённых запятыми.
Можно использовать для проверки сертификата клиента.
Пример:
Результат:
ssl_c_serial: binary Возвращает серийный номер сертификата, представленного клиентом, когда входящее соединение было установлено через транспортный уровень SSL/TLS. При использовании для ACL значения для сравнения могут передаваться в шестнадцатеричном виде.
ssl_c_sha1: binary Возвращает отпечаток SHA-1 сертификата, представленного клиентом, если входящее соединение установлено по транспортному протоколу SSL/TLS. Можно использовать для привязки клиента к серверу либо передачи этой информации серверу. Выходные данные двоичные, поэтому для передачи этого отпечатка серверу его нужно кодировать в hex либо base64, как в примере ниже:
Пример:
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/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/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”.
Пример:
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
Возвращает двоичную форму списка шифров сообщения ClientHello. Максимальная длина возвращаемого значения ограничена размером общего буфера захвата, управляемым параметром “tune.ssl.capture-buffer-size”. Аргумент <filter_option> позволяет фильтровать возвращаемые данные. Допустимые значения:
Пример:
ssl_fc_cipherlist_hex([<filter_option>]): string
Возвращает двоичную форму списка шифров сообщения ClientHello в шестнадцатеричной кодировке. Максимальная длина возвращаемого значения ограничена размером общего буфера захвата, управляемым параметром “tune.ssl.capture-buffer-size”. Аргумент <filter_option> позволяет фильтровать возвращаемые данные. Допустимые значения:
ssl_fc_cipherlist_str([<filter_option>]): string
Возвращает декодированную текстовую форму списка шифров сообщения ClientHello. Максимальная длина возвращаемого значения ограничена размером общего буфера захвата, управляемым параметром “tune.ssl.capture-buffer-size”. Аргумент <filter_option> позволяет фильтровать возвращаемые данные. Допустимые значения:
Этот метод извлечения образца доступен только с 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”: может быть именем файла с относительным или абсолютным путём, либо псевдонимом, в зависимости от способа объявления сертификата в конфигурации.
Пример:
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”.
Пример:
ssl_fc_eclist_bin([<filter_option>]): binary
Возвращает двоичную форму списка поддерживаемых эллиптических кривых в сообщении ClientHello. Максимальная длина возвращаемого значения ограничена размером общей буферной области захвата, управляемой параметром “tune.ssl.capture-buffer-size”. Параметр <filter_option> позволяет фильтровать возвращаемые данные. Допустимые значения:
Пример:
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
Возвращает двоичную форму списка расширений сообщения ClientHello. Максимальная длина возвращаемого значения ограничена размером общей буферной области захвата, управляемой параметром “tune.ssl.capture-buffer-size”. Параметр <filter_option> позволяет фильтровать возвращаемые данные. Допустимые значения:
Пример:
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.
Пример:
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
Возвращает содержимое расширения 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_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/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/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 и возвращает тело, соответствующее вхождению #<occ> токена <token>. Вхождения начинаются с 1, и если номер не указан, может совпадать любое, хотя на практике пока проверяется только первое. Это можно использовать для извлечения имён файлов или аргументов в файлах, собранных с помощью distcc через HAProxy. См. документацию протокола distcc для полного списка поддерживаемых токенов.
distcc_param(<token>[,<occ>]): integer
Анализирует сообщение distcc и возвращает параметр, соответствующий вхождению #<occ> токена <token>. Вхождения начинаются с 1, и если номер не указан, может совпадать любое, хотя на практике пока проверяется только первое. Это можно использовать для извлечения определённой информации, такой как версия протокола, размер файла или аргумент в файлах, собранных с помощью distcc через HAProxy. Другой пример использования — ожидание начала содержимого предварительно обработанного файла перед подключением к серверу, чтобы избежать неактивных соединений. См. документацию протокола distcc для полного списка поддерживаемых токенов.
Пример:
payload(<offset>,<length>): binary (deprecated)
Это псевдоним для “req.payload” при использовании в контексте запроса (например, “stick on”, “stick match”) и для “res.payload” при использовании в контексте ответа, например, в “stick store response”.
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
Извлекает двоичный блок из <length> байтов, начиная с байта <offset> в буфере запроса. В качестве особого случая, если аргумент <length> равен нулю, извлекается весь буфер от <offset> до конца. Это можно использовать с ACL для проверки наличия определённого содержимого в буфере в любом месте.
Производные ACL:
req.payload_lv(<offset1>,<length>[,<offset2>]): binary
Извлекает двоичный блок, размер которого записан в поле длиной <length> байтов по смещению <offset1>, а начало находится по смещению <offset2>, если оно указано, либо сразу после поля длины в буфере запроса. Параметр <offset2> также поддерживает относительные смещения, если перед ним стоит знак ‘+’ либо ‘-’.
Производные ACL:
Пример: см. пример для ключевого слова “stick store-response”.
req.proto_http: boolean req_proto_http: boolean (устарело) Возвращает true, когда данные в буфере запроса похожи на HTTP и правильно разбираются как HTTP. Используется тот же анализатор, что и для обычных запросов HTTP, поэтому неожиданностей быть не должно. Тест не даёт совпадения до завершения разбора запроса, ошибки или истечения тайм-аута. Можно использовать для указания протокола в журналах TCP, но основное применение — задерживать анализ запроса TCP до появления полного запроса HTTP в буфере, например для отслеживания заголовка.
Пример:
req.rdp_cookie([<name>]): string
Когда буфер запроса похож на протокол 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:
Пример:
См. также “balance rdp-cookie”, “persist rdp-cookie”, “tcp-request” и ACL “req.rdp_cookie”.
req.rdp_cookie_cnt([name]): integer
Пытается разобрать буфер запроса как протокол RDP, затем возвращает целое число, соответствующее количеству найденных cookie RDP. Если указано необязательное имя cookie, учитываются только совпадающие по имени. Используется в основном в ACL.
Производные ACL:
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”.
Примеры:
req.ssl_cipherlist binary
Возвращает двоичную форму списка поддерживаемых клиентом вариантов симметричных шифров, указанных в содержимом сообщения ClientHello TLS. Обратите внимание, что это применяется только к сырым данным, найденным в буфере запроса, а не к данным, расшифрованным через уровень данных SSL, поэтому это не будет работать со строками “bind”, имеющими опцию “ssl”. См. “ssl_fc_cipherlist_bin”, который является эквивалентом для SSL bind, используемым при указании опции “ssl”. Это извлечение анализирует только первое сообщение ClientHello, найденное в буфере запроса, см. документацию ключевого слова “req.ssl_sni” для более подробной информации об ограничениях (HelloRetryRequest, повторное согласование, Encrypted Client Hello).
Примеры:
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
Возвращает двоичную форму списка криптографических параметров обмена ключами, поддерживаемых клиентом и указанных в TLS ClientHello. В TLS v1.3 keyshare входит в сообщение ClientHello и является последним расширением приветствия клиента. Обратите внимание, что это применяется только к необработанному содержимому буфера запроса, а не к содержимому, расшифрованному через слой данных SSL, поэтому не работает со строками “bind”, имеющими опцию “ssl”. Это извлечение анализирует только первое сообщение ClientHello в буфере запроса; подробнее о последствиях этого ограничения (HelloRetryRequest, повторное согласование, Encrypted Client Hello) см. в документации ключевого слова “req.ssl_sni”.
Примеры:
req.ssl_sigalgs binary
Возвращает двоичную форму списка алгоритмов подписи, поддерживаемых клиентом и указанных в TLS ClientHello. Он доступен как расширение приветствия клиента. Обратите внимание, что это применяется только к необработанному содержимому буфера запроса, а не к содержимому, расшифрованному через слой данных SSL, поэтому не работает со строками “bind”, имеющими опцию “ssl”. См. “ssl_fc_sigalgs_bin” — эквивалент для SSL bind, который можно использовать при указанной опции “ssl”. Это извлечение анализирует только первое сообщение ClientHello в буфере запроса; подробнее о последствиях этого ограничения (HelloRetryRequest, повторное согласование, Encrypted Client Hello) см. в документации ключевого слова “req.ssl_sni”.
Примеры:
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_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
Возвращает двоичную форму списка поддерживаемых клиентом групп, указанных в TLS ClientHello и используемых для обмена ключами; они могут включать обмен как на эллиптических кривых, так и без EC. Обратите внимание, что это применяется только к необработанному содержимому буфера запроса, а не к содержимому, расшифрованному через слой данных SSL, поэтому не работает со строками “bind”, имеющими опцию “ssl”. См. “ssl_fc_eclist_bin” — эквивалент для SSL bind, который можно использовать при указанной опции “ssl”. Это извлечение анализирует только первое сообщение ClientHello в буфере запроса; подробнее о последствиях этого ограничения (HelloRetryRequest, повторное согласование, Encrypted Client Hello) см. в документации ключевого слова “req.ssl_sni”.
Примеры:
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:
res.len: integer Возвращает целое число байтов, присутствующих в буфере ответа. В основном используется в ACL. Важно понимать, что этот тест не возвращает false, пока буфер меняется. Поэтому проверка равенства нулю почти всегда немедленно совпадёт в начале потока, тогда как проверка наличия большего объёма данных будет ждать их поступления и вернёт false только тогда, когда HAProxy уверен, что данные больше не поступят. Этот тест предназначен для анализа содержимого ответа TCP, но также может использоваться в правилах expect на основе tcp-check.
res.payload(<offset>,<length>): binary
Извлекает двоичный блок длиной <length> байтов, начиная с байта <offset> в буфере ответа. Особый случай: если аргумент <length> равен нулю, извлекается весь буфер от <offset> до конца. Можно использовать с ACL для проверки наличия определённого содержимого в любом месте буфера. Также может использоваться в правилах expect на основе tcp-check.
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 Возвращает объединение первого заголовка Host и части пути запроса, которая начинается с первой косой черты и заканчивается перед вопросительным знаком. В средах с виртуальным хостингом это полезно для обнаружения злоупотреблений URL и повышения эффективности общих кешей. Использование с таблицей привязок ограниченного размера также позволяет собирать статистику по наиболее часто запрашиваемым объектам для каждой пары хост/путь. В ACL это позволяет задавать простые правила переключения по содержимому, одновременно учитывающие хост и путь, например “www.example.com/favicon.ico ”. См. также “path” и “uri”.
Производные ACL:
Примечание: производные 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 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 response header”; idx — позиция ключевого слова capture в конфигурации. Первая запись имеет индекс 0. См. также “capture response header”.
capture.res.ver: string Извлекает версию HTTP из ответа и возвращает её в формате “HTTP/<major>.<minor>”. Можно использовать в журналах, поскольку используется сохраняемая информация. Если версия ответа недопустима, извлечение образца завершается неудачей.
cookie([<name>]): string (deprecated)
Извлекает последнее вхождение cookie с именем <name> из строки заголовка “Cookie” в запросе либо заголовка “Set-Cookie” в ответе и возвращает его значение в виде строки. Обычно применяется, чтобы несколько клиентов с общим профилем использовали один сервер. Это похоже на поведение “appsession” с “request-learn”, но поддерживает синхронизацию между несколькими узлами и сохранение состояния при перезапусках. Если имя не задано, возвращается значение первого cookie. Это извлечение больше не следует использовать: его следует заменить на req.cook() либо res.cook(), поскольку направление неоднозначно определяется контекстом использования.
hdr([<name>[,<occ>]]): string
При использовании с запросами эквивалентно req.hdr(), а с ответами — res.hdr(). Подробности см. в описаниях этих извлечений. Если направление извлечения вызывает сомнения, используйте явные варианты. Обратите внимание, что в отличие от метода извлечения образцов hdr(), ключевые слова ACL hdr_* однозначно применяются к заголовкам запроса.
http_auth(<userlist>): boolean
Возвращает логическое значение, указывающее, соответствуют ли полученные от клиента данные аутентификации имени пользователя и паролю, сохранённым в указанном userlist. Эта функция извлечения практически бесполезна вне ACL. Сейчас поддерживается только базовая аутентификация HTTP.
http_auth_bearer([<header>]): string
Возвращает предоставленный клиентом токен из данных авторизации при использовании схемы Bearer (например, для передачи JSON Web Tokens). Данные, отправленные клиентом, не проверяются. Если указан конкретный <header>, разбирается этот заголовок вместо Authorization.
http_auth_group(<userlist>): string
Возвращает строку с именем пользователя из полученных от клиента данных аутентификации, если и имя пользователя, и пароль действительны согласно указанному userlist. Основное назначение — использование в ACL, где затем проверяется принадлежность пользователя к какой-либо группе из списка. Эта функция извлечения практически бесполезна вне ACL. Сейчас поддерживается только базовая аутентификация HTTP.
Производные ACL:
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:
Пример:
path: string Извлекает путь URL запроса, который начинается с первой косой черты и заканчивается перед вопросительным знаком (без части с хостом). Обычно используется с кешами, поддерживающими предварительное получение, и порталами, которым нужно объединять сведения из баз данных и хранить их в кешах. Для исходящих кешей разумнее использовать “url”. В ACL обычно применяется для сопоставления точных имён файлов (например, “/login.php”) либо частей каталогов с помощью производных форм. См. также методы извлечения “url” и “base”. Обратите внимание, что любая ссылка на фрагмент в URI (’#’ после пути) строго запрещена стандартом HTTP и будет отклонена. Однако, если во фронтенде, принимающем запрос, включена “option accept-unsafe-violations-in-http-request”, часть с фрагментом будет принята и также появится в path.
Производные ACL:
Примечание: производные 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
Извлекает строку запроса, начинающуюся после первого вопросительного знака. Если вопросительного знака нет, извлечение ничего не возвращает. Если вопросительный знак есть, но после него ничего нет, возвращается пустая строка. Поэтому наличие строки запроса легко проверить методом сопоставления “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
Это извлечение предполагает, что тело запроса 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
Извлекает последнее вхождение cookie с именем <name> из строки заголовка “Cookie” в запросе и возвращает его значение в виде строки. Если имя не задано, возвращается значение первого cookie. В ACL вычисляются все подходящие cookie. Пробелы вокруг имени и значения игнорируются согласно спецификации заголовка Cookie (RFC6265). Имя cookie чувствительно к регистру. Пустые cookie допустимы, поэтому присутствующий пустой cookie может возвращать пустое значение. Для обнаружения присутствия используйте сопоставление “found”. Для cookie ответа, отправленных сервером, используйте вариант res.cook().
Производные ACL:
Примечание: производные ACL нельзя использовать с последующим преобразователем или в ACL с методом сопоставления шаблонов “-m”.
req.cook_cnt([<name>]): integer
Возвращает целочисленное значение числа вхождений cookie <name> в запросе либо всех cookie, если <name> не указан.
req.cook_names([<delim>]): string
Формирует строку путём объединения всех имён cookie в порядке их появления в запросе (заголовок Cookie) на момент вычисления правила. Разделитель по умолчанию — запятая (’,’), но его можно переопределить необязательным аргументом <delim>. В этом случае учитывается только первый символ <delim>.
req.cook_val([<name>]): integer
Извлекает последнее вхождение cookie с именем <name> из строки заголовка “Cookie” в запросе и преобразует его значение в возвращаемое целое число. Если имя не задано, возвращается значение первого cookie. В ACL перебираются все подходящие имена, пока не будет найдено совпадающее значение.
req.fhdr(<name>[,<occ>]): string
Возвращает полное значение последнего вхождения заголовка <name> в запросе HTTP. В отличие от req.hdr(), запятые в значении возвращаются как есть и не используются как разделители. Иногда это полезно для таких заголовков, как User-Agent.
При использовании в ACL все вхождения перебираются до нахождения совпадения.
Необязательно можно указать конкретное вхождение числом позиции. Положительные значения задают позицию от первого вхождения, где 1 — первое. Отрицательные значения задают позицию относительно последнего, где -1 — последнее.
req.fhdr_cnt([<name>]): integer
Возвращает целое число вхождений поля заголовка запроса с именем <name> либо общее число полей заголовков, если <name> не указан. Как и req.fhdr(), отличается от res.hdr_cnt() тем, что не разделяет заголовки по запятым.
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:
Примечание: производные ACL нельзя использовать с последующим преобразователем или в ACL с методом сопоставления шаблонов “-m”.
req.hdr_cnt([<name>]): integer
Возвращает целое число вхождений поля заголовка запроса с именем <name> либо общее число значений полей заголовков, если <name> не указан. Как и req.hdr(), считает каждую часть значения заголовка, отделённую запятой. Если нужно считать заголовки целиком, следует использовать req.fhdr_cnt().
В ACL можно использовать для обнаружения наличия, отсутствия или злоупотребления конкретным заголовком, а также для блокировки атак контрабанды запросов путём отклонения запросов, содержащих более одного экземпляра определённых заголовков.
Дополнительные сведения о сопоставлении заголовков см. в req.hdr().
req.hdr_ip([<name>[,<occ>]]): ip
Извлекает последнее вхождение заголовка <name> в запросе HTTP, преобразует его в адрес IPv4 или IPv6 и возвращает этот адрес. В ACL проверяются все вхождения; если <name> опущен, проверяется каждое значение каждого заголовка. Разбор строго следует формату RFC7239 с расширением: за адресом IPv4 необязательно могут следовать двоеточие (’:’) и допустимый десятичный номер порта (от 0 до 65535), который будет молча отброшен. Все остальные формы не совпадают и приводят к игнорированию адреса.
Параметр <occ> обрабатывается так же, как в req.hdr().
Обычно используется с заголовками X-Forwarded-For и X-Client-IP.
req.hdr_names([<delim>]): string
Формирует строку путём объединения всех имён заголовков в порядке их появления в запросе на момент вычисления правила. Разделитель по умолчанию — запятая (’,’), но его можно переопределить необязательным аргументом <delim>. В этом случае учитывается только первый символ <delim>.
req.hdr_val([<name>[,<occ>]]): integer
Извлекает последнее вхождение заголовка <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:
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
Извлекает последнее вхождение cookie с именем <name> из строки заголовка “Set-Cookie” в ответе и возвращает его значение в виде строки. Если имя не указано, возвращается значение первого cookie.
Можно использовать в правилах expect на основе tcp-check.
Производные ACL:
res.cook_cnt([<name>]): integer
Возвращает целое число вхождений cookie <name> в ответе либо всех cookie, если <name> не указан. В основном это полезно вместе с ACL для обнаружения подозрительных ответов.
Можно использовать в правилах expect на основе tcp-check.
res.cook_names([<delim>]): string
Формирует строку путём объединения всех имён cookie в порядке их появления в ответе (заголовки Set-Cookie) на момент вычисления правила. Разделитель по умолчанию — запятая (’,’), но его можно переопределить необязательным аргументом <delim>. В этом случае учитывается только первый символ <delim>.
Можно использовать в правилах expect на основе tcp-check.
res.cook_val([<name>]): integer
Извлекает последнее вхождение cookie с именем <name> из строки заголовка “Set-Cookie” в ответе, преобразует его значение в целое число и возвращает результат. Если имя не указано, возвращается значение первого cookie.
Можно использовать в правилах expect на основе tcp-check.
res.fhdr([<name>[,<occ>]]): string
Работает так же, как метод извлечения req.fhdr(), но действует на заголовки ответа HTTP.
Как и req.fhdr(), метод извлечения res.fhdr() возвращает полные значения. Если заголовок определён как список, следует использовать res.hdr().
Этот метод извлечения иногда полезен с такими заголовками, как Date или Expires.
Можно использовать в правилах expect на основе tcp-check.
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
Работает так же, как метод извлечения req.hdr(), но действует на заголовки ответа HTTP.
Как и req.hdr(), метод извлечения res.hdr() считает запятую разделителем. Если это нежелательно, следует использовать res.fhdr().
Можно использовать в правилах expect на основе tcp-check.
Производные ACL:
Примечание: производные ACL нельзя использовать с последующим преобразователем или в ACL с методом сопоставления шаблонов “-m”.
res.hdr_cnt([<name>]): integer
Работает так же, как метод извлечения req.hdr_cnt(), но действует на заголовки ответа HTTP.
Как и req.hdr_cnt(), метод извлечения res.hdr_cnt() считает запятую разделителем. Если это нежелательно, следует использовать res.fhdr_cnt().
Можно использовать в правилах expect на основе tcp-check.
res.hdr_ip([<name>[,<occ>]]): ip
Работает так же, как метод извлечения req.hdr_ip(), но действует на заголовки ответа HTTP.
Можно использовать для сохранения некоторых данных в таблице привязок.
Можно использовать в правилах expect на основе tcp-check.
res.hdr_names([<delim>]): string
Формирует строку путём объединения всех имён заголовков в порядке их появления в ответе на момент вычисления правила. Разделитель по умолчанию — запятая (’,’), но его можно переопределить необязательным аргументом <delim>. В этом случае учитывается только первый символ <delim>.
Можно использовать в правилах expect на основе tcp-check.
res.hdr_val([<name>[,<occ>]]): integer
Работает так же, как метод извлечения 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:
server_status: integer Возвращает целое число, содержащее код состояния HTTP, полученный от сервера. Если ответ от сервера не получен, извлечение образца завершается неудачей.
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:
Примечание: производные 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
Извлекает первое вхождение параметра <name> в строке запроса, которая начинается после ‘?’ либо <delim> и заканчивается перед ‘&’, ‘;’ либо <delim>. Имя параметра чувствительно к регистру, если третьим аргументом не добавлено “i”. Если имя не задано, подходит любой параметр и возвращается первый. Результат — строка со значением параметра <name> в том виде, в котором оно указано в запросе (декодирование URL не выполняется). Это можно использовать для привязки сеанса по идентификатору клиента, извлечения cookie приложения, переданного параметром URL, либо для проверок в ACL. Обратите внимание, что версия этого извлечения для ACL перебирает несколько параметров и последовательно возвращает значения всех параметров, если имя не задано.
Производные ACL:
Примечание: производные ACL нельзя использовать с последующим преобразователем или в ACL с методом сопоставления шаблонов “-m”.
Пример:
urlp_val([<name>[,<delim>[,i]]]): integer
См. “urlp” выше. Извлекает параметр URL <name> в запросе и преобразует его в целое число. Это можно использовать, например, для привязки сеанса по идентификатору пользователя либо с ACL для сопоставления номера страницы или цены.
7.3.7. Извлечение образцов для разработчиков
Этот набор методов извлечения образцов предназначен для разработчиков; его никогда нельзя использовать в рабочей среде, кроме случаев, когда разработчик требует этого для отладки. Кроме того, особое внимание обратной совместимости уделяться не будет. Нет гарантии, что перечисленные ниже методы извлечения образцов не изменятся, не будут переименованы или просто удалены. Поэтому при необходимости использовать их следует соблюдать особую осторожность. Во избежание неоднозначности они помещены в отдельную область “internal”, например “internal.strm.is_htx”.
Сводка методов извлечения образцов в этом разделе и их соответствующие типы:
Подробный список:
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
Возвращает размер блока в позиции <idx> в сообщении HTX, связанном с каналом, либо 0, если блока нет. Канал выбирается в зависимости от направления образца. <idx> может быть любым положительным целым числом или одним из специальных значений: * head : наиболее давно добавленный блок * tail : последний добавленный блок * first: первый блок, с которого следует (пере)начать анализ.
internal.htx_blk.type(<idx>): string
Возвращает тип блока в позиции <idx> в сообщении HTX, связанном с каналом, либо “HTX_BLK_UNUSED”, если блока нет. Канал выбирается в зависимости от направления образца. <idx> может быть любым положительным целым числом или одним из специальных значений: * head : наиболее давно добавленный блок * tail : последний добавленный блок * first: первый блок, с которого следует (пере)начать анализ.
internal.htx_blk.data(<idx>): binary
Возвращает значение блока DATA в позиции <idx> в сообщении HTX, связанном с каналом, либо пустую строку, если блока нет или это не блок DATA. Канал выбирается в зависимости от направления образца. <idx> может быть любым положительным целым числом или одним из специальных значений:
* head : наиболее давно добавленный блок
* tail : последний добавленный блок
* first: первый блок, с которого следует (пере)начать анализ
internal.htx_blk.hdrname(<idx>): string
Возвращает имя заголовка блока HEADER в позиции <idx> в сообщении HTX, связанном с каналом, либо пустую строку, если блока нет или это не блок HEADER. Канал выбирается в зависимости от направления образца. <idx> может быть любым положительным целым числом или одним из специальных значений:
* head : наиболее давно добавленный блок
* tail : последний добавленный блок
* first: первый блок, с которого следует (пере)начать анализ
internal.htx_blk.hdrval(<idx>): string
Возвращает значение заголовка блока HEADER в позиции <idx> в сообщении HTX, связанном с каналом, либо пустую строку, если блока нет или это не блок HEADER. Канал выбирается в зависимости от направления образца. <idx> может быть любым положительным целым числом или одним из специальных значений:
* head : наиболее давно добавленный блок
* tail : последний добавленный блок
* first: первый блок, с которого следует (пере)начать анализ
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 встроены в код, поэтому их не нужно объявлять в каждом фронтенде, которому они нужны. Во избежание путаницы все их имена записаны в верхнем регистре. Их эквивалентные выражения приведены ниже.