X-Forwarded-For mit .htaccess

Die IP-Adresse hinter einem Proxy

Befindet sich der Apache Web Server hinter einem Loadbalancer oder einem Proxy-Server wie Squid oder Varnish, wird die eigentliche IP des Clients durch die IP des Loadbalancers oder Proxy-Servers überschrieben. Das Resultat ist ein Apache-Logfile, in dem immer nur die IP des Loadbalancers/Proxy steht und nicht die des eigentliche Aufrufers. Ebenso ist es nicht möglich, via .htaccess bestimmte IP-Adressen zu sperren oder zuzulassen.Um dieses Problem zu lösen, wurde vom Squid Entwicklungsteam ein spezieller Header entwickelt, der zum Standard wurde und z.B. von Apache oder Tomcat ausgelesen werden kann. Systeme, die diesen X-Forwarded-For Header unterstützen, können nun die IP-Adresse des Kunden auslesen und diese in dem Header an den Webserver mitschicken.

Apache-Log

Auch wenn der Loadbalancer/Proxyserver nun die IP des Clients zum Webserver weitergibt, so kann der Apache erst einmal nichts damit anfangen. Er muss diese Variable auslesen.Eine typische Apache Webserver-Konfiguration für das Logging der Zugriffe :

Wobei:%h: Remote Host (IP-Adresse oder Hostname)%l: Remote logname (Normalerweise ein „-„, kann auch der rfc1413 Remote Benutzernamen sein)%u: Remote User (Normalerweise ein „-“ bzw. der Username, der für eine Authentifizierung genutzt wurde)%t: Timestamp (Zeitstempel des Zugriffs)%r: Request-URI%s: Status code%b: Größe abzüglich des Response-Headers%{Referer}: Referrer%{User-agent}: user-agent (Browser, Robot, Spider, etc)Diese Zeile würde dann im Apache-Log stehen:10.10.10.10 – peter [10/Oct/2000:13:55:36 -0700] „GET /images/apache_pb.gif HTTP/1.0“ 200 2326 „http://www.example.com/start.html““Mozilla/4.08 [en] (Win98; I ;Nav)“Die IP 10.10.10.10 wäre die angenommene IP des Loadbalancers oder Proxies. Um nun die IP des Kunden auszulesen, müssen einige Erweiterungen vorgenommen werden:

Nun steht die IP des Kunden (11.22.33.44) im Apache Log:11.22.33.44 – peter [10/Oct/2000:13:55:36 -0700] „GET /images/apache_pb.gif HTTP/1.0“ 200 2326 „http://www.example.com/start.html“ „Mozilla/4.08 [en] (Win98; I ;Nav)“Zeile 1 definiert das Standard-Logformat. In Zeile 2 wird %h (remote host) durch die Werte des X-Forwarded-For Headers ersetzt und dem Ausdruck „proxy“ zugewiesen. Zeile 3 prüft, ob eine IP-Adresse in dem X-Forwarded-For Header enthalten ist und weist diese IP(s) dem Ausdruck „forwarded“ zu. In den Zeilen 4 und 5 wird nun entschieden, welche Definition der Apache nutzen soll: Existiert kein gültiger X-Forwarded-For Header (env=!forwarded), dann nutze die „combined“-Definition aus Zeile 1. Konnte eine (oder mehrere) X-Forwarded-For IPs ermittelt werden, dann nutze die „proxy“-Definition aus Zeile 2.

.htaccess

Wie auch beim Apache Log kennt der Webserver erst einmal nur die IP des Kunden, die ihm über den Standard-Header übergeben wurde.Um eine Webseite gegen unbefugte Zugriffe zu schützen, funktioniert über .htaccess i.d.R. so:

Es werden erst einmal alle Zugriffe verboten (Zeile 2) und nur bestimmte IPs, die in Zeile 3 und 4 definiert wurden, erlaubt. Wichtig ist die Reihenfolge der Ausdrücke „deny“ und „allow“ in Zeile 1.Möchte man alle IP-Adressen zulassen außer ein paar bestimmte, dann muss die Definition so aussehen:

In Zeile 1 wurde „allow“ und „deny“ vertauscht, denn man möchte erst mal alle zulassen, was auch noch mal explizit in Zeile 2 steht. Sollen komplette IP-Ranges ausgesperrt werden, dann den Wert wie in Zeile 4 angeben.Leider würden die o.g. .htaccess-Abfragen hinter einem Loadbalancer oder Proxyserver nicht greifen, da immer nur die IP des Loadbalancer/Proxies erkannt wird. Es muss also die .htaccess erweitert werden:

Jetzt funktioniert die .htaccess-Abfrage wie gewünscht und die Kunden IP wird erkannt. Die Zeilen 1 und 2 definieren die entsprechenden IP-Adressen, die entweder zugelassen oder gesperrt werden sollen in einer Variable „AllowIP“, die in Zeile 5 zum Einsatz kommt.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.