如何在 HAproxy 中的 ACL 列表中匹配通配符主机?

如何在 HAproxy 中的 ACL 列表中匹配通配符主机?

我的 haproxy.conf 中有以下几行:

acl valid_domains hdr(Host) -i mysite.com images.mysite.com docs.mysite.com admin.mysite.com
redirect location http://mysite.com/invalid_domain if !valid_domains

我如何匹配任意子域名?

我试过:

acl valid_domains hdr(Host) -i *.mysite.com

和:

acl valid_domains hdr(Host) -i [a-z]+.mysite.com

...但都没有用。

谢谢

答案1

我觉得hdr_sub更适合您的需求。我使用 hdr_end 有一段时间了,但它遇到了以下问题:

端口 80 的请求通常会剥离端口,因此主机标头看起来像“example.com”,但如果您明确在端口上请求,如 example.com:8080,则标头将包含端口,并且 hdr_end 将无法通过“example.com”的检查。

hdr_sub 将进行子字符串匹配,这似乎更适合您(和我)。

这两种解决方案都存在我不喜欢的缺点。结果的评估依赖于顺序。

例如(我的条件在前端看起来像这样)

acl is_dbadmin hdr_sub(host) -i dbadmin.example.com

在端口 8080 上请求如下:

Jul  9 02:48:40 localhost haproxy[8]: 192.168.1.1:55870 [09/Jul/2015:02:48:40.865] http-in example/s1 1/0/0/20/110 200 330722 - - ---- 0/0/0/0/0 0/0 {**example.com:8080**||http://example.com:} {Apache/2.4.10 (Debia||||} "GET /wp-includes/js/zxcvbn.min.js HTTP/1.1"

端口 80 可能是这样的

Jul  9 02:48:40 localhost haproxy[8]: 192.168.1.1:55870 [09/Jul/2015:02:48:40.865] http-in example/s1 1/0/0/20/110 200 330722 - - ---- 0/0/0/0/0 0/0 {example.com||***http://example.com***:} {Apache/2.4.10 (Debia||||} "GET /wp-includes/js/zxcvbn.min.js HTTP/1.1"

答案2

在某些情况下您需要明确这一点,例如处理具有多层子域的通配符 SSL 的重定向。

匹配结尾(hdr_end-m end)或子字符串(hdr_sub-m sub)可能会产生意想不到的副作用,即匹配次数超出您的预期。在许多情况下,这可能并不重要,因为您没有来自这些域的流量进入服务器,但这并不意味着这是技术上正确的解决方案。

我发现使用正则表达式是进行显式匹配的最佳方法。例如,如果您只想匹配*.example.org而不匹配sub.domain.example.org

acl valid_domains hdr(host) -m reg -i ^[^\.]+\.example\.org$

如果您还想处理(任何)非标准端口,可以稍微扩展一下:

acl valid_domains hdr(host) -m reg -i ^[^\.]+\.example\.org(:[0-9]+)?$

以上将匹配

  • test1.example.org
  • test2.example.org:8080

将要不是匹配

  • example.org
  • two.subs.example.org
  • myexample.org
  • test.myexample.org
  • test.example.org.other.com

答案3

hdr_end就是你要找的。试试这个:

acl valid_domains hdr_end(host) -i mysite.com 
redirect location http://mysite.com/invalid_domain if !valid_domains

答案4

我提供另一个解决方案

acl valid_domains hdr_dom(host) -i mysite.com
acl valid_domains hdr_dom(host) -i -m end .mysite.com

一个 acl 中的规则通过或组合而成。第一个仅接受顶级域,第二个将接受子域。由于hdr_dom

我知道这是一个老问题,但我还是来这里看看。参见文档了解详细信息。

相关内容