J'essaie d'obtenir l'adresse IP du client à partir des objets de requête dans mon serveur nodejs.
Ma structure technologique est la suivante: je gère deux conteneurs docker. Un pour haproxy
et un autre pour nodejs
qui utilise le expressjs
framework. Tout le trafic entrant est d'abord reçu par haproxy que j'utilise pour le proxy et l'équilibrage de charge. Haproxy transmet les requêtes aux backends appropriés en fonction du ACLs
dans le fichier de configuration.
J'ai essayé d'accéder à l'en- x-forwarded-for
tête de la demande dans mon nodejs, mais il n'a renvoyé que l'adresse IP de l'interface de la passerelle réseau docker 172.17.0.1
.
En vous dirigeant vers la haproxy
configuration et l'utilisation option forwardfor header X-Client-IP
dans le defaults
bloc, définissez également l'en- x-client-ip
tête sur l'adresse IP de l'interface de passerelle réseau docker. Les journaux de débogage enregistrent également la même adresse IP.
Voilà donc le problème. Puisqu'il haproxy
s'exécute à l'intérieur d'un conteneur, il pense que l'interface de la passerelle réseau docker est le client.
Comment puis-je obtenir l'adresse IP du client réel à l' haproxy
intérieur du conteneur afin qu'il puisse la transmettre à nodejs?
Voici mon haproxy
fichier de configuration:
global
debug
maxconn 4096
defaults
mode http
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
timeout http-keep-alive 50000ms
option http-keep-alive
option http-server-close
option forwardfor header X-Client-IP
frontend http-in
bind *:80
acl is_api hdr_end(host) -i api.3dphy-dev.com
use_backend api if is_api
default_backend default
backend default
server s0 "${DOCKER_INTERFACE_IP}:3000"
backend api
balance leastconn
option httpclose
option forwardfor
server s1 "${DOCKER_INTERFACE_IP}:17884"
Je lance mon conteneur haproxy en utilisant:
docker run -d --name haproxy_1 -p 80:80 -e DOCKER_INTERFACE_IP=`ifconfig docker0 | grep -oP 'inet addr:\K\S+'` -v $(pwd)/config/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro haproxy:1.6
Remarque: je n'utilise aucun pare-feu. N'hésitez pas non plus à suggérer des améliorations dans ma configuration. Keep-alive s'avère également être un problème.
Enfin réussi à trouver une solution après avoir parcouru le forum docker.
La solution est un processus en deux étapes.
J'avais d'abord besoin de mettre à jour ma haproxy
configuration pour ceci:
global
debug
maxconn 4096
defaults
mode http
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
timeout http-keep-alive 50000ms
option http-keep-alive
option http-server-close
frontend http-in
bind *:80
option forwardfor
acl is_site hdr_end(host) -i surenderthakran-dev.com
use_backend site if is_site
default_backend default
backend default
server s0 "${DOCKER_INTERFACE_IP}:3000"
backend site
balance leastconn
option httpclose
option forwardfor
server s1 "${DOCKER_INTERFACE_IP}:17884"
Notez l'ajout de option forwardfor
in frontend http-in
block. Cela indique à la partie frontale de haproxy d'ajouter l'adresse IP du client à l'en-tête de la requête.
Deuxièmement, la commande docker run doit être mise à jour pour:
docker run -d --name haproxy_1 -p 80:80 -e DOCKER_INTERFACE_IP=`ifconfig docker0 | grep -oP 'inet addr:\K\S+'` -v $(pwd)/config/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro --net=host haproxy:1.6
Notez l'ajout d' --net=host
option dans la commande docker run. Il indique à docker de lancer le nouveau conteneur et d'utiliser la même carte réseau que l'hôte.
Maintenant, l'adresse IP du client d'origine est ajoutée à l'en-tête de la demande et est accessible dans l'en- x-forwarded-for
tête de la demande dans toute application à laquelle la demande est transmise.
Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.
En cas d'infraction, veuillez [email protected] Supprimer.
laisse moi dire quelques mots