Как определить IP-адрес пользователя в узле - PullRequest
297 голосов
/ 13 ноября 2011

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

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

Ответы [ 16 ]

398 голосов
/ 13 ноября 2011

В вашем request объекте есть свойство с именем connection, которое является net.Socket объектом.Объект net.Socket имеет свойство remoteAddress, поэтому вы можете получить IP с помощью этого вызова:

request.connection.remoteAddress

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

РЕДАКТИРОВАТЬ

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

359 голосов
/ 22 октября 2013
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-переадресовано для: client, proxy1, proxy2, proxy3

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

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

var ip = (req.headers['x-forwarded-for'] || '').split(',').pop() || 
         req.connection.remoteAddress || 
         req.socket.remoteAddress || 
         req.connection.socket.remoteAddress
50 голосов
/ 12 марта 2017

При использовании экспресс ...

req.ip

Я искал это тогда, я был как ожидание, я использую экспресс. Duh.

29 голосов
/ 11 октября 2014

Вы можете остаться DRY и просто использовать node-ipware , который поддерживает IPv4 и IPv6 .

Установить:

npm install ipware

В вашем app.js или 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();
});

Это сделаетЛучшая попытка получить IP-адрес пользователя или вернуть 127.0.0.1, чтобы указать, что он не может определить IP-адрес пользователя.Посмотрите файл README для расширенных параметров.

19 голосов
/ 09 июня 2015

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

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

Установка:

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

Надеюсь, это поможет

12 голосов
/ 08 июня 2016

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

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);
12 голосов
/ 03 августа 2015

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

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

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

7 голосов
/ 22 марта 2018

Существует два способа получить 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;
7 голосов
/ 07 февраля 2017

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;
}
6 голосов
/ 10 февраля 2015

Если вы используете экспресс-версию 3.x или выше, вы можете использовать настройку доверенного прокси (http://expressjs.com/api.html#trust.proxy.options.table)), и она будет проходить цепочку адресов в заголовке x-forwarded-for и помещать последнюю версию ip в цепочке, которую вы не настроили в качестве доверенного прокси-сервера в свойстве ip объекта req.

...