Comment obtenir l'adresse IP du client à partir d'une demande à l'intérieur du conteneur Docker haproxy?

Surender thakran

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 haproxyet un autre pour nodejsqui utilise le expressjsframework. 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 ACLsdans le fichier de configuration.

J'ai essayé d'accéder à l'en- x-forwarded-fortê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 haproxyconfiguration et l'utilisation option forwardfor header X-Client-IPdans le defaultsbloc, définissez également l'en- x-client-iptê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 haproxys'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' haproxyintérieur du conteneur afin qu'il puisse la transmettre à nodejs?

Voici mon haproxyfichier 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.

Surender thakran

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 haproxyconfiguration 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 forwardforin frontend http-inblock. 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=hostoption 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-fortê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.

modifier le
0

laisse moi dire quelques mots

0commentaires
connexionAprès avoir participé à la revue

Articles connexes

TOP liste

  1. 1

    Microsoft.WebApplication.targets

  2. 2

    Spring @RequestParam DateTime format comme ISO 8601 Date Heure facultative

  3. 3

    comment supprimer "compte de connexion google" à des fins de développement - actions sur google

  4. 4

    Comment ajouter une entrée à une table de base de données pour une combinaison de deux tables

  5. 5

    Passer la taille d'un tableau 2D à une fonction ?

  6. 6

    Exporter la table de l'arborescence vers CSV avec mise en forme

  7. 7

    Impossible d'accéder à la vue personnalisée pendant le test de l'interface utilisateur dans XCode

  8. 8

    Créer un système Buzzer à l'aide de python

  9. 9

    Comment changer le navigateur par défaut en Microsoft Edge pour Jupyter Notebook sous Windows 10 ?

  10. 10

    impossible d'obtenir l'image d'arrière-plan en plein écran dans reactjs

  11. 11

    Algorithme: diviser de manière optimale une chaîne en 3 sous-chaînes

  12. 12

    CSS: before ne fonctionne pas sur certains éléments,: after fonctionne très bien

  13. 13

    Conversion double en BigDecimal en Java

  14. 14

    Comment obtenir l'intégration contextuelle d'une phrase dans une phrase à l'aide de BERT ?

  15. 15

    Comment choisir le nombre de fragments et de répliques Elasticsearch

  16. 16

    Comment vérifier si un utilisateur spécifique a un rôle? Discord js

  17. 17

    Comment créer un bot à compte à rebours dans Discord en utilisant Python

  18. 18

    Existe-t-il un moyen de voir si mon bot est hors ligne ?

  19. 19

    comment afficher un bouton au-dessus d'un autre élément ?

  20. 20

    Comment activer le message Pylint "too-many-locals" dans VS Code?

  21. 21

    Je continue à obtenir l'objet 'WSGIRequest' n'a pas d'attribut 'Get' sur django

chaudétiquette

Archive