Uso de ACL en HAproxy – Redireccionar según el contenido de un parámetro GET
- octubre 26, 2018
- Categoría: clúster linux virtualización
Importante: Esta información es para uso lúdico personal. En ningún caso se pretende dar conocimientos, consejos, formaciones, herramientas, ni soluciones técnicas de ámbito comercial ni profesional. Simplemente es información que se ha redactado en finalidad de recordatorio de ciertos proyectos realizados. Si usted no está seguro de la fiabilidad de la información, no cumple con sus expectativas o no es de su agrado, le ruego que abandone este sitio web. Para ver todas las exclusiones garantía y de responsabilidad acceda a la sección Aviso Legal.
El uso de ACL en haproxy es una de las funcionalidades más importantes de esta herramienta. Permite redirigir tráfico a distintos servidores o puertos según las características de las peticiones. Se puede filtrar por dominio, url, host, parámetros, ip de origen, …
En este ejemplo, se recibe un XML en la variable ‘xml’. Si el XML contiene el string XXX o YYY lo enviaremos a un puerto con un rendimiento inferior. Si no contiene estos strings, la petición se mandará a los puertos por defecto.
Se ha usado puertos en vez de distintos servidores, para hacer la prueba rápidamente en desarrollo.
La ACL quedaría de esta forma
acl server_lower url_param(xml) -m reg (XXX|YYY) use_backend XML_server_lower if server_lower default_backend XML_server
Si se quiere se puede definir la ACL en una sola línea (inline)
use_backend XML_server_lower if { url_param(xml) -m reg (XXX|YYY) }
El archivo de configuración completo
global chroot /var/lib/haproxy stats socket /run/haproxy/admin.sock mode 660 level admin stats timeout 30s user haproxy group haproxy daemon # Default SSL material locations ca-base /etc/ssl/certs crt-base /etc/ssl/private ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS ssl-default-bind-options no-sslv3 defaults mode http timeout connect 5000 timeout client 50000 timeout server 50000 errorfile 400 /etc/haproxy/errors/400.http errorfile 403 /etc/haproxy/errors/403.http errorfile 408 /etc/haproxy/errors/408.http errorfile 500 /etc/haproxy/errors/500.http errorfile 502 /etc/haproxy/errors/502.http errorfile 503 /etc/haproxy/errors/503.http errorfile 504 /etc/haproxy/errors/504.http frontend XML bind *:8080 mode http #acl server_lower url_param(xml) -m sub XXX # Solo un valor acl server_lower url_param(xml) -m reg (XXX|YYY) use_backend XML_server_lower if server_lower default_backend XML_server backend XML_server mode http #balance roundrobin balance leastconn option tcp-check server web01 192.168.0.160:80 check server web02 192.168.0.160:81 check backend XML_server_lower mode http #balance roundrobin balance leastconn option tcp-check server web03 192.168.0.160:82 check listen stats 192.168.0.160:8100 stats enable stats uri /haproxy?stats stats realm Strictly\ Private stats auth admin:mikimiki
Comprobación, se envía un XML con el valor XXX
Otra funcionalidad muy útil, es permitir o restringir el acceso por IP source. Con esta instrucción crearemos una WhiteList con las IP que tendrán acceso a nuestro cluster. El resto de IP se les denegará el servicio.
#firewall http-request deny if !{ src -f /etc/haproxy/whitelist.acl }
Para más documentación y configuraciones, se recomiendan estas guías:
https://www.haproxy.com/blog/introduction-to-haproxy-acls/
https://www.haproxy.org/download/1.4/doc/configuration.txt