Die Wikipedia-Beschreibung des HTTP-Headers X-Forwarded-For
lautet:
X-Forwarded-For: client1, proxy1, proxy2, ...
Die Nginx-Dokumentation für die Direktive real_ip_header
lautet teilweise:
Diese Anweisung legt den Namen des Headers fest, der für die Übertragung der Ersatz-IP-Adresse verwendet wird.
Im Falle von X-Forwarded-For verwendet dieses Modul die letzte IP im X-Forwarded-For-Header zum Ersetzen. [Betonung meiner]
Diese beiden Beschreibungen scheinen sich zu widersprechen. In unserem Szenario ist der X-Forwarded-For
Header genau wie beschrieben - die "echte" IP-Adresse des Clients ist der Eintrag ganz links. Ebenso besteht das Verhalten von nginx darin, den am weitesten rechts stehenden Wert zu verwenden - was natürlich nur einer unserer Proxy-Server ist.
Mein Verständnis von X-Real-IP
ist , dass es sollte verwendet werden , um die zur Bestimmung tatsächliche Client - IP - Adresse - nicht der Proxy. Vermisse ich etwas oder ist das ein Fehler in Nginx?
Hat darüber hinaus jemand Vorschläge, wie die X-Real-IP
Überschrift den Wert ganz links anzeigen kann, wie in der Definition von angegeben X-Forwarded-For
?
quelle
Das Parsen des
X-Forwarded-For
Headers ist in der Tat im nginx real_ip-Modul fehlerhaft.Sie beginnt ganz rechts in der Kopfzeile. Sobald ein Leerzeichen oder Komma angezeigt wird, hört sie auf zu suchen und fügt den Teil rechts vom Leerzeichen oder Komma in die IP-Variable ein. Daher wird die neueste Proxy-Adresse als ursprüngliche Client- Adresse behandelt.
Es spielt sich nicht gut nach der Spezifikation; Dies ist die Gefahr, dass es in einem RFC nicht in schmerzlich offensichtlichen Worten formuliert wird.
Übrigens: Es ist schwierig, eine gute Primärquelle für das Format zu finden, das ursprünglich von Squid definiert wurde. Ein Blick in die Dokumentation bestätigt die Bestellung. Ganz links ist der ursprüngliche Client, ganz rechts der neueste Anhang. Ich bin sehr versucht , dieser Wikipedia-Seite ein [Zitat] hinzuzufügen . Eine anonyme Bearbeitung scheint die Autorität des Internets in diesem Bereich zu sein.
Können sich Ihre zwischengeschalteten Proxys nach Möglichkeit nicht mehr am Ende des Headers einfügen, sondern nur noch die tatsächliche Client-Adresse angeben?
quelle
X-Forwarded-For
existiert bereits ein, wenn Nginx erreicht wird . (es ist die richtige Client-IP-Adresse) nginx selbst fügt dann die IP-Adresse unseres Load Balancers (den vorherigen Hop) an denX-Forwarded-For
Header an. (Vermutlich wird die "entfernte Adresse" angehängt.) Wenn dies nicht der Fall wäre, könnte ich denX-Forwarded-For
Header wie zuvor verwenden. (Wir haben kürzlichproxy_pass
- und selbst dann nur mitproxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
in place.X-Forwarded-For
Header mit möglicherweise der ursprünglichen Client-Adresse auf der linken Seite und möglicherweise allen vorangegangenen Proxys, die daran angehängt sind. Der aktuell versorgende Proxy würde also den vorherigen Proxy (= Initiator) an das Ende dieser Liste anfügen und den so erweitertenX-Forwarded-For
Header dem nächsten Upstream-Hop zuführen. Zugegeben, sie hätten eine offensichtlichere Formulierung wählen können.X-Real-IP ist die IP-Adresse des tatsächlichen Clients, mit dem der Server spricht (der "echte" Client des Servers), der im Fall einer Proxy-Verbindung der Proxy-Server ist. Deshalb enthält X-Real-IP die letzte IP im X-Forwarded-For-Header.
quelle
X-Real-IP
es jemals nützlich sein, die IP-Adresse meines eigenen Proxy-Servers zurückzugeben ?