Como faço para combinar um host curinga nas listas de ACL no HAproxy?

6

Eu tenho as seguintes linhas no meu 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

Como faço para combinar algum subdomínio?

Eu tentei:

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

e:

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

... Mas nem funcionou.

Obrigado

    
por Tom 14.05.2012 / 18:06

3 respostas

10

Eu sinto que hdr_sub é melhor para as suas necessidades. Eu estava usando o hdr_end por um tempo, mas ele se depara com o seguinte problema:

solicitações com porta 80 geralmente obtêm a porta removida para que o cabeçalho do host se pareça com "example.com", mas se você estivesse solicitando uma porta explicitamente, como example.com:8080, o cabeçalho terá a porta e hdr_end falhará na verificação de "example.com".

O hdr_sub faz uma correspondência de substring, que parece ser mais adequada para você (e para mim).

Qualquer solução ainda tem uma coisa desagradável que eu não gosto. Avaliação dependente da ordem dos resultados.

, por exemplo, (minhas condições se parecem com isso no frontend)

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

Solicitar na porta 8080 seria assim:

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"

onde a porta 80 provavelmente seria assim

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"
    
por 09.07.2015 / 04:52
8

hdr_end é o que você está procurando. Tente isto:

acl valid_domains hdr_end(host) -i mysite.com 
redirect location http://mysite.com/invalid_domain if !valid_domains
    
por 12.08.2012 / 10:02
1

Há casos em que você precisa ser explícito sobre isso, como o tratamento de redirecionamentos para SSL curinga com vários níveis de subdomínios.

O final correspondente ( hdr_end ou -m end ) ou a subseqüência ( hdr_sub ou -m sub ) podem ter efeitos colaterais não intencionais de correspondência mais do que o esperado. Em muitos casos, isso pode não importar, já que você não tem tráfego para esses domínios que chegam ao servidor, mas isso não significa que seja a solução tecnicamente correta.

Usar uma expressão regular é a melhor maneira que encontrei para fazer correspondência explícita. Por exemplo, se você deseja corresponder apenas a *.example.org sem corresponder a sub.domain.example.org :

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

Se você também deseja manipular (qualquer) portas não padrão, isso pode ser estendido levemente:

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

O acima corresponderá a :

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

e não correspondem :

  • example.org
  • two.subs.example.org
  • myexample.org
  • test.myexample.org
  • test.example.org.other.com
por 25.04.2018 / 23:37