Configuración de haproxy con configuración de subdominio

8

¿Esperando que alguien pueda ayudar a confirmar si se supone que esto funciona? Estoy tratando de enrutar el tráfico del subdominio 3 al mismo host haproxy;

He aquí mi arreglo

haproxy con una interfaz ip 10.10.10.100 y nombre dns haproxy01.mydomain.com

3 registros CNAME asociados a él; sub1.mydomain.com, sub2.mydomain.com y sub3.mydomain.com

todo el tráfico entrante es para el puerto 443.

Hay dos servidores de aplicaciones de fondo que aceptan tráfico en tres puertos 8081, 8082, 8083, digamos;

sub1.mydomain.com para 8081 sub2.mydomain.com para 8082 y sub3.mydomain.com para 8083

La aplicación requiere el paso de SSL solo para el tráfico del puerto 8081, así que creo que tengo que usar el modo tcp para ello, el otro tráfico para 8082 y 8083 también es SSL, pero se puede terminar en el Haproxy, pero para las pruebas fui con todos los TCP modo.

Mi sección de configuración para lograr esto está abajo;

    #Application Setup 
frontend mytraffic
    bind *:443
    mode  tcp
    acl host_sub1 hdr(host) -i sub1.mydomain.com
    acl host_sub2 hdr(host) -i sub2.mydomain.com
    acl host_sub3 hdr(host) -i sub3.mydomain.com

    use_backend sub1_nodes if host_sub1
    use_backend sub2_nodes if host_sub2
    use_backend sub3_nodes if host_sub3

    option tcplog backend sub1_nodes
    mode tcp
    balance roundrobin
    stick-table type ip size 200k expire 30m
    stick on src
    server node1 10.10.10.101:8081 check
    server node2 10.10.10.102:8081 check 
backend sub2_nodes
    mode tcp
    balance roundrobin
    stick-table type ip size 200k expire 30m
    stick on src
    server node1 10.10.10.101:8082 check
    server node2 10.10.10.102:8082 check 
backend sub3_nodes
    mode tcp
    balance roundrobin
    stick-table type ip size 200k expire 30m
    stick on src
    server node1 10.10.10.101:8083 check
    server node2 10.10.10.102:8083 check


    # APPLICATION SETUP END

Cuando intento acceder a los servidores de aplicaciones a través de HAproxy, por ejemplo, para el tráfico 8082, arroja estos son los registros;

localhost haproxy [6097]: xxxx: 51241 [20 / Mar / 2015: 12: 19: 38.720] mytraffic mytraffic / -1 / -1 / 0 0 SC 0/0/0/0/0 0/0

Aprecio algunas indicaciones con respecto a esta configuración.

PD: No puedo insertar ninguna imagen para mayor claridad aquí, ya que es mi primera publicación :-(

Aprendizaje global
fuente
el mensaje de registro no estaba completo; 20 de marzo 12:19:38 localhost haproxy [6097]: xxxx: 51241 [20 / Mar / 2015: 12: 19: 38.720] mytraffic mytraffic / <NOSRV> -1 / -1 / 0 0 SC 0/0/0 / 0/0 0/0
Aprendizaje global
NOSRV significa que no pudo encontrar un backend adecuado. ¿Puedes acceder a la página de estadísticas o al socket y ver qué backends piensa HAproxy?
Jim G.
Compruebe también si hay conectividad entre haproxy y los servidores de aplicaciones. Si usa nc: nc -v 10.10.10.101 8081, nc -v 10.10.10.102 8081, etc.
hdanniel
La última comprobación en el panel de monitoreo de haproxy es informar todos los nodos. También he confirmado la conectividad de la consola Haproxy a estos servidores de aplicaciones en todos los puertos.
Aprendizaje global
@HD sí, la conectividad está bien en ambos nodos.
Aprendizaje global

Respuestas:

11

Con el modo TCP, HAProxy no decodificará la solicitud HTTP, por lo que sus acllíneas no harán nada y la interfaz nunca podrá coincidir con un back-end, como se muestra en los registros que ingresó: mytraffic/<NOSRV>significa que no pudo elegir un backend o servidor.

Tendría que dividir los 3 subdominios en 2 frontends diferentes, cada uno con sus propias IP, ya que todos se conectan en el puerto 443. Uno para el paso a través, el otro para la terminación SSL y el cambio de contenido utilizando mode http. La advertencia aquí es que si tuviera que agregar un cuarto subdominio (sub4.mydomain.com) que también requiriera paso a través, entonces necesitaría un tercer frontend e IP.

También necesitaría crear diferentes registros CNAME o A en DNS para que los subdominios correctos apunten a las IP correctas.

Dada esta configuración de DNS:

10.10.10.100        A         haproxy01-cs.mydomain.com
10.10.10.101        A         haproxy01-pt1.mydomain.com
10.10.10.102        A         haproxy01-pt2.mydomain.com
sub1.mydomain.com   CNAME     haproxy01-pt1.mydomain.com
sub2.mydomain.com   CNAME     haproxy01-cs.mydomain.com
sub3.mydomain.com   CNAME     haproxy01-cs.mydomain.com
sub4.mydomain.com   CNAME     haproxy01-pt2.mydomain.com

La configuración HAproxy se vería así:

#Application Setup 
frontend ContentSwitching

  bind 10.10.10.100:443
  mode  http
  option httplog
  acl host_sub2 hdr(host) -i sub2.mydomain.com
  acl host_sub3 hdr(host) -i sub3.mydomain.com
  use_backend sub2_nodes if host_sub2
  use_backend sub3_nodes if host_sub3

frontend PassThrough1
  bind 10.10.10.101:443
  mode  tcp
  option tcplog
  use_backend sub1_nodes     

frontend PassThrough2
  bind 10.10.10.102:443
  mode  tcp
  option tcplog
  use_backend sub4_nodes

backend sub1_nodes
  mode tcp
  balance roundrobin
  stick-table type ip size 200k expire 30m
  stick on src
  server node1 10.10.10.101:8081 check
  server node2 10.10.10.102:8081 check 

backend sub2_nodes
  mode http
  balance roundrobin
  stick-table type ip size 200k expire 30m
  stick on src
  server node1 10.10.10.101:8082 check
  server node2 10.10.10.102:8082 check 

backend sub3_nodes
  mode http
  balance roundrobin
  stick-table type ip size 200k expire 30m
  stick on src
  server node1 10.10.10.101:8083 check
  server node2 10.10.10.102:8083 check

backend sub4_nodes
  mode tcp
  balance roundrobin
  stick-table type ip size 200k expire 30m
  stick on src
  server node1 10.10.10.101:8084 check
  server node2 10.10.10.102:8084 check
GregL
fuente
En realidad, las IP que tengo aquí no tienen ningún sentido (utilicé 10.10.10.101-102 para los front-end donde los tienes asignados a los nodos), pero tienes la idea de cómo se vería.
GregL
@GreL - GRACIAS. Voy a intentar esto y en un círculo con resultados. Estaba preocupado por el modo tcp y el uso de acl antes de usarlo.
Global Learning
Gracias GregL funciona. ¿Una última pregunta si puedo? tener SSL del cliente -> haproxy y haproxy -> servidor de back-end (como puede terminar pero iniciar uno nuevo en el back-end), ¿cuál es la forma recomendada de hacerlo? ssl pasa a través del modo tcp? La razón por la que quería el paso para el tráfico del puerto 8081 es por el requisito de tener una sesión mutuamente autenticada con la aplicación y el cliente. El resto del tráfico de los puertos 8082 y 8083 requiere SSL pero no requiere autenticación mutua. (En este momento fui con el enfoque de paso).
Aprendizaje global
Bueno, HAProxy puede verificar el certificado del cliente utilizando las opciones ca-filey verify optionalde la binddeclaración. Si hiciera eso, podría tener un único frontend vinculado a una IP y luego cambiar de contenido a los backends apropiados según lo requiera el encabezado del host . Para confirmar que la autenticación mutua funcionó, puede crear un acl como acl ClientSSLValid ssl_c_verify 0, luego agregarlo como otra condición a la use_backenddeclaración comouse_backend sub1_nodes if host_sub1 ClientSSLValid
GregL
Hay informes decentes aquí y aquí sobre cómo hacer esto, con más detalles de los que he proporcionado.
GregL