Это перевод страницы 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, включая синтаксис, логические операторы, флаги и практические примеры.