Назад | Перейти на главную страницу

HAProxy ACL несколько условий OR

Использование 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), ваше правило не соответствует и не отклоняет запрос.