Cómo determinar la dirección IP de un usuario en el nodo

¿Cómo puedo determinar la dirección IP de una solicitud dada desde dentro de un controlador? Por ejemplo (en expreso):

app.post('/get/ip/address', function (req, res) { // need access to IP address here }) 

En su objeto de request hay una propiedad llamada connection , que es un objeto net.Socket . El objeto net.Socket tiene una propiedad remoteAddress , por lo tanto, debería poder obtener la IP con esta llamada:

 request.connection.remoteAddress 

Ver documentación para http y net

EDITAR

Como señala @juand en los comentarios, el método correcto para obtener la IP remota, si el servidor está detrás de un proxy, es request.headers['x-forwarded-for']

 var ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress || req.socket.remoteAddress || (req.connection.socket ? req.connection.socket.remoteAddress : null); 

Tenga en cuenta que a veces puede obtener más de una dirección IP en req.headers['x-forwarded-for'] . Además, un encabezado x-forwarded-for no siempre se establecerá, lo que puede arrojar un error.

El formato general del campo es:

x- client, proxy1, proxy2, proxy3 -para: client, proxy1, proxy2, proxy3

donde el valor es una lista de direcciones IP separadas por comas + espacios, el extremo izquierdo es el cliente original y cada proxy sucesivo que pasa la solicitud y agrega la dirección IP desde donde recibió la solicitud. En este ejemplo, la solicitud pasó a través de proxy1 , proxy2 y luego proxy3 . proxy3 aparece como dirección remota de la solicitud.

Esta es la solución sugerida por Arnav Gupta con una solución que Martin ha sugerido a continuación en los comentarios para los casos en que x-forwarded-for no está configurado:

 var ip = (req.headers['x-forwarded-for'] || '').split(',').pop() || req.connection.remoteAddress || req.socket.remoteAddress || req.connection.socket.remoteAddress 

Puede mantenerse SECO y solo usar node-ipware que sea compatible con IPv4 e IPv6 .

Instalar:

 npm install ipware 

En su app.js o middleware:

 var getIP = require('ipware')().get_ip; app.use(function(req, res, next) { var ipInfo = getIP(req); console.log(ipInfo); // { clientIp: '127.0.0.1', clientIpRoutable: false } next(); }); 

Hará el mejor bash para obtener la dirección IP del usuario o devolverá 127.0.0.1 para indicar que no pudo determinar la dirección IP del usuario. Eche un vistazo al archivo README para obtener opciones avanzadas.

Si usa expreso …

req.ip

Estaba buscando esto, entonces estaba como espera, estoy usando Express. Duh.

Puede usar request-ip para recuperar la dirección IP de un usuario. Maneja bastantes de los casos de borde diferentes, algunos de los cuales se mencionan en las otras respuestas.

Divulgación: Creé este módulo

Instalar:

 npm install request-ip 

En tu aplicación:

 var requestIp = require('request-ip'); // inside middleware handler var ipMiddleware = function(req, res, next) { var clientIp = requestIp.getClientIp(req); // on localhost > 127.0.0.1 next(); }; 

Espero que esto ayude

La siguiente función tiene todos los casos cubiertos ayudarán

 var ip; if (req.headers['x-forwarded-for']) { ip = req.headers['x-forwarded-for'].split(",")[0]; } else if (req.connection && req.connection.remoteAddress) { ip = req.connection.remoteAddress; } else { ip = req.ip; }console.log("client IP is *********************" + ip); 

request.headers['x-forwarded-for'] || request.connection.remoteAddress

Si el encabezado x-forwarded-for está allí, utilícelo, de lo contrario use la propiedad .remoteAddress .

El encabezado x-forwarded-for se agrega a las solicitudes que pasan por equilibradores de carga (u otros tipos de proxy) configurados para HTTP o HTTPS (también es posible agregar este encabezado a las solicitudes al equilibrar en un nivel TCP utilizando el protocolo proxy ). Esto se debe a que la propiedad request.connection.remoteAddress contendrá la dirección IP privada del equilibrador de carga en lugar de la dirección IP pública del cliente. Al usar una instrucción OR , en el orden anterior, comprueba la existencia de un encabezado x-forwarded-for y lo usa si existe; de ​​lo contrario, use request.connection.remoteAddress .

Si está utilizando la versión expresa 3.xo superior, puede usar la configuración del proxy de confianza ( http://expressjs.com/api.html#trust.proxy.options.table ) y recorrerá la cadena de direcciones en el encabezado x-forward-for e ingrese la última IP en la cadena que no haya configurado como un proxy confiable en la propiedad ip en el objeto de solicitud.

 function getCallerIP(request) { var ip = request.headers['x-forwarded-for'] || request.connection.remoteAddress || request.socket.remoteAddress || request.connection.socket.remoteAddress; ip = ip.split(',')[0]; ip = ip.split(':').slice(-1); //in case the ip returned in a format: "::ffff:146.xxx.xxx.xxx" return ip; } 

Simple obtener una dirección IP remota en nodejs:

 var ip = req.header('x-forwarded-for') || req.connection.remoteAddress; 

Hay dos formas de obtener la dirección IP:

  1. let ip = req.ip

  2. let ip = req.connection.remoteAddress;

Pero hay un problema con los enfoques anteriores.

Si está ejecutando su aplicación detrás de Nginx o cualquier proxy, cada dirección IP será 127.0.0.1 .

Entonces, la mejor solución para obtener la dirección IP del usuario es:

 let ip = req.header('x-forwarded-for') || req.connection.remoteAddress; 

Si obtiene varias direcciones IP, esto funciona para mí:

 var ipaddress = (req.headers['x-forwarded-for'] || req.connection.remoteAddress || req.socket.remoteAddress || req.connection.socket.remoteAddress).split(",")[0]; 

Tuve el mismo problema … también soy nuevo en javascript, pero lo resolví con req.connection.remoteAddress; eso me dio la dirección IP (pero en formato ipv6 :: ffff.192.168.0.101) y luego .slice para eliminar los 7 primeros dígitos.

 var ip = req.connection.remoteAddress; if (ip.length < 15) { ip = ip; } else { var nyIP = ip.slice(7); ip = nyIP; }