Tengo la siguiente configuración:
(internet) ---> [ pfSense Box ] /-> [ Apache / PHP server ]
[running HAproxy] --+--> [ Apache / PHP server ]
+--> [ Apache / PHP server ]
\-> [ Apache / PHP server ]
Para las solicitudes HTTP, esto funciona muy bien , las solicitudes se distribuyen a mis servidores Apache muy bien. Para las solicitudes SSL, tuve HAproxy distribuyendo las solicitudes usando el equilibrio de carga TCP, y funcionó sin embargo, ya que HAproxy no actuó como un proxy, no agregó el X-Forwarded-For
encabezado HTTP, y los servidores Apache / PHP no conocían el cliente dirección IP real
Entonces, agregué stunnel
frente a HAproxy, leyendo que stunnel podría agregar el X-Forwarded-For
encabezado HTTP. Sin embargo, el paquete que pude instalar en pfSense no agrega este encabezado ... además, esto aparentemente mata mi capacidad de usar las solicitudes KeepAlive , que realmente me gustaría conservar. Pero el mayor problema que mató esa idea fue que el aturdimiento convirtió las solicitudes HTTPS en solicitudes HTTP simples, por lo que PHP no sabía que SSL estaba habilitado e intentó redirigir al sitio SSL.
¿Cómo puedo usar HAproxy para equilibrar la carga en varios servidores SSL, permitiendo que esos servidores conozcan la dirección IP del cliente y sepan que SSL está en uso? Y si es posible, ¿cómo puedo hacerlo en mi servidor pfSense?
¿O debería dejar todo esto y simplemente usar nginx?
X-Forwarded-For
, mira aquí .Respuestas:
No necesita soltarlo todo, simplemente puede usar nginx frente a haproxy para soporte SSL, manteniendo toda su configuración de equilibrio de carga. Ni siquiera necesita usar nginx para HTTP si no lo desea. Nginx puede pasar tanto X-Fordered-For como un encabezado personalizado que indica que SSL está en uso (y la información del certificado del cliente si lo desea). Fragmento de configuración de Nginx que envía la información requerida:
fuente
Solo para el registro, ya que a menudo se hace referencia a este hilo con respecto a HAProxy + SSL, HAProxy admite SSL nativo en ambos lados desde 1.5-dev12. Entonces, tener X-Fordered-For, HTTP keep-alive y un encabezado que le dice al servidor que la conexión se realizó a través de SSL es tan simple como lo siguiente:
Estoy seguro de que para cuando se te ocurra algo diferente, pero al menos los nuevos visitantes obtendrán la solución fácil ahora :-)
fuente
acl is-ssl dst_port 443
y reescribir una línea:reqadd X-Forwarded-Proto:\ https if is-ssl
Nginx parece manejar este encabezado bastante bienPara cualquiera que encuentre esta pregunta, seguí el consejo de Ochoto y usé nginx. Estos son los pasos específicos que utilicé para que esto funcione en mi enrutador pfSense :
Utilizando la interfaz web de pfsense, instalé el paquete pfsense PfJailctl y el paquete "jail_template" en Sistema> Paquetes para poder crear una cárcel de FreeBSD para compilar e instalar nginx en el sistema pfsense.
Configuré una cárcel para mi servidor nginx en Servicios> Cárceles , dándole a la nueva cárcel el mismo nombre de host y dirección IP del alias de IP virtual en el que tenía ejecutado HAproxy. Até la cárcel a la interfaz WAN. Usé la plantilla de cárcel predeterminada y habilité unionfs en lugar de nullfs.
Una vez que se inició la cárcel, ingresé a la caja de pfsense y corrí
jls
a buscar el número de la cárcel. Luego corríjexec 1 sh
a buscar un proyectil dentro de la cárcel. Desde allí configuré puertos BSD e instalé nginx usando:Luego configuré nginx para escuchar en el puerto 443 y pasar todas las solicitudes a HAproxy en el puerto 80, incluida la IP real y el estado SSL dentro de los encabezados HTTP. Mi se
usr/local/etc/nginx/nginx.conf
parece a:Luego modifiqué mi aplicación PHP para detectar el
X-Forwarded-Proto
encabezado HTTP:Entonces la configuración final es:
fuente
Mi configuración para una versión 1.5-dev-17 de haproxy:
Utiliza la
ssl_fc
ACL. Tenga en cuenta que laoption http-server-close
parte es muy importante.fuente
HAProxy no puede alcanzar un backend SSL sin usar el modo TCP sin procesar y perder
X-Forwarded-For
, pero podría volver a cifrar el tráfico con un stunnel de escucha para el tránsito del backend. Feo, sin embargo.Me gusta más el enfoque de Ochoto, con una advertencia: nginx es un equilibrador de carga perfectamente capaz; si lo está usando, yo diría que lo use para todo. Proxy sus HTTPS entrantes para cargar backends HTTPS equilibrados, y de esa manera, no hay necesidad de encabezados personalizados para la información SSL (a menos que necesite el certificado del cliente).
fuente
El año pasado implementé una solución para integrar HAProxy con pfSense de manera que aproveche todas las características de HAProxy y mantenga un buen aislamiento con pfSense. Para que sea una opción viable para entornos de producción . SSL termina en HAProxy . Instalé HAProxy dentro de una cárcel en pfSense usando ezjail y Ports Collection . De esa manera es muy fácil mantener ambos componentes de forma independiente. Y puede instalar la versión que desee. Empecé con 1.5-dev13. Y desde entonces está funcionando perfectamente para mí. He documentado todo el asunto aquí.
Instalar HAProxy en pfSense
Por cierto, Willy, muchas gracias por un producto tan excelente.
fuente