Как определить IP-адрес пользователя в узел

Как я могу определить IP-адрес данного запроса от контроллера? Например (в экспресс):

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

14 ответов


в своем request object существует свойство с именем connection, который является net.Socket "объект". Сеть.Объект Socket имеет свойство remoteAddress, поэтому вы должны иметь возможность получить IP с этим вызовом:

request.connection.remoteAddress

см. документацию для адресу http и net

редактировать

как указывает @juand в комментариях, правильный метод для получения удаленного IP-адреса, если сервер находится за прокси-сервером, является 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);

обратите внимание, что иногда вы можете получить более одного IP-адреса в req.headers['x-forwarded-for']. Кроме того,x-forwarded-for заголовок не всегда будет установлен, который может вызвать ошибку.

общий формат поля:

x-forwarded-for: client, proxy1, proxy2, proxy3

где значение представляет собой список IP-адресов, разделенных запятыми+пробелами, самый левый из которых является исходным клиентом, и каждый последующий прокси, который передал запрос, добавив IP-адрес, где он получил просьба от. В этом примере, запрос прошел через proxy1, proxy2, а потом proxy3. proxy3 отображается как удаленный адрес запроса.

это предложение Arnav Гупти и Мартин предложил ниже в комментариях в случаях, когда x-forwarded-for не установлено :

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

вы можете остановиться!--4-->сухой и просто использовать узел-ipware, который поддерживает как адрес IPv4 и протокол IPv6.

установка:

npm install ipware

в вашем приложении.js или промежуточное ПО:

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();
});

это сделает лучшую попытку получить IP-адрес пользователя или возвращает 127.0.0.1, чтобы указать, что он не может определить IP-адрес пользователя. Взгляните на README файл для дополнительных опций.


при использовании express...

req.ip

Я искал это, тогда я был как ждать, я использую express. Да.


можно использовать запрос-ip, чтобы получить IP-адрес пользователя. Он обрабатывает довольно много различных случаев edge, некоторые из которых упоминаются в других ответах.

раскрытие: я создал этот модуль

установка:

npm install request-ip

приложения:

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();
};

надеюсь, что это помогает


следующая функция имеет все случаи, охватываемые поможет

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

если x-forwarded-for заголовок есть, то используйте это, иначе используйте .remoteAddress собственность.

на x-forwarded-for заголовок добавляется к запросам, которые проходят через балансировщики нагрузки (или другие типы прокси), настроенные для адресу http или HTTPS (также можно добавить этот заголовок в запросы при балансировке на TCP уровень с помощью прокси-протокол). Это потому что request.connection.remoteAddress свойство будет содержать частный ip-адрес балансировщика нагрузки, а не общедоступный ip-адрес клиента. Используя или заявление, в порядке выше, вы проверяете наличие x-forwarded-for заголовок и использовать его, если он существует, в противном случае использовать request.connection.remoteAddress.


Если вы используете express версии 3.x или больше, вы можете использовать параметр прокси-сервера доверия (http://expressjs.com/api.html#trust.proxy.options.table) и он будет ходить по цепочке адресов в заголовке X-forwarded-for и помещать последний ip-адрес в цепочку, которую вы не настроили в качестве доверенного прокси-сервера, в IP-свойство объекта 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;
}

есть два способа получить IP-адрес :

  1. let ip = req.ip

  2. let ip = req.connection.remoteAddress;

но есть проблема с выше подхода.

если вы используете приложение за Nginx или любой прокси, каждый IP-адрес будет 127.0.0.1.

Итак, лучшее решение для получения ip-адреса пользователя: -

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

просто получить удаленный ip в nodejs:

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

Если вы получаете несколько IPs, это работает для меня:

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

Я понимаю, что на это ответили до смерти, но вот современная версия ES6, которую я написал, которая следует стандартам Airbnb-base eslint.

const getIpAddressFromRequest = (request) => {
  let ipAddr = request.connection.remoteAddress;

  if (request.headers && request.headers['x-forwarded-for']) {
    [ipAddr] = request.headers['x-forwarded-for'].split(',');
  }

  return ipAddr;
};

заголовок X-Forwarded-For может содержать разделенный запятыми список IP-адресов прокси. Заказ-клиент,proxy1,proxy2,...,proxyN. В реальном мире люди реализуют прокси, которые могут предоставить все, что они хотят в этом заголовке. Если вы находитесь за балансировщиком нагрузки или чем-то еще, вы можете по крайней мере доверять первому IP-адресу в списке, по крайней мере, независимо прокси какой-то запрос пришел.


была та же проблема...im также новый в javascript, но я решил это с req.соединение.remoteAddress; это дало мне IP-адрес (но в формате ipv6:: ffff.192.168.0.101 ), а потом .ломтик удалить 7 первых цифр.

var ip = req.connection.remoteAddress;

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