★☆★ Добро пожаловать на shiro.su ★☆★ Оптимизировано под Netscape Navigator 4.0 и разрешение 800x600 ★☆★ Заходите есчё! ★☆★
⚠ САЙТ В РАЗРАБОТКЕ ⚠

ACL (Access Control Lists) в HAProxy

опубликовано 18.06.2025 · #haproxy #acl

Это перевод страницы haproxy.com — ACLs

ACL (Access Control List, список контроля доступа) проверяет условие и возвращает true (истина) или false (ложь). ACL можно использовать в различных сценариях, включая маршрутизацию трафика, блокировку запросов и преобразование сообщений. Сам по себе ACL не влияет на конфигурацию, пока не будет использован в условии if или unless в другом правиле.

ACL помогают принимать решения в конфигурации, например:

  • Направить запрос в бэкенд A или B?
  • Перенаправить запрос на другой домен?
  • Отклонить соединение от клиента?

ACL позволяют проверять различные условия и выполнять действия на основе этих проверок. Они могут анализировать:

  • Строки или шаблоны в запросе/ответе.
  • IP-адрес клиента.
  • Частоту запросов (через stick tables).
  • Статус аутентификации и многое другое.

С помощью ACL можно:

  • Принимать решения о маршрутизации.
  • Перенаправлять запросы.
  • Возвращать статические ответы.
  • Комбинировать условия с логическими операторами (AND, OR, NOT).

Базовый синтаксис ACL

Пример ACL, который возвращает true, если путь URL начинается с /images/:

frontend www
  bind :80
  acl images_url path -i -m beg /images/

Где:

  • images_url — имя ACL.
  • path — метод извлечения (fetch method), возвращающий путь URL.
  • -i — регистронезависимое сравнение.
  • -m beg — проверка на совпадение с началом строки.

Этот ACL сам по себе ничего не делает. Чтобы применить его, нужно использовать в условии:

frontend www
  bind :80
  acl images_url path_beg -i /images/
  use_backend static_assets if images_url

backend static_assets
  server s1 192.168.50.20:80

Можно использовать сокращённый синтаксис path_beg вместо path -m beg.

Сравнение нескольких значений

frontend www
  bind :80
  acl images_url path_beg -i /images/ /photos/

ACL вернёт true, если путь начинается с /images/ или /photos/.

Inline-определение ACL

Вместо отдельного объявления можно задать условие прямо в правиле:

frontend www
  bind :80
  use_backend static_assets if { path_beg -i /images/ }

Логические операторы в условиях

AND (логическое И)

Несколько ACL подряд подразумевают оператор AND:

frontend www
  bind :80
  acl images_url path_beg /images/
  acl is_get method GET
  use_backend static_assets if images_url is_get

Альтернативные варианты:

use_backend static_assets if { path_beg /images/ } { method GET }

или смешанный стиль:

use_backend static_assets if images_url { method GET }

OR (логическое ИЛИ)

Используется оператор ||:

frontend www
  bind :80
  acl images_url path_beg /images/
  acl is_jpeg path_end .jpg
  use_backend static_assets if images_url || is_jpeg

Или можно определить несколько ACL с одним именем:

acl images_url path_beg /images/
acl images_url path_end .jpg
use_backend static_assets if images_url

Отрицание (! и unless)

frontend www
  bind :80
  acl images_url path_beg /images/
  acl is_post method POST
  use_backend static_assets if images_url !is_post

Или с unless:

frontend www
  bind :80
  acl is_php path_end .php
  use_backend static_assets unless is_php

Флаги ACL

-f — загрузка значений из файла

frontend www
  bind :80
  acl images_url path -i -m beg -f /patterns.txt

Формат файла:

  • Пустые строки и комментарии (#) игнорируются.
  • Пробелы в начале строк удаляются.

-M — загрузка map-файла (ключ → значение)

Пример redirects.map:

docs.test.com  www.test.com/docs
blog.test.com  www.test.com/blog

Конфигурация:

frontend www
  bind :80
  acl requires_redirect req.hdr(Host) -i -M -f /redirects.map
  http-request redirect prefix https://%[req.hdr(Host),lower,map(/redirects.map)] code 301 if requires_redirect

-u — установка уникального ID ACL

acl images_url path_beg -i -u 50 /images/

-m — тип сравнения

Тип Описание
found Проверяет наличие образца.
bool Сравнивает как булево значение.
int Сравнивает как целое число.
ip Сравнивает IP-адрес.
bin Сравнивает бинарные данные.
len Проверяет длину строки.
str Точное совпадение строки.
sub Подстрока.
reg Регулярное выражение.
beg Начало строки.
end Конец строки.
dir Часть пути (разделённого /).
dom Часть домена (разделённого .).

Пример:

acl contains_cat path -m reg ca+t  # Найдёт "cat", "caat" и т. д.

-n — отключение DNS-разрешения

Полезно, если файл содержит только IP-адреса:

acl safe_ip src -n -f /safelist.txt

Специальные сравнения

Диапазоны чисел

acl is_5xx status 500:511      # Коды 500-511
acl high_port dst_port 1024:   # Порт ≥1024
acl low_port dst_port :1023    # Порт ≤1023

Операторы сравнения

Оператор Описание
eq Равно.
ge Больше или равно.
gt Больше.
le Меньше или равно.
lt Меньше.

Пример:

acl 10kb_response res.body_len gt 10000  # Тело ответа >10 КБ

Сравнение IP-адресов

acl is_localhost src 127.0.0.1
acl allowed_ipv4 src 192.168.0.0/16
acl allowed_ipv6 src 2001:db8::/48

Виртуальные и опциональные файлы

Виртуальные файлы (только в памяти)

acl images_url path -i -m beg -f virt@patterns.txt

Добавление значений через Runtime API:

echo "add acl virt@patterns.txt /stylesheets/" | socat stdio tcp4-connect:127.0.0.1:9999

Опциональные файлы (если нет на диске — создаётся в памяти)

acl images_url path -i -m beg -f opt@patterns.txt

Сохранение на диск перед перезагрузкой:

echo "show acl patterns.txt" | socat stdio tcp4-connect:127.0.0.1:9999 | awk '{print $2}' > patterns.txt

Примеры использования ACL

Перенаправление запросов

# HTTP → HTTPS
http-request redirect scheme https if !{ ssl_fc }

# example.com → www.example.com
http-request redirect location http://www.%[hdr(host)]%[capture.req.uri] unless { hdr_beg(host) -i www }

Кеширование ответов

http-request set-var(txn.path) path
acl is_icons_path var(txn.path) -m beg /icons/
http-request cache-use icons if is_icons_path
http-response cache-store icons if is_icons_path

Блокировка запросов

# Блокировка по User-Agent
http-request deny if { req.hdr(user-agent) -m sub evil }

# Блокировка коротких User-Agent (боты)
http-request deny if { req.hdr(user-agent) -m len le 32 }

# Блокировка доступа к /wp-admin/
http-request deny if { path_beg /wp-admin/ }

# Блокировка скрытых файлов (например, .htaccess)
http-request deny if { path -m sub /. }

Этот перевод охватывает все ключевые аспекты работы с ACL в HAProxy, включая синтаксис, логические операторы, флаги и практические примеры.

« Назад к списку записей