web-dev-qa-db-ja.com

HAProxy ACL複数OR条件

Ubuntu 12.04で実行されているHaproxy 1.5.12の使用

Webサイトへのアクセスを、特定の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

しかし、これらをORと組み合わせた場合、許可されたIPからURLにアクセスできません(テストを反転しても役に立ちません)。

http-request deny if is_test ! is_allowed || is_test ! is_devtool

これを行う方法はありますか?

ありがとう

7
jeremyjr

あなたが課したいと思っているように見えるテストはこれです:

_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_、andと一致します
  • _is_allowed_、andと一致しません
  • _is_devtool_と一致しません

これらの条件のいずれかがfalse(テストではなく、許可されており、devtoolである)である限り、ルールは一致せず、要求を拒否しません。

13