Comment faire pour récupérer le client et le serveur adresse IP et numéro de port dans Node.js
J'ai essayé de chercher beaucoup pour trouver un moyen de connaître le client et le serveur adresse ip et numéro de port. Jusqu'à présent j'ai trouvé:
- Ip du Client : peut être connu par
req.ip
. - Port Client : j'ai beaucoup cherché mais je ne pouvais pas trouver un moyen de trouver ce client port éphémère. Après l'inspection de la
req
etres
objets, j'ai trouvé que, parfois,res.connection._peername
contient l'adresse ip du client et le numéro de port. Mais ce n'est pas le moyen fiable pour trouver le numéro de port, car, dans certains demande cette propriété est manquant. Alors, quelle est la bonne façon de savoir à propos de la port ? - Ip du serveur : Ici, je suis intéressé à savoir l'externe ou de l'ip publique du serveur. J'ai cherché un peu pour la même chose et j'ai trouvé ce lien qui utilise une api externe pour récupérer l'adresse ip externe. Est-ce la seule façon possible de trouver l'adresse IP externe ? Ou sont-il un autre moyen possible ?
- Port du serveur : Il ne peut être connu avec
listener.address().port
[source] . Mais peut-il être connu à partir dereq
oures
objets ? En fait, je veux savoir le numéro de port dans le middleware où j'aireq
,res
etnext
seulement( essentiellementapp.use(function(req,res,next){...}))
).
OriginalL'auteur user2805872 | 2016-07-17
Vous devez vous connecter pour publier un commentaire.
Vous pouvez obtenir ces quatre valeurs de ces propriétés si vous avez une connexion directe avec le client (pas de proxy dans le sens):
Pertinentes node.js le code source de pointeur dans net.js: https://github.com/nodejs/node/blob/863952ebadd4909a66bb9da7868bf75bbbe1462d/lib/net.js#L608
Remarque: lorsque vous accédez à ces valeurs de propriété, ils sont techniquement mis en œuvre que les méthodes de lecture. Vous ne pouvez pas définir ces propriétés.
Si il y a une infrastructure de serveur tels que les équilibreurs de charge, les serveurs proxy, etc... en face de votre serveur, les valeurs locales peut retourner le serveur local, et non pas ce que le public réel IP/port que le client connecté à l'origine. La seule façon de récupérer l'original du public IP/port si votre infrastructure de jeux originaux comme les en-têtes HTTP (dont certains proxys set IP, je ne sais pas si tous les proxys de configurer le port) car ils ne sont pas présents dans les premières de la connexion TCP proxy.
Pour les cas où un proxy, vous pouvez également regarder des en-têtes HTTP:
Le X-Forwarded-têtes peuvent aussi être une liste séparée par des virgules s'il a passé par plusieurs mandataires tels que:
Il y a également un en-tête standard de RFC 7239 2014:
req.ip
est ce que l'Express utilise pour son interne proxy de confiance de la manipulation. Mieux à l'utilisation quereq.connection.remoteAddress
si Express est utilisé. Pour le port si le proxy en amont n'a pas l'habitude d'envoyer ces informations.Je ne pouvais pas trouver de code de prise en charge pour
req.ip
si je n'étais pas prêt à faire confiance à la confiance, les valeurs que j'ai trouvé le code pour.req.connection
est leSocket
objet de votre requête http et de ces quatre propriétés sont des propriétés d'une connexion TCP en node.js. Express peut faire quelque chose en plus, mais ceux-ci viennent directement à partir de la socket sous-jacente de la mise en œuvre. Oui, les procurations peuvent masquer les infos à propos de la connexion à distance - ma réponse mentionne que.Bon, je répond à votre commentaire à propos de proxy en amont. Vous pouvez lire à propos de la confiance des paramètres de proxy ici: expressjs.com/en/api.html Votre suggestion obtient juste la connexion immédiate, ce qui est souvent souhaitée. Toutefois, si vous voulez savoir ce que la demande IP, et vous avez un proxy en avant, il est plus facile de simplement compter sur Express intégré dans le traitement de cette situation.
req.connection.localAddress
donnera l'adresse IP locale du serveur. Est-il possible de récupérer l'adresse IP publique du serveur de la même manière ?doit être le côté serveur, l'adresse IP de la connexion TCP. Si il n'y a pas de proxy entre vous et le public à l'internet, alors que ce devrait être votre adresse IP publique. Si il y a un proxy, alors que l'adresse ne sera pas l'adresse IP publique parce que l'adresse IP publique ne fait pas partie de votre serveur. J'ai ajouté plus d'infos sur proxy-têtes à ma réponse, mais je ne sais pas si elle va vous obtenir le véritable adresse IP publique que le client connecté à l'origine.
OriginalL'auteur jfriend00