Je teste une nouvelle configuration de serveur Web qui rencontre quelques problèmes. Essentiellement, nous avons un serveur Web, où le code utilise l'IP distante pour certaines choses intéressantes, ainsi que des répertoires apache sécurisés vers certains IP (notre bureau, etc.).
Cependant, nous venons de jeter cela derrière ha_proxy afin que nous puissions envisager d'ajouter d'autres serveurs d'applications, mais maintenant l'IP distante est toujours transmise en tant qu'IP proxy, pas le véritable utilisateur distant. Cela signifie que nous ne pouvons pas accéder à certains endroits, et notre application se comporte un peu bizarrement là où l'IP de l'utilisateur est importante.
Notre configuration est la suivante:
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
etreqidel ^X-Real-IP:
cela arrête de truquer les adresses IP dans vos journaux. FYI:X-Real-IP
est l'en-tête par défaut pourNginX
l'option 'set_real_ip_from
.Il existe un moyen de recompiler HAproxy pour inclure Tproxy qui permettra le transfert de l'adresse source.
Il y a un article de blog ici à ce sujet: http://blog.loadbalancer.org/configure-haproxy-with-tproxy-kernel-for-full-transparent-proxy/
Quelques notes:
Le dernier noyau Linux (2.6.28-11-server) inclut la prise en charge de TProxy, il n'est donc pas nécessaire de recompiler le noyau.
Assurez-vous de configurer les serveurs de votre batterie de serveurs Web avec une adresse de passerelle par défaut qui pointe vers le serveur HAProxy.
la source
Utilisez le module rpaf apache http://stderr.net/apache/rpaf/ Je sais que c'est un ancien message mais il m'a fallu des jours pour le trouver. Cela présentera à toute application l'ip x-forwarded-for.
la source
Notez qu'il semblerait que vous pouvez remplacer ce que l'application voit ma modification des en-têtes Apache:
Cependant, cela ne fonctionne pas pour l'accès Apache via "Autoriser à partir de", etc.
la source
X-Forwarded-For
tête existant lorsque la nouvelle adresse IP est ajoutée à la fin de la liste existante, séparée par une virgule et un espace. Modifiez le(.*)
pour([^ ]*)$
récupérer uniquement la dernière IP ... ou utilisezmod_rpaf
oumod_remoteip
pour Apache 2.4 ou version ultérieure.HAProxy, de par sa conception, ne peut pas transmettre l'adresse IP d'origine au serveur réel, à peu près comme n'importe quel autre proxy.
Une solution peut être, si votre seul problème est avec un serveur Web, de rechercher dans l'en-tête HTTP X-forwarded-for, qui devrait contenir l'adresse du client. Maintenant, c'est à peu près spécifique à l'application / au langage, mais jetez un œil à cet exemple en php:
$headers = apache_request_headers();
$real_client_ip = $headers["X-Forwarded-For"];
Si vous souhaitez également enregistrer l'adresse d'origine, vous pouvez modifier le LogFormat dans httpd.conf pour qu'il ressemble à ceci:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{X-Forwarded-For}i\"" common
la source
Eh bien, il semble que le X-Forwarded-for ne fonctionne pas bien pour votre configuration. Alors, y a-t-il une raison particulière pour laquelle vous vous en tenez à l'haproxy? Il semble que IPVS soit plus adapté à vos besoins (j'utilise en fait ldirector qui à son tour utilise ipvs).
Jeter un coup d'œil à:
http://kb.linuxvirtualserver.org/wiki/IPVS
et
http://www.vergenet.net/linux/ldirectord/
L'utilisation d'IPVS en mode «Tunneling IP» ou «Routage direct» préserve l'adresse du client.
la source
Essayez mod_extract_forwarded depuis http://www.openinfo.co.uk/apache/
la source
Moyen simple avec haproxy en mode tcp et nginx:
ajouter send-proxy comme option de serveur:
haproxy.conf:
.
.
écouter ssl 0.0.0.0:443
mode tcp
équilibre lessconn
option httpchk GET / ping
option log-health-checks
serveur w1 192.168.1.1:443 send-proxy vérifier check-ssl vérifier aucun
serveur w2 192.168.1.1:443 envoyer-proxy vérifier check-ssl vérifier aucun
.
.
Nginx doit prendre en charge le protocole proxy
nginx.conf:
.
.
écouter 192.168.1.1:443 ssl proxy_protocol;
.
.
set_real_ip_from 192.168.1.0/24;
real_ip_header proxy_protocol;
.
.
la source