¿Cómo hago coincidir un host comodín en las listas de ACL en HAproxy?

10

Tengo las siguientes líneas en mi 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

¿Cómo hago coincidir cualquier subdominio?

Lo intenté:

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

y:

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

... Pero tampoco funcionó.

Gracias

Tom
fuente

Respuestas:

15

Siento que hdr_sub es mejor para tus necesidades. Estuve usando hdr_end por un tiempo pero se encuentra con el siguiente problema:

las solicitudes con el puerto 80 generalmente eliminan el puerto para que el encabezado del host se vea como "example.com", pero si estaba solicitando explícitamente un puerto, como example.com:8080, el encabezado tendrá el puerto y hdr_end fallará busque "example.com".

hdr_sub hará una coincidencia de subcadena, lo que parece mejor para usted (y para mí).

Cualquiera de las soluciones todavía tiene algo desagradable que no me gusta. Evaluación dependiente del orden de los resultados.

por ejemplo (mis condiciones se ven así en la interfaz)

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

Solicitar en el puerto 8080 sería así:

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"

donde el puerto 80 probablemente podría ser así

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
fuente
12

hdr_endes lo que estás buscando Prueba esto:

acl valid_domains hdr_end(host) -i mysite.com 
redirect location http://mysite.com/invalid_domain if !valid_domains
quanta
fuente
¿Qué pasa si tienes dos dominios? ¿Uno llamado mysite.com y otro llamado notmysite.com? Los dos terminan con mysite.com. Entonces el partido no es lo suficientemente específico, ¿verdad?
Saab
1
@Saab en ese caso escribiría acl valid_domains hdr(host) -i mysite.com+ acl valid_domains hdr_end(host) -i .mysite.com, o simplemente usaríaacl valid_domains hdr_dom(host) -i mysite.com
howanghk
7

Hay casos en los que necesita ser explícito al respecto, como el manejo de redireccionamientos para SSL comodín con múltiples niveles de subdominios.

La coincidencia final ( hdr_endo -m end) o subcadena ( hdr_subo -m sub) puede tener efectos secundarios no deseados de la coincidencia más de lo esperado. En muchos casos, esto puede no importar realmente, ya que no tiene tráfico para esos dominios que llegan al servidor, pero eso no significa que sea la solución técnicamente correcta.

Usar una expresión regular es la mejor manera que he encontrado para hacer una coincidencia explícita. Por ejemplo, si solo desea hacer coincidir *.example.orgsin hacer coincidir sub.domain.example.org:

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

Si también desea manejar (cualquier) puerto no estándar, esto puede extenderse ligeramente:

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

Lo anterior coincidirá :

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

y se no coincidir :

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