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

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

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

Ответ 1

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

request.connection.remoteAddress

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

ИЗМЕНИТЬ

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

Ответ 2

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 отображается как удаленный адрес запроса.

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

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

Ответ 3

Если используется экспресс...

req.ip

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

Ответ 4

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

Установка:

npm install ipware

В вашем приложении app.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 для расширенных параметров.

Ответ 5

Вы можете использовать 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();
};

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

Ответ 6

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

В соответствии с этой функцией все рассмотренные случаи помогут

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

Ответ 8

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

Ответ 9

Есть два способа получить 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;

Ответ 10

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

Ответ 11

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

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

Ответ 12

Простой доступ к удаленному ip в nodejs:

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

Ответ 13

Я понимаю, что на это ответили до смерти, но здесь я написал современную версию ES6, которая соответствует стандартам esbint на базе airbnb.

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-адресу в списке, по крайней мере, любому прокси-серверу, через который поступил какой-либо запрос.

Ответ 14

В узле 10.14 позади nginx вы можете получить ip, запросив его через заголовок nginx, например:

proxy_set_header X-Real-IP $remote_addr;

Тогда в вашем app.js:

app.set('trust proxy', true);

После этого везде, где вы хотите, чтобы оно появилось:

var userIp = req.header('X-Real-IP') || req.connection.remoteAddress;

Ответ 15

Предупреждение:

Не просто слепо используйте это для важного ограничения скорости:

let ip = request.headers['x-forwarded-for'].split(',')[0];

Это очень легко подделать:

curl --header "X-Forwarded-For: 1.2.3.4" "https://example.com"

В этом случае реальный IP-адрес пользователя будет:

let ip = request.headers['x-forwarded-for'].split(',')[1];

Я удивлен, что никакие другие ответы не упомянули это.

Ответ 16

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

var ip = req.connection.remoteAddress;

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