Como faço para corresponder um host curinga nas listas da ACL no HAproxy?

10

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 eu combino qualquer 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

Tom
fonte

Respostas:

15

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

As solicitações com a porta 80 geralmente retiram a porta 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á no verifique "exemplo.com".

O hdr_sub fará uma correspondência de substring, o que parece ser melhor para você (e para mim).

Qualquer uma das soluções ainda tem uma coisa desagradável que eu não gosto. Solicite uma avaliação dependente dos resultados.

por exemplo (minhas condições são assim 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 como porta 80 provavelmente poderia ser 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"
Rj Wilson
fonte
12

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

acl valid_domains hdr_end(host) -i mysite.com 
redirect location http://mysite.com/invalid_domain if !valid_domains
quanta
fonte
e se você tiver dois domínios. Um chamado mysite.com e outro chamado notmysite.com? Os dois terminam com mysite.com. Então a partida não é específica o suficiente, certo?
Saab
1
@Saab, nesse caso, eu escreveria acl valid_domains hdr(host) -i mysite.com+ acl valid_domains hdr_end(host) -i .mysite.com, ou apenas usariaacl valid_domains hdr_dom(host) -i mysite.com
howanghk
7

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

Correspondência final ( hdr_endou -m end) ou substring ( hdr_subou -m sub) pode ter efeitos colaterais não intencionais de correspondência mais do que o esperado. Em muitos casos, isso pode não ser realmente importante, pois você não possui tráfego para os domínios que chegam ao servidor, mas isso não significa que é a solução tecnicamente correta.

Usar uma expressão regular é a melhor maneira que encontrei para fazer correspondências explícitas. Por exemplo, se você deseja corresponder apenas *.example.orgsem correspondência 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 um pouco:

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

O acima irá corresponder :

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

e vai não corresponder :

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