在amazon ELB后面有node-js的远程IP地址

时间:2011-08-21 16:00:01

标签: node.js ip amazon

我在弹性负载平衡器(elb)后面的实例存储器亚马逊机器上有一个节点应用程序。但是,远程IP地址似乎总是相同的。我使用此代码在节点中获取客户端的IP地址(通过connect / express):

req.socket.remoteAddress

我没有从节点文档中获得任何其他内容。任何提示?

3 个答案:

答案 0 :(得分:7)

答案对我有用,谢谢。但你可以试试:

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

答案 1 :(得分:7)

如果您使用快递,这是一个解决方案
根据{{​​3}},您可以为您的快速实例启用trust proxy,然后req.ip将使用正确的IP地址填充。

  

通过app.enable('trust proxy')启用“信任代理”设置,   Express会知道它位于代理服务器后面   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 :(得分:6)

您收到ELB实例的IP,并且您需要从标头中获取x-forwarded-for值。由于我不是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 );
        }
);