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

Joh*_*sen 10 ip amazon node.js

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

req.socket.remoteAddress
Run Code Online (Sandbox Code Playgroud)

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

Mic*_*ael 8

这是一个解决方案,以防您使用express:
根据文档,您可以启用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();
});
Run Code Online (Sandbox Code Playgroud)

  • express 4改变了如何处理[`trust proxy`](http://expressjs.com/api.html#trust.proxy.options.table)选项的方式,所以你可以使用像`app.set(')这样的东西.信任代理',1)`只信任你的负载均衡器 (2认同)

Mar*_*lli 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 );
Run Code Online (Sandbox Code Playgroud)

  • var ip = req.headers ['x-forwarded-for'] || req.connection.remoteAddress; (2认同)

joe*_*3ch 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 );
        }
);
Run Code Online (Sandbox Code Playgroud)

  • 如果`req.headers ['x-forwarded-for']'不存在,则不是错误.`ip_address`只是'undefined`.`ip_address = req.headers ['x-forwarded-for'] || req.connection.remoteAddress`;`将完成这项工作 (6认同)