如何从部署在 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 beanstalk 和 ngnix 代理服务器。我的应用程序代码在 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?的主要内容,如果未能解决你的问题,请参考以下文章