Haproxy con terminación SSL para Varnish – Debian Stretch

Varnish no realiza las terminaciones SSL por lo que hay que usar un proxy intermedio para realizarlas. En este post mostraré una configuración para tener una terminación con Haproxy y Varnish.
Ambos utilizan el protocolo PROXY. Para que Varnish lo utilice, hay que configurar la opción -a :6083,PROXY. La ejecución del servicio Varnish puede quedar así:
ExecStart=/usr/sbin/varnishd -j unix,user=vcache -F -a :6081 -a :6083,PROXY -T localhost:6082 -f /etc/varnish/default.vcl -S /etc/varnish/secret -s malloc,4096m -l 100m,10m -t 60 -p feature=_++esi_disable_xml_check -p connect_timeout=5 -p first_byte_timeout=10 -p between_bytes_timeout=2
En el VLC añadir estas líneas:
sub vcl_recv { set req.http.x-clientip = client.ip; set req.http.x-serverip = server.ip; set req.http.x-localip = local.ip; set req.http.x-remoteip = remote.ip; ... }
Creamos un certificado autofirmado para la terminación:
# mkdir /etc/ssl/chop.io # openssl genrsa -out /etc/ssl/chop.io/chop.io.key 1024 # openssl req -new -key /etc/ssl/chop.io/chop.io.key \ -out /etc/ssl/chop.io/chop.io.csr # openssl x509 -req -days 365 -in /etc/ssl/chop.io/chop.io.csr \ -signkey /etc/ssl/chop.io/chop.io.key \ -out /etc/ssl/chop.io/chop.io.crt # cat /etc/ssl/chop.io/chop.io.crt /etc/ssl/chop.io/chop.io.key \ | tee /etc/ssl/chop.io/chop.io.pem
En el archivo de configuración de Haproxy hay que añadir al final algo como esto:
frontend http-in-proxy bind *:80 bind *:443 ssl crt /etc/ssl/chop.io/chop.io.pem redirect scheme https if !{ ssl_fc } default_backend servers-proxy backend servers-proxy server webapp1 192.168.122.20:6083 send-proxy-v2 server webapp2 192.168.122.20:6083 send-proxy-v2
Si ya configuramos el VCL de Varnish, con esto ya deberíamos tener hecha la terminación.