如何从部署在 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?的主要内容,如果未能解决你的问题,请参考以下文章
如何从部署在 AWS Elastic beanstalk 上的 node.js express 应用程序获取客户端 IP?
如何在 Windows Server 上的 Elastic Beanstalk 部署中正确使用 AWS Secrets Manager
如何使用 AWS Elastic Beanstalk 部署 Node/Express 服务器
将映像从 aws ecr 部署到 aws elastic beanstalk