Webserver

Haproxy con terminación SSL para Varnish – Debian Stretch

carriles lento y rápido

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.

Hi, I’m Gustavo Moreno