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

Resuelto Shamoon asked hace 13 años • 33 respuestas

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

app.post('/get/ip/address', function (req, res) {
    // need access to IP address here
})
Shamoon avatar Nov 13 '11 04:11 Shamoon
Aceptado

En tu requestobjeto hay una propiedad llamada socket, que es un net.Socketobjeto. El net.Socketobjeto tiene una propiedad remoteAddress, por lo tanto deberías poder obtener la IP con esta llamada:

request.socket.remoteAddress

(si la versión de su nodo es inferior a 13, utilice la versión obsoleta ahora request.connection.remoteAddress)

EDITAR

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

EDITAR 2

Cuando se usa expresscon Node.js:

Si lo configura app.set('trust proxy', true), req.ipdevolverá la dirección IP real incluso si está detrás del proxy. Consulta la documentación para más información.

topek avatar Nov 12 '2011 22:11 topek
var ip = req.headers['x-forwarded-for'] ||
     req.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, x-forwarded-forno siempre se establecerá un encabezado, lo que puede generar un error.

El formato general del campo es:

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

donde el valor es una lista de direcciones IP separadas por comas y espacios, la más a la izquierda es el cliente original y cada proxy sucesivo que pasó la solicitud agrega la dirección IP de donde recibió la solicitud. En este ejemplo, la solicitud pasó por proxy1, proxy2y luego proxy3. proxy3aparece como dirección remota de la solicitud.

Esta es la solución sugerida por Arnav Gupta con una solución que Martin sugiere a continuación en los comentarios para los casos en los que x-forwarded-forno está configurada:

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

Sugerencia usando JS moderno:

  • Procesando x-forwarded-forsolo si está configurado, si es así, tome la primera dirección.
  • otros parámetros utilizan encadenamiento opcional (?.)
const parseIp = (req) =>
    req.headers['x-forwarded-for']?.split(',').shift()
    || req.socket?.remoteAddress

console.log(parseIp(req))
// => 127.0.0.1
Edmar Miyake avatar Oct 22 '2013 17:10 Edmar Miyake

Si usas expreso...

req.ip

Estaba buscando esto y pensé: espera, estoy usando express. Duh.

King Friday avatar Mar 12 '2017 16:03 King Friday

Puede permanecer SECO y simplemente usar node-ipware que admita 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 intento para obtener la dirección IP del usuario o regresará 127.0.0.1para indicar que no pudo determinar la dirección IP del usuario. Eche un vistazo al archivo README para ver las opciones avanzadas.

Val Neekman avatar Oct 11 '2014 02:10 Val Neekman

Puede utilizar request-ip para recuperar la dirección IP de un usuario. Maneja bastantes de los diferentes casos extremos, 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

pbojinov avatar Jun 09 '2015 20:06 pbojinov