web-dev-qa-db-fra.com

haproxy et transfert de l'adresse IP du client vers les serveurs

J'ai un problème avec HAproxy.

J'utilise HAproxy comme équilibreur de charge qui distribue les requêtes http entrantes à 5 serveurs Web. normalement, une demande client est transmise à des serveurs Web avec l'IP de Loadbalancer. Mais j'ai besoin d'adresses IP de clients ou de vraies adresses IP qui demandent quelque chose aux serveurs Web. Parce que nous devons enregistrer les adresses IP du client réel.

J'essaie d'obtenir les adresses IP des clients sur les serveurs Web mais je ne peux pas réussir jusqu'à présent. Je vois toujours l'IP de l'équilibreur de charge.

J'utilise l'option x-forward-for mais le problème n'est pas résolu. Après cela, j'ai trouvé une autre option "source 0.0.0.0:80 usesrc clientip" mais j'ai eu eror en essayant d'exécuter HAproxy qui concerne les besoins de compilation avec l'option USE_TPROXY du HAproxy. Je l'ai fait, je recompile HAproxy avec l'option USE_TPROXY mais ne change rien. que puis-je faire pour apprendre les adresses IP des clients réels.

Ma version du noyau Linux est 2.6.32-34 Je veux dire que le noyau prend en charge le proxy transparent. et j'utilise UBUNTU 10.4 LTS

mon fichier de configuration est ici

global
    maxconn 100000
    uid 99
    gid 99
    daemon

defaults
    option forwardfor except 127.0.0.1
    mode    http
    (1)source 0.0.0.0:80 interface hdr_ip(x-forwarded-for,-1)
        (2)source 0.0.0.0:80 usesrc clientip
    contimeout  5000
    clitimeout  50000
    srvtimeout  50000

listen  myWeb 0.0.0.0:80
    mode http
    balance source
    option forwardfor header X-Client
    option http-server-close
    stats enable
    stats refresh 10s
    stats hide-version
    stats scope   .
    stats uri     /lb?stats
    stats realm   LB2\ Statistics
    stats auth admin:xXx

    server  S1 192.168.1.117:80 check inter 2000 fall 3
    server  S2 192.168.1.116:80 check inter 2000 fall 3
    server  S3 192.168.1.118:80 check inter 2000 fall 3

(1) (2) Lors du test de HAproxy, j'ai utilisé l'une de ces deux lignes.

Est-ce que quelqu'un m'aide à apprendre les vraies IP des clients qui sont demandés à nos serveurs?

15
System

J'ai résolu ce problème. Peut-être que ce n'était pas un problème depuis le début. J'ai fait une recherche Google lorsque j'ai rencontré ce problème, et j'ai vu que

option forwardfor

afin d'utiliser dans le fichier haproxy.cfg et aussi d'autres options. J'ai essayé ces options, y compris la recompilation du haproxy ... Mais le vrai problème lié à l'apprentissage des adresses IP des clients réels sur les serveurs Web ne provient pas de HAproxy, il s'agit de lire les en-têtes par les scripts du serveur, dans notre cas, ce langage de script est PHP.

J'essaie d'apprendre les adresses IP du client par ces commandes

echo 'Client IP: '.$_SERVER["REMOTE_ADDR"];
echo 'Client IP: '.$_SERVER["HTTP_CLIENT_IP"];

et ces commandes affichent l'IP de loadbalancer. C'est correct mais ce n'est pas ce à quoi je m'attendais. Malgré l'option forwardfor ces commandes, m'a donné l'IP de loadbalancer

En utilisant l'option forwardfor, nous permettons à HAproxy d'insérer l'en-tête x-forwarded-for dans les demandes du client envoyées à nos serveurs Web. HAproxy a mis ce champ en en-tête mais je l'ai ignoré. Aujourd'hui, j'ai réalisé que c'est un champ d'en-tête et je dois lire cet en-tête comme ceci

echo 'Client IP: '.$_SERVER["HTTP_X_FORWARDED_FOR"];

Avec cette commande, j'ai obtenu l'adresse IP du client et non l'adresse IP de Loadbalancer.

Mais mon offre est afin d'obtenir les données d'en-tête pour enquêter sur les autres informations est la fonction getallheaders () pour PHP.

//from php.net http://php.net/manual/en/function.getallheaders.php
foreach (getallheaders() as $name => $value) {
    echo "$name: $value<br>\n";
}

La fin de tout mon dernier fichier haproxy.cfg est comme ci-dessous.

global
    maxconn 100000
    uid 99
    gid 99
    daemon

defaults
    option forwardfor except 127.0.0.1
    mode    http
    contimeout  5000
    clitimeout  50000
    srvtimeout  50000

listen  myWeb 0.0.0.0:80
    mode http
    balance source
    option forwardfor
    option http-server-close
    stats enable
    stats refresh 10s
    stats hide-version
    stats scope   .
    stats uri     /lb?stats
    stats realm   LB2\ Statistics
    stats auth admin:passwd

    server  S1 192.168.1.117:80 check inter 2000 fall 3
    server  S2 192.168.1.116:80 check inter 2000 fall 3
    server  S3 192.168.1.118:80 check inter 2000 fall 3

Néanmoins, j'ai beaucoup de choses manquantes sur HAproxy comme ce qui est le sens uid ou gid.

15
System

Si vous avez besoin de l'adresse IP du client sur le journal Apache, vous pouvez modifier votre conf Apache pour enregistrer le X-forwarded-for en place la source d'origine (5h)

#LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
2

Je viens d'essayer la solution de @ System et il semble que le nom de l'en-tête soit passé de HTTP_X_FORWARDED_FOR À x-forwarded-for. C'est probablement lié à la version HAproxy, parce que la réponse a été écrite il y a 5 ans ...?

Par exemple, cela fonctionne sur la production:

String requestIp = httpRequest.getHeader("x-forwarded-for");

1
Roc Boronat