No entiendo completamente cómo debo obtener una dirección IP de usuario remoto.
Digamos que tengo una ruta de solicitud simple como:
app.get(/, function (req, res){
var forwardedIpsStr = req.header('x-forwarded-for');
var IP = '';
if (forwardedIpsStr) {
IP = forwardedIps = forwardedIpsStr.split(',')[0];
}
});
¿Es correcto el enfoque anterior para obtener la dirección IP del usuario real o hay una mejor manera? ¿Y qué hay de los poderes?
node.js
express
ip
ip-address
Erik
fuente
fuente

Respuestas:
Si está ejecutando detrás de un proxy como NGiNX o lo que tiene, solo entonces debe verificar 'x-forwards-for':
Si el proxy no es 'tuyo', no confiaría en el encabezado 'x-forwards-for', porque puede ser falsificado.
fuente
proxy_set_header X-Forwarded-For $remote_addr;en su configuración nginx en caso de que esté utilizando su propio proxy inverso.var ip = (req.headers['x-forwarded-for'] || req.connection.remoteAddress || '').split(',')[0].trim();obtener la IP del cliente.Si bien la respuesta de @alessioalex funciona, hay otra forma, como se indica en la sección Express detrás de proxies de Express - guía .
app.set('trust proxy', true)a su código de inicialización express.req.iporeq.ipsde la manera habitual (como si no hubiera un proxy inverso)Lectura opcional:
req.iporeq.ips.req.connection.remoteAddressNo funciona con esta solución.'trust proxy'disponibles si necesita algo más sofisticado que confiar en todo lo que se pasa en elx-forwarded-forencabezado (por ejemplo, cuando su proxy no elimina el encabezado x-forward-for preexistente de fuentes no confiables). Consulte la guía vinculada para más detalles.x-forwarded-forencabezado, hay dos posibilidades.proxy_set_header X-Forwarded-For $remote_addr;a su configuración.fuente
app.enable('trust proxy')también funciona para usarreq.ip. Excepto que consigo el puerto1.2.3.4:56789. Para despojarme, lo hagovar ip = req.ip.split(':')[0]En
nginx.confarchivo:proxy_set_header X-Real-IP $remote_addr;En el
node.jsarchivo del servidor:var ip = req.headers['x-real-ip'] || req.connection.remoteAddress;tenga en cuenta que expresa encabezados en minúsculas
fuente
req.headers['x-real-ip']incluso en elnginx.confencabezado se establece con letras mayúsculas.Particularmente para el nodo, la documentación para el componente del servidor http, bajo conexión de evento dice:
Entonces, eso significa que
request.connectiones un socket y de acuerdo con la documentación, de hecho, hay un atributo socket.remoteAddress que de acuerdo con la documentación es:Bajo express, el objeto de solicitud también es una instancia del objeto de solicitud http Node, por lo que este enfoque aún debería funcionar.
Sin embargo, en Express.js la solicitud ya tiene dos atributos: req.ip y req.ips
Vale la pena mencionar que, según tengo entendido, el Express
req.ipes un mejor enfoque quereq.connection.remoteAddress, ya quereq.ipcontiene la IP del cliente real (siempre que el proxy de confianza esté habilitado en express), mientras que el otro puede contener la dirección IP del proxy (si hay uno).Esa es la razón por la cual la respuesta actualmente aceptada sugiere:
El
req.headers['x-forwarded-for']será el equivalente de expressreq.ip.fuente
app.set('trust proxy', true)req.iporeq.ipsde la manera habitualfuente
Esta es solo información adicional para esta respuesta .
Si está utilizando
nginx, agregaríaproxy_set_header X-Real-IP $remote_addr;al bloque de ubicación del sitio./etc/nginx/sites-available/www.example.compor ejemplo. Aquí hay un ejemplo de bloque de servidor.Después de reiniciar
nginx, podrá acceder a la IP en sus rutasnode/expressaplicación conreq.headers['x-real-ip'] || req.connection.remoteAddress;fuente
Según Express detrás de los proxies , se
req.ipha tenido en cuenta el proxy inverso si se ha configuradotrust proxycorrectamente. Por lo tanto, es mejor que elreq.connection.remoteAddressque se obtiene de la capa de red y desconoce el proxy.fuente
Escribí un paquete para ese propósito. Puede usarlo como middleware express. Mi paquete se publica aquí: https://www.npmjs.com/package/express-ip
Puede instalar el módulo usando
Uso
fuente
Sé que esta pregunta ha sido respondida, pero así es como hice que la mía funcione.
fuente
Si está bien con la biblioteca de terceros. Puede verificar request-ip .
Puedes usarlo es por
El código fuente es bastante largo, así que no lo copiaré aquí, puedes consultarlo en https://github.com/pbojinov/request-ip/blob/master/src/index.js
Básicamente,
Divulgar: no estoy asociado con la biblioteca.
fuente
Esto funcionó para mí mejor que el resto. Mis sitios están detrás de CloudFlare y parecía requerirlo
cf-connecting-ip.No probé Express detrás de proxies ya que no dijo nada sobre este
cf-connecting-ipencabezado.fuente
Con soporte de might-flare, nginx y x-real-ip
fuente
En mi caso, similar a esta solución, terminé usando el siguiente enfoque de x-forward-for :
x-forwarded-forEl encabezado seguirá agregando la ruta de la IP desde el origen hasta el servidor de destino final, por lo tanto, si necesita recuperar la IP del cliente de origen, este sería el primer elemento de la matriz.fuente
var ip = req.connection.remoteAddress;
ip = ip.split (':') [3];
fuente
ip = ip.split(':').pop();será difícil en este caso si la ip normal, es decir, 127.0.0.1 vendrá, todavía podrá darle ip.El objeto de encabezado tiene todo lo que necesita, solo haga esto:
fuente
Poniendo todo junto con la solución witk @kakopappa más el
morganregistro de la dirección IP del cliente:fuente