Ich teste ein neues Webserver-Setup, bei dem einige Probleme auftreten. Im Wesentlichen haben wir einen Webserver, auf dem der Code die Remote-IP für einige interessante Dinge verwendet, sowie einige Apache-Verzeichnisse, die bis zu bestimmten IP-Adressen (unserem Büro usw.) gesichert sind.
Wir haben dies jedoch gerade hinter ha_proxy eingeklinkt, damit wir uns ansehen können, wie wir weitere App-Server hinzufügen, aber jetzt wird die Remote-IP immer als Proxy-IP durchgestellt, nicht als der echte Remote-Benutzer. Dies bedeutet, dass wir nicht zu bestimmten Orten gelangen können und unsere App sich etwas seltsam verhält, wenn die Benutzer-IP wichtig ist.
Unsere Konfiguration ist wie folgt:
global
maxconn 4096
pidfile /var/run/haproxy.pid
daemon
defaults
mode http
retries 3
option redispatch
maxconn 2000
contimeout 5000
clitimeout 50000
srvtimeout 50000
listen farm xxx.xxx.xxx.xxx:80
mode http
cookie GALAXY insert
balance roundrobin
option httpclose
option forwardfor
stats enable
stats auth username:userpass
server app1 xxx.xxx.xxx.xxx:80 maxconn 1 check
option forwardfor header X-Real-IP
undreqidel ^X-Real-IP:
, dies hört auf, IPs in Ihren Protokollen zu fälschen. FYI:X-Real-IP
ist der Standardheader fürNginX
die Option 'set_real_ip_from
.Es gibt eine Möglichkeit, HAproxy neu zu kompilieren, um Tproxy einzuschließen, wodurch die Weiterleitung der Quelladresse ermöglicht wird.
Hier gibt es einen Blog-Beitrag dazu: http://blog.loadbalancer.org/configure-haproxy-with-tproxy-kernel-for-full-transparent-proxy/
Ein paar Anmerkungen:
Der neueste Linux-Kernel (2.6.28-11-Server) unterstützt TProxy, so dass ein erneutes Kompilieren des Kernels nicht erforderlich ist.
Stellen Sie sicher, dass Sie die Server in Ihrer Webfarm mit einer Standard-Gateway-Adresse konfigurieren, die auf den HAProxy-Server verweist.
quelle
Verwende das rpaf-Apache-Modul http://stderr.net/apache/rpaf/ Ich weiß, dass dies ein alter Beitrag ist, aber es hat Tage gedauert, bis ich ihn gefunden habe. Damit wird jeder Anwendung die x-forwarded-for-ip angezeigt.
quelle
Beachten Sie, dass Sie anscheinend überschreiben können, wie die Anwendung die Apache-Header ändert:
Dies funktioniert jedoch nicht für den Apache-Zugriff über "Zulassen von" usw.
quelle
X-Forwarded-For
Header sendet, während die neue IP-Adresse durch ein Komma und ein Leerzeichen getrennt am Ende der vorhandenen Liste hinzugefügt wird. Ändern Sie das(.*)
to,([^ ]*)$
um nur die letzte IP zu erhalten ... oder verwenden Siemod_rpaf
odermod_remoteip
für Apache 2.4 oder höher.HAProxy kann die ursprüngliche IP-Adresse nicht wie jeder andere Proxy an den realen Server weiterleiten.
Wenn Sie nur ein Problem mit einem Webserver haben, können Sie in den X-Forwarded-For-HTTP-Header schauen, der die Adresse des Clients enthalten sollte. Nun, das ist ziemlich anwendungs- / sprachspezifisch, aber schauen Sie sich dieses Beispiel in PHP an:
$headers = apache_request_headers();
$real_client_ip = $headers["X-Forwarded-For"];
Wenn Sie auch die ursprüngliche Adresse protokollieren möchten, können Sie das LogFormat in httpd.conf so ändern, dass es ungefähr so aussieht:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{X-Forwarded-For}i\"" common
quelle
Nun, es scheint, dass die X-Weiterleitung für Ihr Setup nicht gut funktioniert. Gibt es für Sie einen besonderen Grund, bei Haproxy zu bleiben? Es scheint, dass IPVS für Ihre Bedürfnisse angemessener ist (ich verwende tatsächlich ldirector, das wiederum ipvs verwendet).
Schauen Sie sich an:
http://kb.linuxvirtualserver.org/wiki/IPVS
und
http://www.vergenet.net/linux/ldirectord/
Bei Verwendung von IPVS im Modus "IP-Tunneling" oder "Direktes Routing" wird die Client-Adresse beibehalten.
quelle
Versuchen Sie mod_extract_forwarded von http://www.openinfo.co.uk/apache/
quelle
Einfacher Weg mit Haproxy im Modus TCP und Nginx:
Sende-Proxy als Server-Option hinzufügen:
haproxy.conf:
.
.
listen ssl 0.0.0.0:443
Modus tcp
balance leastconn
Option httpchk GET / ping
Option Log-Health-Checks
server w1 192.168.1.1:443 send-proxy check check-ssl überprüfe keine
server w2 192.168.1.1:443 send-proxy check check-ssl überprüfe keine
.
.
Nginx benötigt ein Proxy-Protokoll
nginx.conf:
.
.
listen 192.168.1.1:443 ssl proxy_protocol;
.
.
set_real_ip_from 192.168.1.0/24;
real_ip_header proxy_protocol;
.
.
quelle