In einer Situation, in der Apache hinter einem Reverse-Proxy (wie Squid) sitzt, erhält die CGI-Umgebungsvariable REMOTE_ADDR
die Adresse des Proxy und nicht den Client.
Der Proxy setzt jedoch eine Kopfzeile namens X-Forwarded-For
, die die ursprüngliche IP-Adresse des Clients enthält, damit Apache sie sehen kann.
Die Frage ist, wie wir Apache dazu bringen, REMOTE_ADDR
durch den Wert in der Kopfzeile X-Forwarded-For
zu ersetzen, damit alle Webanwendungen die korrekte Adresse transparent sehen können?
Beachten Sie, dass der Header X-Forwarded-For möglicherweise eine Liste von IP-Adressen enthält, wenn die Anforderung mehr als einen Proxy durchlaufen hat. In diesem Fall möchten Sie normalerweise die IP ganz links. Sie können dies mit einem SetEnvIf:
extrahieren %Vor%Beachten Sie die Verwendung von $ 1 , um die XFFCLIENTIP-Umgebungsvariable so festzulegen, dass sie den Inhalt der ersten Gruppe in der Regex (in den Klammern) enthält.
Dann können Sie den Wert der Umgebungsvariablen verwenden, um Header festzulegen (oder sie in Apache-Protokollformaten zu verwenden, damit die Protokolle die tatsächliche Client-IP enthalten).
Zusätzlich zu mod_rpaf , wie bereits erwähnt, scheint mod_extract_forwarded führt diese Funktion ebenfalls aus.
Ein Vorteil von mod_extract_forwarded
ist, dass es von EPEL für RHEL / CentOS-Server verfügbar ist, während mod_rpaf
nicht verfügbar ist.
Es scheint, dass keines dieser beiden Module Ihnen erlaubt, ein ganzes Subnetz von Proxy-Servern auf die weiße Liste zu setzen. Deshalb haben die CloudFlare-Leute ihr eigenes Plugin erstellt: mod_cloudflare , das, wie zu bemerken ist, nicht ein Universalwerkzeug wie die anderen beiden ist; Es enthält eine fest codierte Liste von CloudFlare-Subnetzen.
Leider
Zum Zeitpunkt der Erstellung dieses Artikels funktionierte keiner der Backports und Forks auf freshports.org, people.apache.org oder gist.github.com. Sie basierten alle auf einer frühen Alpha-Version von Apache httpd 2.3, die weder mit den aktuellen Versionen 2.2 noch 2.4 kompatibel war.
Nach stundenlanger Zeitverschwendung beim Versuch, die Backports anzupassen, um eine wirklich funktionierende für httpd 2.2 zu erstellen, entschied ich mich, zu httpd 2.4 zu wechseln. Innerhalb von httpd 2.4 funktioniert mod_remoteip problemlos, selbst wenn ein Load Balancer permanente Keepalive-Verbindungen hat, die er verwendet, um Anfragen von verschiedenen tatsächlichen Client-IP-Adressen an das Backend zu übertragen. Ich bin nicht sicher, ob die anderen Module diese Situation behandeln können (Ändern der Client-IP-Adressen bei jeder Anfrage innerhalb derselben Verbindung).
Ja, wir können das machen.
Fügen Sie einfach eine auto_prepend_file in Ihrer PHP.ini hinzu wie auto_prepend_file = "c:/prepend.php"
und fügen Sie in dieser Datei Folgendes hinzu:
Sie benötigen MOD_REMOTEIP in der Apache-Breite RemoteIPHeader X-Real-IP
.
Prost,
Guiremach
Denken Sie daran, dass dieser Wert gefälscht werden kann. Siehe Ссылка für ein Beispiel aus dem wirklichen Leben mit Auswirkungen auf das Cross-Site-Scripting.
Sie können das Modul mod_extract_forwarded installieren und den Parameter MEFaccept auf alle setzen.