HAProxy 1.5 mit SSL

Bisher lief bei uns nginx als SSL-Offloader. Dieser war hinter dem Loadbalancer mit HAProxy, und bekam von diesem die Client-IP per IP-Spoofing mitgeteilt.

Das haben wir nun ersetzt, jetzt läuft auch auf dem SSL-Offloadern HAProxy. Die Client-IP gibts nun mit HAProxys Proxy Protokoll übergeben, womit wir uns sparen dass die Loadbalancer Gateway für die SSL-Offloader spielen müssen. Details dazu gibts in einem zukünftigem Post.

SSL-Offloading geht im HAProxy erst ab der Version 1.5, diese ist aktuell noch eine dev-Version, heißt wir müssen uns diese selbst Kompilieren. Da wir dort ein aktuelles OpenSSL haben wollen, ist der erste Schritt, wenn nicht bereits getan, das Upgrade zu Wheezy.

Dann brauchen wir noch die aktuellen Versionen von den Abhänigkeiten:

$ apt-get install openssl libssl-dev libpcre3-dev

Dann laden wir uns die aktuelle Version von HAProxy runter und Kompilieren diese:

$ cd /usr/src
$ wget -4 http://haproxy.1wt.eu/download/1.5/src/devel/haproxy-1.5-dev21.tar.gz
$ tar xvfz ./haproxy-1.5-dev21.tar.gz
$ cd haproxy-1.5-dev21
$ make TARGET=linux26 USE_GETADDRINFO=1 USE_PCRE=1 USE_PCRE_JIT=1 USE_LIBCRYPT=1 USE_OPENSSL=1 USE_ZLIB=1 prefix=/usr/sbin
$ make install

Anschließend ist der HAProxy bereit für euren SSL-Traffic. Beispielconfig:

global
        log 10.2.0.9 local0 err
        maxconn 16000
        user root
        group root
        daemon
        stats socket    /tmp/haproxy_ssl.sock level admin
	tune.ssl.cachesize 40000
	nbproc 5

defaults
        log     global
        mode    http
        option  httplog
        option  dontlognull
        retries 3
        option redispatch
        option http-server-close
        option forceclose
        contimeout      5000
        clitimeout      50000
        srvtimeout      50000
        timeout queue   15s

frontend ssl_in
	mode http
	bind 0.0.0.0:443 ssl crt /etc/haproxy/ssl.pem
	option forwardfor header X-Real-IP
	http-request set-header X-Forwarded-Proto https
	http-request set-header SSL_HTTPS on
	http-request set-header SCHEME https

	default_backend haproxy_local

backend haproxy_local
	mode http
	server local 127.0.0.1:80

Wichtig dabei: nbproc 5 sorgt dabei für 5 Prozesse, das SSL-Offloading läuft also über mehrere Kerne. Dabei sind aber die Statistiken unbrauchbar, da diese immer die die Stats für einen Prozess von den 5 anzeigen. Aus diesem Grunde läuft bei uns lokal noch einmal ein HAProxy Prozess mit nbproc 1, der den nun Plaintext-HTTP-Traffic auf die Webserver verteilt.