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.

IPSet zum sperren größerer Mengen IPs verwenden

Hier hab ich ja schon geschrieben wie IPSet zu installieren ist, nun hier die Nutzung, falls ihr mal eine größere Anzahl an IPs zu sperren habt.

Als erstes legt ihr eine neue neuen Liste im IPSet an. Wir wollen einzelne IPs eintragen, also ist der Typ der Liste „iphash“

ipset --create blocked_hosts iphash

Damit habt ihr nun schon eine Liste, in die ihr die IPs eintragen könnt.

ipset --add blocked_hosts 17.172.224.47

Testen ob die IP in der Liste gefunden wird funktioniert mit –test:

ipset --test blocked_hosts 17.172.224.47
17.172.224.47 is in set blocked_hosts.

Nun muss das IPSet nur noch in die IPTables eingetragen werden und schon sind die IPs gesperrt.

iptables -I INPUT -m set --match-set blocked_hosts src -j DROP

IPSet läuft dabei viel performanter als die IPs einzeln direkt in den IPTables zu blocken. –add und –del funktionieren „on the fly“, greifen also ohne reloads oder ähnlichem direkt.

IPSet installieren auf Debian 6 Stable/Squeeze

Falls ihr mal viele IPs auf einem Server blocken müsst, dann empfiehlt es sich aus Performancegründen nicht jede IP bzw jedes Netz einzeln per IPTables zu sperren, sondern dafür IPSet zu nehmen.

IPSet ist eine Erweiterung für IPTables, die große Mengen an IPs verwalten kann.

Die Installation von IPSet auf einem Debian machte bei uns anfangs Probleme, ein einfaches

apt-get install ipset

reicht leider nicht aus. Dabei wird zwar IPSet installiert, aber beim verwenden bekommt man folgende Fehlermeldung:

FATAL: Module ip_set not found.

Lösung brachte dann ein paar Minuten googeln, man muss nämlich die Sourcen mit installieren und das Kernelmodul erstellen lassen. Das geht einfach mit

apt-get install ipset ipset-source
m-a a-i ipset

und schon ist IPSet installiert und kann verwendet werden.

Zur Verwendung davon wird es noch einen extra Post geben.