2 votes

Obtenir l'adresse IP et l'emplacement de mon propre serveur au lieu de visiter celui de l'utilisateur

J'ai une application MEAN Stack déployée sur un serveur et j'utilise Nginx comme serveur proxy pour traiter la demande et la rediriger vers le port particulier de l'application.

Par exemple : L'utilisateur accède à l'URL http://www.abcxyz.com/ et Nginx accède à l'URL de l'application http://www.abcxyz.com:1234/ car mon application fonctionne sur le port 1234.

Maintenant, à des fins d'analyse, j'ai écrit un court script en node.js qui récupère l'IP et la localisation des utilisateurs qui visitent mon site web. Je peux voir les requêtes recherchées en externe mais je récupère l'adresse IP et la localisation de mon propre serveur. Comment cela se fait-il ?

Est-ce à cause de Nginx ? Comment puis-je résoudre ce problème et récupérer l'emplacement réel de l'utilisateur ?

Mise à jour : J'ai ajouté une réponse, qui fonctionne pour moi. Santé ;-)

1voto

Marcos Casagrande Points 15232

Si vous utilisez l'express :

La définition d'une valeur de proxy de confiance non fausse entraîne trois résultats importants changements importants :

La valeur de req.hostname est dérivée de la valeur définie dans l'en-tête X-Forwarded-Host, qui peut être définie par le client ou par le serveur mandataire. proxy.

X-Forwarded-Proto peut être défini par le proxy inverse pour indiquer à l'application s'il s'agit de https ou de http ou même d'un nom invalide. Cette valeur est reflétée par req.protocol.

Les valeurs req.ip et req.ips sont remplies avec la liste des adresses de X-Forwarded-For.

http://expressjs.com/es/guide/behind-proxies.html

app.enable('trust proxy');
app.all("*", (req, res, next) => {

    console.log(req.ip, req.ips);
    //Do whatever you want or call next()       
});

Si vous n'utilisez pas express, vous pouvez obtenir l'IP à partir de l'en-tête : x-forwarded-for

let ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress;

Si vous n'obtenez pas l'IP correcte, vous devez avoir les bons paramètres dans Nginx :

http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_set_header

proxy_set_header X-Forwarded-For $remote_addr;

ou pour ajouter l'adresse IP de l'utilisateur distant à toute valeur X-Forwarded-For existante :

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

0voto

Dynamic Remo Points 332

Je voudrais dire merci à @Marcos Casagrande pour sa réponse. Bien que j'aie dû travailler pendant 3 heures de plus après sa réponse, j'ai accepté sa réponse. mais j'accepte sa réponse comme une réponse à ma question.

Voici la Conf Nginx qui fonctionne pour moi, placée au chemin /etc/nginx/conf.d/abcxyz.com.conf .

server {
    listen 80;
    listen [::]:80;
    server_name abcxyz.com;

    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    location / {
        proxy_pass "http://localhost:1234/";
    }
}

Aucune autre conf de Nginx n'est requise, car dans mon implémentation précédente, j'avais un autre fichier de conf à l'adresse suivante /etc/nginx/sites-available/default qui était en conflit avec un nom de serveur en double. Enfin, je voudrais ajouter qu'il faut utiliser la commande Nginx Testing avant de réinitialiser les changements. Ce qui m'a beaucoup aidé. Commandement : nginx -t .

Et dans Node.js, c'est le moyen le plus approprié pour accéder à l'adresse IP du client.

var getClientAddress = (req.headers['x-forwarded-for'] || '').split(',')[0] 
                       || req.connection.remoteAddress;
console.log(getClientAddress);

Santé ;-)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X