如何从部署在 AWS Elastic beanstalk 上的 node.js express 应用程序获取客户端 IP?

Posted

技术标签:

【中文标题】如何从部署在 AWS Elastic beanstalk 上的 node.js express 应用程序获取客户端 IP?【英文标题】:How to get client ip from node.js express application deployed on AWS Elastic beanstalk? 【发布时间】:2017-02-04 14:36:01 【问题描述】:

我正在使用 elastic beanstalkngnix 代理服务器。我的应用程序代码在 node.js express 框架上。我正在尝试通过以下代码访问客户端 ip

var ip = event.headers['x-forwarded-for'] || 
     event.connection.remoteAddress || 
     event.socket.remoteAddress ||
     event.connection.socket.remoteAddress;

但我总是为所有传入请求获得相同的客户端 IP。我认为这将是代理服务器的 IP 地址。

如何从我的应用程序中访问真实的客户地址???

【问题讨论】:

【参考方案1】:

这是来自 AWS 的指南:https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/x-forwarded-headers.html#x-forwarded-for

X-Forwarded-For 有效,但有时IP 列表在此过程中被击中。客户端 IP 应该是 Elastic Beanstalk 列表中的第一个条目

X-Forwarded-For:client-ip-address, ip-address-1, ip-address-2

【讨论】:

X-Forwarded-For 请求标头可能包含多个以逗号分隔的 IP 地址。最左边的地址是第一次发出请求的客户端 IP。后面是任何后续代理标识符,在一个链中。(从文档中,基本上是列表中的第一个地址,而不是最后一个)【参考方案2】:

我推迟 @austence,客户端 IP 将是 Elastic Beanstalk 列表中的第一个条目。

示例

X-Forwarded-For:182.12.12.123、78.13.13.123

如果有人来寻找示例代码,这是我在项目中使用的代码。

const _ = require('lodash');
const ipAddress = _.split(req.header('X-Forwarded-For'), ',');
ipadd = _.trim(_.first(ipAddress));

【讨论】:

您是否从 AWS 中找到了关于此的任何好的文档?他们如此模棱两可,令人恼火…… @austince 这是我在 Elastic Beanstalk 实例中观察到的行为。 对我来说它也是第一个列出的,使用 nginx 运行 AWS Linux 2

以上是关于如何从部署在 AWS Elastic beanstalk 上的 node.js express 应用程序获取客户端 IP?的主要内容,如果未能解决你的问题,请参考以下文章