Удаленный IP-адрес с node -js за Amazon ELB

У меня есть приложение node на амазонной машине экземпляра-хранилища за балансиром эластичной нагрузки (elb). Однако удаленный IP-адрес, похоже, всегда будет таким же. Я использовал этот код для получения IP-адреса клиента в node (через connect/express):

req.socket.remoteAddress

Я ничего не получил от документации node. Любой намек?

Ответ 1

Здесь решение , если вы используете экспресс:
Согласно документации, вы можете включить trust proxy для вашего экспресс-экземпляра, а затем req.ip будет заполнен правильным IP-адресом.

Включив настройку "доверенный прокси" с помощью app.enable( "доверенный прокси" ) Экспресс будет знать, что он сидит за доверенным лицом и что поля заголовка X-Forwarded- * могут быть доверенными, что в противном случае может быть легко подделать.

Включение этого параметра имеет несколько тонких эффектов. Первый из которых что X-Forwarded-Proto может быть установлен обратным прокси-сервером, чтобы сообщить что это https или просто http. Это значение отражается req.protocol.

Второе изменение - это значения req.ip и req.ips. заполненный списком адресов X-Forwarded-For.

Вот пример:

var app = express();
app.enable('trust proxy');
// ...

app.use(function(req, res, next) {
  console.log('client ip address:', req.ip);
  return next();
});

Ответ 2

Ответ работал у меня, спасибо. Но вы можете просто попробовать:

var ip_address = null;
if(req.headers['x-forwarded-for']){
    ip_address = req.headers['x-forwarded-for'];
}
else {
    ip_address = req.connection.remoteAddress;
}
sys.puts( ip_address );

Ответ 3

Получив IP-адрес экземпляра ELB, вам нужно получить значение x-forwarded-from из заголовков. Поскольку я не гуру node.js, я нашел этот код на http://forum.webfaction.com/viewtopic.php?id=4500

Пример:

var http = require( 'http' ),
sys = require( 'sys' );

http.createServer(
        function( req, res ) {
                        var ip_address = null;
                        try {
                                ip_address = req.headers['x-forwarded-for'];
                        }
                        catch ( error ) {
                                ip_address = req.connection.remoteAddress;
                        }
                        sys.puts( ip_address );
        }
);