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 18 Jahren sowohl beruflich wie auch privat auf Linux spezialisiert. In seinem Keller steht ein Server Rack mit diversen ESX und Linux Servern.

6 thoughts on “apache über reverse-proxy: Client IP anzeigen”

  1. Guten Tag Steven

    Vielen Dank für diesen Beitrag. Darf ich Dich etwas fragen?

    Und zwar ist es so, dass ich ein Raspberry Pi im Einsatz habe.
    Mit ProxyPass und ProxyPassReverse greife ich dann auf das NAS mit einer entsprechenden URL zu. Nun ist es so, dass wenn sich jemand mehrmals falsch über die entsprechende URL beim NAS falsch anmeldet, wird nicht die Client IP geblockt, sondern die vom Raspberry.

    Muss ich da noch etwas mehr machen, als das was im Beitrag erwähnt ist?

    Vielen Dank für Deine Hilfe im Voraus.
    Sascha

    1. Du hast hier das selbe Problem wie in diesem Beitrag, nur, halt auf dem NAS (web-server) und NICHT auf dem apache wo du die ProxyPass/ProxyPassReverse machst.

      In diesem Beitrag ist der apache der „Backend-Server“ (das wäre bei dir das NAS) und nginx der ReverseProxy.

      Um also in deinem Fall beim NAS die echte Client-IP und nicht die des proxies zu bekommen, musst du (falls möglich) die Konfiguration auf dem NAS ändern.
      Die echte Client-IP steht dabei im HTTP Request-Header als:
      „X-Forwarded-For“.

      Wenn du auf dem NAS auch einen apache am laufen hast musst du dort in der Konfiguration die folgende Zeile einfügen:

      RemoteIPHeader X-Forwarded-For
  2. Hallo, Super Beschreibung, hat in meiner Laborumgebung auf Anhieb geklappt, super simpel beschrieben.
    Was mache ich aber, wenn ich mehrere Hops habe? Es scheint zwischen dem Web Client und dem Server noch eine Art NAT zu stehen, ich sehe im Log eine IP eines NAT Servers statt meine Client-IP.
    Bedeutet dass, auf dem NAT Server muss da auch was umgestellt werden oder geht dieses Konstrukt hier nicht so wie erwartet?

    1. Ja, es muss dann bei jeder Station so eingestellt werden, dass erstens der X-Forwarded-For header weiter gereicht wird und dieser in die logs anstelle der „richtigen“ IP (von wo aus der request kommt) geschrieben wird.

      d.h.: Client kommt mit einer IP und verbindet sich zu proxy-1. proxy-1 loggt die IP und sendet diese als X-Forwarded-For header and proxy-2 weiter. proxy-2 loggt die IP im X-Forwarded-For header und leitet den request and proxy-3 weiter. proxy-2 darf hier jedoch die Source-IP im X-Forwarded-For header nicht mit der des letzten „clients“ (proxy-2) ersetzen, sondern muss den ursprünglichen weiter leiten.
      Dies ist normalerweise so der Fall und ein X-Forwarded-For header mit zwei Proxies sähe beim dritten Host so aus:
      X-Forwarded-For: client, proxy-1, proxy-2
      proxy-3 müsste dann wiederum so eingestellt werden, dass der X-Forwarded-For header anstelle der IP des letzen „clients“ geloggt wird.

      Wenn es hingegen nicht um reverse proxies geht, sondern nur um NAT, darf SNAT (masquerading) nicht verwendet werden, ansonsten sieht der server per se nur die NAT IP…

  3. Hallo vielen Dank für deine tollen Beiträge. Eine Frage ich habe einen Reverseproxy mit einer internen und einer externen ip. Welche IP muss ich dann bei RemoteInternalProxy angeben?

    Vielen Dank

    1. Hier kommt es darauf an, mit welcher IP der reverse-proxy sich mit dem Webserver verbindet.
      Wenn im reverse-proxy die interne Adresse des Webservers angegeben ist, wird es sehr wahrscheinlich die interne sein; andernfalls wenn auf die externe Adresse des Webservers proxied wird die externe.
      Sicherheit verschaffen kannst du dir, indem du auf dem Webserver das Kommando: tcpdump port 80 laufen lässt und dann auf dem reverse-proxy ein telnet webserver-ip-der-rp-konfiguration 80 machst.

Schreibe einen Kommentar

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