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.