apache über reverse-proxy: Client IP anzeigen

Hat man vor einem apache Web-Server einen reverse-proxy (z.B. nginx) am laufen, sieht man statt der „echten“ IP des Besuchers, lediglich die IP des reverse-proxies.
Damit man im apache die tatsächliche IP des Bescuhers sieht kann man mittels mod_remoteip den Header vom reverse-proxy auslesen.

Dazu aktiviert man im apache zuerst das Modul: mod_remoteip.

Danach fügt man in die Konfiguration des VirtualHosts folgendes ein:

  RemoteIPHeader X-Forwarded-For
  RemoteIPInternalProxy 127.0.0.1
  SetEnvIf X-Forwarded-Proto "^https$" HTTPS=on
 
  LogFormat "%a %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" proxy
  CustomLog /var/log/apache/example.org-access_log proxy
  • Der Parameter RemoteIPHeader sagt dem apache er soll im Header die IP-Adresse, welcher der reverse-proxy unter: X-Forwarded-For gesetzt hat als Client IP nehmen.
  • Mittels: RemoteIPInternalProxy wird em apache gesagt, dass dieser nur dem RemoteIPHeader Header von der angegeben IP-Adresse vertraut; diese muss also die IP addresse des reverse-proxies sein. – Dies ist sehr wichtig, da sich die IP im Header ansonsten einfach fälschen (spoofen) lässt!
  • SetEnvIf X-Forwarded-Proto ist optional und sagt dem apache, dass SSL (HTTPS) schon beim reverse-proxy gemacht wird, da die Verbindung zwischen reverse-proxy und web-server in der Regel ohne SSL (HTTP) ist (nützlich bei Applikationen, welche z.B. eine automatische HTTPS Weiterleitung machen).
  • Damit die echte IP auch in den apache logfiles sichtbar ist, muss noch das log-format mittels mod_log_config (bereits Standardmässig aktiv) um-konfiguriert werden: Der erste Parameter (normalerweise %h) muss %a sein.

Published by

Steven Varco

Steven ist ein Redhat RHCE-Zertifizierter Linux-Crack und ist seit über 15 Jahren sowohl beruflich wie auch privat auf Linux spezialisiert. In seinem Keller steht ein Server Rack mit diversen ESX und Linux Servern.

Schreibe einen Kommentar

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