ich in Heroku die Support-Abteilung arbeiten und haben einige Zeit Sprache mit unserer Routing-Ingenieure ausgegeben. Ich wollte einige zusätzliche Informationen posten, um einige Dinge darüber zu klären, was hier vor sich geht.
Das Beispiel in der Antwort oben hatte nur die Client-IP zuletzt zufällig angezeigt und das ist nicht wirklich garantiert. Der Grund, warum es nicht der erste war, ist, dass die Ursprungsanforderung behauptete, dass sie für die IP-Adresse weitergeleitet wurde, die in dem Header X-Forwarded-For
angegeben ist. Wenn der Heroku-Router die Anforderung erhalten hat, hat er die IP-Adresse, die direkt mit der X-Forwarded-For
-Liste verbunden war, an die Liste angehängt, die in die Anfrage eingefügt wurde. Unser Router fügt immer die IP, die mit dem AWS ELB vor unserer Plattform verbunden ist, als letzte IP in der Liste hinzu. Diese IP könnte die ursprüngliche sein (und in dem Fall, wo es nur eine IP gibt, ist es fast sicher), aber in dem Moment, in dem mehrere IPs verkettet sind, sind alle Wetten ausgeschaltet. Konvention ist immer die letzte IP in der Kette am Ende der Liste hinzuzufügen (was wir tun), aber an jedem Punkt entlang der Kette kann diese Kette geändert werden und verschiedene IPs können eingefügt werden. Daher ist die einzige IP, die zuverlässig ist (aus der Perspektive unserer Plattform), die letzte IP in der Liste.
veranschaulicht, um, sagen sie mal jemand eine Anfrage initiiert und fügt beliebig 3 zusätzlichen IPs zum X-Forwarded-For-Header:
curl -H "X-Forwarded-For: 12.12.12.12,15.15.15.15,4.4.4.4" http://www.google.com
Stellen Sie sich diese IP 9.9.9.9 war die Maschine und es mußte passieren ein Proxy (z. B. der campusweite Proxy einer Universität). Angenommen, der Proxy hatte eine IP von 2.2.2.2. Angenommen, es wurde nicht konfiguriert, um X-Forwarded-For
Header zu entfernen (was es wahrscheinlich nicht wäre), würde es einfach die 9.9.9.9 IP an das Ende der Liste heften und die Anfrage an Google weiterleiten. An diesem Punkt würde der Header wie folgt aussehen:
X-Forwarded-For: 12.12.12.12,15.15.15.15,4.4.4.4,9.9.9.9
Dieser Antrag wird dann durch die Google-Endpunkt übergeben, die die Universität Proxy-IP von 2.2.2.2 wird anhängen, so schließlich der Header wie dies in den Google-Protokolle aussehen :
X-Forwarded-For: 12.12.12.12,15.15.15.15,4.4.4.4,9.9.9.9,2.2.2.2
Also, welches ist der Client IP? Es ist unmöglich, aus dem Standpunkt von Google zu sagen. In Wirklichkeit ist die Client-IP 9.9.9.9. Die letzte aufgelistete IP ist 2.2.2.2 und die erste ist 12.12.12.12. Alles, was Google wissen würde, ist, dass die 2.2.2.2 IP definitiv korrekt ist, weil das die IP war, die tatsächlich mit ihrem Dienst verbunden war - aber sie würden nicht wissen, ob das der anfängliche Client für die Anfrage war oder nicht aus den verfügbaren Daten. Genauso gibt es nur eine IP in dieser Kopfzeile - das ist die IP, die direkt mit unserem Dienst verbunden ist, also wissen wir, dass es zuverlässig ist.
Aus einem praktischen Standpunkt wird diese IP wahrscheinlich zuverlässig sein die meiste Zeit (weil die meisten Leute nicht stören werden, ihre IP zu spoofen). Leider ist es unmöglich, diese Art von Spoofing zu verhindern, und zu dem Zeitpunkt, zu dem eine Anfrage an den Heroku-Router kommt, können wir unmöglich feststellen, ob IPs in einer X-Forwarded-For
-Kette manipuliert wurden oder nicht.
Abgesehen von allen Zuverlässigkeitsproblemen sollten diese IP-Ketten immer von links nach rechts gelesen werden. Der Client IP sollte immer die linke IP sein.
Es tut mir leid, aber welche Sprache ist das? Wenn es nicht Python ist, wie mache ich das in Python? – Cubetastic