Lassen Sie Tomcat X-Real-IP verwenden

8

Ich konfiguriere nginx als Reverse-Proxy vor Tomcat 7. Ich habe der nginx-Konfiguration die folgenden Zeilen hinzugefügt:

set_real_ip_from 127.0.0.1;
...
location / {
    proxy_pass http://tomcat;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

Trotzdem sehe ich in Tomcat-Protokollen folgendes Bild:

127.0.0.1 - - [10/Jun/2013:11:25:48 +0600] "GET /app/welcome;jsessionid=6C1B02376C5F748C509B28FC7CE416C9 HTTP/1.0" 200 10571
127.0.0.1 - - [10/Jun/2013:11:25:48 +0600] "GET /app/welcome;jsessionid=0BBE0174C1F0E94FDF49610144E809D3 HTTP/1.0" 200 10571
127.0.0.1 - - [10/Jun/2013:11:25:48 +0600] "GET /app/welcome;jsessionid=AD48005AD453F3A0BE46F1AC978F145D HTTP/1.0" 200 10571

Gibt es eine Möglichkeit, Tomcat zu zwingen, den X-Real-IP-Header zu verwenden (und ihn in Protokolldateien zu schreiben), ohne die Web-App zu ändern?

Randstein
quelle

Antworten:

13

Es ist erforderlich, Valve in der Tomcat-Konfiguration hinzuzufügen:

<Valve className="org.apache.catalina.valves.RemoteIpValve"
               remoteIpHeader="X-Forwarded-For"
               requestAttributesEnabled="true"
               internalProxies="127\.0\.0\.1"  />

Danach beginnt Tomcat, von nginx übergebene Header zu versenden:

proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
Randstein
quelle
5
Gemäß der Dokumentation , internalProxieserwartet einen regulären Ausdruck, keinen Stringliteral. Als solches 127.0.0.1sollte bitte sein 127\.0\.0\.1.
ziesemer
4

Ich habe diese Frage über Google gefunden und möchte der genehmigten Antwort einen Kommentar hinzufügen:

Laut Dokumentation hat dieses Ventil (RemoteIpValve) standardmäßig keine Auswirkung auf die Werte, die in das Zugriffsprotokoll geschrieben werden. Um echte IPs im Protokoll zu erhalten, sollten Sie hinzufügen

requestAttributesEnabled="true"

auch zu AccessLogValve.

Yumaa
quelle
1

Ich suchte nach der gleichen Sache und fand Informationen, die mich zu der folgenden Lösung führten, indem ich im Internet recherchierte.

In Ihrer tomcat server.xml müssen Sie das Protokollierungsventilmuster bearbeiten, um die Werte aus dem eingehenden Header abzurufen .

In deinem

und ändern Sie das Muster in:

pattern="Remote User[ %{X-Forwarded-For}i %l %u %t ] Request[ &quot;%r&quot; ] Status Code[ %s ] Bytes[ %b ] Referer[ &quot;%{Referer}i&quot; ] Agent[ &quot;%{User-agent}i&quot; ] "

Mein Wert für das Vollzugriffsprotokoll sieht folgendermaßen aus:

      <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="access_log." suffix=".txt"
               pattern="Remote User[ %{X-Forwarded-For}i %l %u %t ] Request[ &quot;%r&quot; ] 
               Status Code[ %s ] Bytes[ %b ] Referer[ &quot;%{Referer}i&quot; ] 
               Agent[ &quot;%{User-agent}i&quot; ] " />

Dies wird begleitet von der Nginx-Konfiguration von:

location / {
    proxy_pass http://localhost:8080;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_intercept_errors on;
}

Weitere Informationen zu Protokollventilmustern in Tomcat finden Sie unter: Apache 7: Die Ventilkomponente

Russell Shingleton
quelle
Das %{X-Forwarded-For}iwar der Schlüssel für mich, danke. Leider hat die neuere Antwort unter serverfault.com/a/746395/165500 nicht funktioniert.
Bmauter
1

Ein weiteres nützliches Beispiel für die Tomcat-Konfiguration: internalProxies können mit der Pipeline (|) getrennt werden, da reguläre Ausdrücke akzeptiert werden.

<Valve
   className="org.apache.catalina.valves.RemoteIpValve"
   internalProxies="192\.168\.10\.110|127\.0\.0\.1"
   remoteIpHeader="x-forwarded-for"
   proxiesHeader="x-forwarded-by"
   protocolHeader="x-forwarded-proto"
   />

Weitere Beispiele finden Sie im Tomcat-Dokument

Hamedz
quelle