Para aquellos que están trabajando localhost, como lo hice yo, el resultado de todas las respuestas a continuación (casi todas las respuestas funciona) podría llegar ::1. Esto me confundió por algún tiempo. Más tarde descubrí que ::1es una dirección IP real y una IPV6notación para localhost. Hope this helps someone
Pramesh Bajracharya
Respuestas:
452
En su requestobjeto hay una propiedad llamada connection, que es un net.Socketobjeto. El objeto net.Socket tiene una propiedad remoteAddress, por lo tanto, debería poder obtener la IP con esta llamada:
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, es request.headers['x-forwarded-for']
Esto me da una dirección IP diferente de la que me da whatismyip.com. ¿Por qué sería eso?
Shamoon
3
Tengo mi servicio API instalado en una instancia no.de. Cuando intento acceder desde mi computadora, obtengo una dirección IP de "10.2.XXX.YYY", mientras que mi IP del mundo real es "67.250.AAA.BBB"
Para cualquiera que esté interesado, para Heroku es: request.headers['x-forwarded-for']
FueledPubuling
407
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 req.headers['x-forwarded-for']. Además, x-forwarded-forno siempre se establecerá un encabezado que pueda 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, siendo la izquierda el cliente original y cada proxy sucesivo que pasó la solicitud agregando la dirección IP de donde recibió la solicitud. En este ejemplo, la solicitud pasa a través de proxy1, proxy2y, a continuación proxy3. proxy3aparece 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 casos en los x-forwarded-forque no está configurado:
var ip =(req.headers['x-forwarded-for']||'').split(',').pop().trim()||
req.connection.remoteAddress ||
req.socket.remoteAddress ||
req.connection.socket.remoteAddress
Sin embargo, ¿cómo evitar la falsificación de estos encabezados?
Domi
8
Esto generalmente funciona bien, pero por alguna razón recientemente recibí el error "No se puede leer la propiedad 'remoteAddress' de undefined" porque aparentemente todo era nulo / indefinido, incluido req.connection.socket. No estoy seguro de por qué / qué condiciones hacen que ese sea el caso, pero sería bueno verificar que req.connection.socketexista para evitar que su servidor se bloquee si esto sucede.
Matt Browne
99
Última línea req.connection.socket.remoteAddress throwing error. Se cuidadoso.
yAnTar
11
La dirección IP devuelta es :: 1. ¿Por qué?
Bagusflyer
3
Mirando la forma en que funciona pop (), parece que va a obtener el último proxy y no el cliente que es lo que desea. ¿Me equivoco?
Hará el mejor intento de 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.
"o devuelve 127.0.0.1 para indicar que no pudo determinar la dirección IP del usuario" Hay una gran diferencia entre 127.0.0.1 y desconocido ...
Nepoxx
44
Me devolvió algo extraño :ffff:(not my IP address)cuando lo probé desde Heroku. La respuesta de @ edmar-miyake está funcionando correctamente para mí.
Nilloc
Me pregunto cuál sería la IP si usara la búsqueda right2left en el caso 'x-forward-for'. var ip_info = get_ip (req, right_most_proxy = True), como en algunas configuraciones, la IP del cliente podría ser la IP más correcta.
un33k
2
Ese método está volviendo clientIp: '::1'para mí. No parece funcionar.
JamEngulfer
@JamEngulfer: ipware solo funciona si la dirección IP se transfiere correctamente a su aplicación a través de request.headers []. ejemplo: AWS LBS envía la dirección IP en 'x-forwards-for' mientras que NginX personalizado puede usar otras variables. ipware hace el mejor intento de averiguar la dirección IP, pero solo si la IP se ha transmitido en los encabezados.
un33k
19
Puede usar request-ip , para recuperar la dirección IP de un usuario. Maneja algunos de los diferentes casos límite, algunos de los cuales se mencionan en las otras respuestas.
Divulgación: creé este módulo
Instalar en pc:
npm install request-ip
En su aplicación:
var requestIp = require('request-ip');// inside middleware handlervar ipMiddleware =function(req, res, next){var clientIp = requestIp.getClientIp(req);// on localhost > 127.0.0.1
next();};
comprobando el código fuente del paquete request-ip en github.com/pbojinov/request-ip/blob/master/index.js comprueba x-reenviado-y todo tipo de otros encabezados para equilibradores de carga populares como AWS ELB, Cloudflare , Akamai, nginx, Rackspace LB y Riverbed's Stingray
Giorgio
1
Vuelve nullpor mí.
S.M_Emamian
Lo mismo en lugar de usarrequest.headers['x-forwarded-for']
Si el x-forwarded-forencabezado está allí, úselo; de lo contrario, use la .remoteAddresspropiedad
El x-forwarded-forencabezado se agrega a las solicitudes que pasan a través de equilibradores de carga (u otros tipos de proxy) configurados para HTTP o HTTPS (también es posible agregar este encabezado a las solicitudes cuando se equilibra a nivel TCP utilizando el protocolo proxy ). Esto se debe a que la request.connection.remoteAddresspropiedad 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, verifica la existencia de un x-forwarded-forencabezado y lo usa si existe, de lo contrario, use el request.connection.remoteAddress.
La siguiente función tiene todos los casos cubiertos ayudará
var ip;if(req.headers['x-forwarded-for']){
ip = req.headers['x-forwarded-for'].split(",")[0];}elseif(req.connection && req.connection.remoteAddress){
ip = req.connection.remoteAddress;}else{
ip = req.ip;}console.log("client IP is *********************"+ ip);
Si está utilizando la versión express 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-forwards-for y coloque la última ip en la cadena que no haya configurado como proxy de confianza en la propiedad ip en el objeto req.
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;}
Tiene razón, si desea la ip como cadena, puede reemplazar la última línea con: ip = ip.split (':'). Slice (-1) [0]
Ahmad Agbaryah
Se desaconsejan las respuestas de solo código. ¿Puede explicar cómo esta respuesta es mejor que el más viejo, mejor explicado, y (mucho) más upvoted respuestas ?
Dan Dascalescu
5
Advertencia:
No utilice esto ciegamente para limitar la velocidad importante:
let ip = request.headers['x-forwarded-for'].split(',')[0];
La respuesta más común hace manejar esto pop()ing de la matriz, lo que es más general que conseguir el elemento en el índice 1, que puede ser engañado por curl --header "X-Forwarded-For: 1.2.3.4, 5.6.7.8" "https://example.com".
Dan Dascalescu
3
Si obtienes múltiples IP, esto funciona para mí:
var ipaddress =(req.headers['x-forwarded-for']||
req.connection.remoteAddress ||
req.socket.remoteAddress ||
req.connection.socket.remoteAddress).split(",")[0];
Me doy cuenta de que esto ha sido respondido a muerte, pero aquí hay una versión moderna de ES6 que escribí que sigue los estándares de base de airbnb.
El encabezado X-Fordered-For puede contener una lista de IP proxy separadas por comas. El pedido es cliente, proxy1, proxy2, ..., proxyN. En el mundo real, las personas implementan proxies que pueden suministrar lo que quieran en este encabezado. Si está detrás de un equilibrador de carga o algo así, al menos puede confiar en que la primera IP de la lista es, al menos, cualquier proxy que haya recibido alguna solicitud.
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;}
este no es un buen método, ya que ipv6 NO es solo de 7 dígitos + IPv4, sino que puede ser totalmente diferente.
Radek
@Radek si valida el inicio de la dirección, se ajusta a las especificaciones (ver en.wikipedia.org/wiki/IPv6_address ctrl-f buscar "IPv4-mapped") ip= (ip.length<15?ip:(ip.substr(0,7)==='::ffff:'?ip.substr(7):undefined))reemplazaría el if ... en el código anterior
no sincronizado
Personalmente envuelvo getClientIp () de npm request-ip para crear function getClientIp4(req){ var ip=typeof req==='string'?req:getClientIp(req); return (ip.length<15?ip:(ip.substr(0,7)==='::ffff:'?ip.substr(7):undefined)); }que acepte una ip obtenida previamente o un objeto de solicitud como entrada y, como resultado
req.ip
source - expressjs.com/en/api.html#req.iplocalhost
, como lo hice yo, el resultado de todas las respuestas a continuación (casi todas las respuestas funciona) podría llegar::1
. Esto me confundió por algún tiempo. Más tarde descubrí que::1
es una dirección IP real y unaIPV6
notación para localhost.Hope this helps someone
Respuestas:
En su
request
objeto hay una propiedad llamadaconnection
, que es unnet.Socket
objeto. El objeto net.Socket tiene una propiedadremoteAddress
, por lo tanto, debería poder obtener la IP con esta llamada:Ver documentación para http y net
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, es
request.headers['x-forwarded-for']
fuente
request.headers['x-forwarded-for']
Tenga en cuenta que a veces puede obtener más de una dirección IP
req.headers['x-forwarded-for']
. Además,x-forwarded-for
no siempre se establecerá un encabezado que pueda 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, siendo la izquierda el cliente original y cada proxy sucesivo que pasó la solicitud agregando la dirección IP de donde recibió la solicitud. En este ejemplo, la solicitud pasa a través de
proxy1
,proxy2
y, a continuaciónproxy3
.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 casos en los
x-forwarded-for
que no está configurado:fuente
req.connection.socket
. No estoy seguro de por qué / qué condiciones hacen que ese sea el caso, pero sería bueno verificar quereq.connection.socket
exista para evitar que su servidor se bloquee si esto sucede.Si usa express ...
req.ip
Estaba buscando esto y luego pensé, espero, estoy usando express. Duh
fuente
Puede permanecer SECO y simplemente usar node-ipware que sea compatible con IPv4 e IPv6 .
Instalar en pc:
En su app.js o middleware:
Hará el mejor intento de obtener la dirección IP del usuario o regresará
127.0.0.1
para indicar que no pudo determinar la dirección IP del usuario. Eche un vistazo al archivo README para ver las opciones avanzadas.fuente
:ffff:(not my IP address)
cuando lo probé desde Heroku. La respuesta de @ edmar-miyake está funcionando correctamente para mí.clientIp: '::1'
para mí. No parece funcionar.Puede usar request-ip , para recuperar la dirección IP de un usuario. Maneja algunos de los diferentes casos límite, algunos de los cuales se mencionan en las otras respuestas.
Divulgación: creé este módulo
Instalar en pc:
En su aplicación:
Espero que esto ayude
fuente
null
por mí.request.headers['x-forwarded-for']
request.headers['x-forwarded-for'] || request.connection.remoteAddress
Si el
x-forwarded-for
encabezado está allí, úselo; de lo contrario, use la.remoteAddress
propiedadEl
x-forwarded-for
encabezado se agrega a las solicitudes que pasan a través de equilibradores de carga (u otros tipos de proxy) configurados para HTTP o HTTPS (también es posible agregar este encabezado a las solicitudes cuando se equilibra a nivel TCP utilizando el protocolo proxy ). Esto se debe a que larequest.connection.remoteAddress
propiedad 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, verifica la existencia de unx-forwarded-for
encabezado y lo usa si existe, de lo contrario, use elrequest.connection.remoteAddress
.fuente
La siguiente función tiene todos los casos cubiertos ayudará
fuente
,
intermedio para mí.Hay dos formas de obtener la dirección IP:
let ip = req.ip
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, todas las direcciones IP lo serán
127.0.0.1
.Entonces, la mejor solución para obtener la dirección IP del usuario es: -
fuente
Si está utilizando la versión express 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-forwards-for y coloque la última ip en la cadena que no haya configurado como proxy de confianza en la propiedad ip en el objeto req.
fuente
fuente
Advertencia:
No utilice esto ciegamente para limitar la velocidad importante:
Es muy fácil falsificar:
En ese caso, la dirección IP real del usuario será:
Me sorprende que ninguna otra respuesta haya mencionado esto.
fuente
pop()
ing de la matriz, lo que es más general que conseguir el elemento en el índice 1, que puede ser engañado porcurl --header "X-Forwarded-For: 1.2.3.4, 5.6.7.8" "https://example.com"
.Si obtienes múltiples IP, esto funciona para mí:
fuente
Simple obtener ip remota en nodejs:
fuente
En el nodo 10.14, detrás de nginx, puede recuperar la ip solicitándola a través del encabezado nginx de esta manera:
Luego en tu app.js:
Después de eso, donde quiera que aparezca:
fuente
Me doy cuenta de que esto ha sido respondido a muerte, pero aquí hay una versión moderna de ES6 que escribí que sigue los estándares de base de airbnb.
El encabezado X-Fordered-For puede contener una lista de IP proxy separadas por comas. El pedido es cliente, proxy1, proxy2, ..., proxyN. En el mundo real, las personas implementan proxies que pueden suministrar lo que quieran en este encabezado. Si está detrás de un equilibrador de carga o algo así, al menos puede confiar en que la primera IP de la lista es, al menos, cualquier proxy que haya recibido alguna solicitud.
fuente
Si está utilizando Graphql-Yoga, puede utilizar la siguiente función:
fuente
Estoy usando express detrás de nginx y
hizo el truco para mí
fuente
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.
fuente
ip= (ip.length<15?ip:(ip.substr(0,7)==='::ffff:'?ip.substr(7):undefined))
reemplazaría el if ... en el código anteriorfunction getClientIp4(req){ var ip=typeof req==='string'?req:getClientIp(req); return (ip.length<15?ip:(ip.substr(0,7)==='::ffff:'?ip.substr(7):undefined)); }
que acepte una ip obtenida previamente o un objeto de solicitud como entrada y, como resultado