Использование Haproxy 1.5.12 в Ubuntu 12.04
Мне нужно ограничить доступ к моему веб-сайту для запросов, поступающих с определенных IP-адресов или имеющих определенный параметр в запросе.
Так, например, следующий запрос должен работать только с авторизованных IP-адресов:
http://www-test.example.com/page.php
И этот запрос нужно выполнять с любого IP (в том числе разрешенного):
http://www-test.example.com/page.php?devtool=1
Мои списки ACL:
acl is_test hdr(host) -m sub test
acl is_allowed src -f /etc/haproxy/allowed_ips
acl is_devtool urlp(devtool) 1
acl is_devtool hdr_sub(Referer) devtool=1
и они отлично работают, если используются исключительно:
http-request deny if is_test ! is_allowed
или
http-request deny if is_test ! is_devtool
Но если я объединю их с ИЛИ, я не смогу получить доступ к URL-адресу с разрешенного IP (инвертирование тестов не помогает):
http-request deny if is_test ! is_allowed || is_test ! is_devtool
есть идеи как это сделать?
Спасибо
Тест, который вы, кажется, хотите провести, таков:
A && !(B || C)
... но это логически не эквивалентно тому, что вы написали, а по сути это ...
(A && !B) || (A && !C)
Логический эквивалент A && !(B || C)
без использования скобок для приоритета на самом деле это:
A && !B && !C
Итак, то, что вы ищете, должно быть таким:
http-request deny if is_test !is_allowed !is_devtool
Или, чтобы повторить: отклонить запрос, если -
is_test
, иis_allowed
, иis_devtool
Пока любое из этих условий является ложным (не тестовым, разрешенным, является devtool), ваше правило не соответствует и не отклоняет запрос.