使用 AWS api 网关 + lambda + Nodejs 的私有和公共 ip
Posted
技术标签:
【中文标题】使用 AWS api 网关 + lambda + Nodejs 的私有和公共 ip【英文标题】:private and public ip using AWS api gateway + lambda + Nodejs 【发布时间】:2019-05-11 01:58:21 【问题描述】:我正在尝试在 AWS 环境中获取用户的私有 IP 和公共 IP。基于这个答案 (https://***.com/a/46021715/4283738) 应该有一个标题 X-Forwarded-For ,分隔的 ips 以及来自论坛 (https://forums.aws.amazon.com/thread.jspa?threadID=200198)
但是当我通过 API Gateway + lambda + nodejs v8 部署我的 api 时。我已经为用于调试的 nodejs 处理程序函数参数 (https://y0gh8upq9d.execute-api.ap-south-1.amazonaws.com/prod) 排除了事件和上下文变量的 JSON 我没有得到私有 ips。
lambda 函数是
const AWS = require('aws-sdk');
exports.handler = function(event, context, callback)
callback(null,
"statusCode": 200,
"body": JSON.stringify(event,context)
);
API 网关详细信息
GET - 集成请求
集成类型——Lambda函数
使用 Lambda 代理集成 -- 是的
函数API:https://y0gh8upq9d.execute-api.ap-south-1.amazonaws.com/prod
【问题讨论】:
【参考方案1】:Case-1 : 出于安全原因无法获取用户的私有IP(如果由用户配置,则通过NAT或PAT(屏幕后面的网络地址转换或端口地址转换)完成。NAT将添加这个 ip 在他的表中,并使用公共 id 提前发送请求,或者可以说 router-id)。
案例 2:如果这里您的私有 IP 是指多个用户使用同一个公共网络(WIFI 等)。然后你可以再次定义两个 IP,一个是公共的,对所有人来说都是通用的,但是在公共网络内部,它们还有另一个在公共网络内部唯一的 ip。
例如:假设有公共IP(1.1.1.1)的WIFI。它有两个用户 A 和 B。值得注意的是,由于他们共享同一个 WIFI,所以路由器将只有一个 IP(公共和公共),但在这个路由器内部,A 和 B 将有不同的 IP,例如 192.1.1.1 和192.1.1.2,可以称为私有。
在这两种情况下,您都只会获得公共 IP(在 X-Forwarded-For 标头中的位置 0)。
您可以在里面获取 X-Forwarded-For 标头 event.headers.multiValueHeaders.
如果您可以同时访问两者,那么拥有私有和公共 ip 有什么好处?
要访问 AWS VPC 私有子网,您还必须使用 NAT,出于安全原因,客户端永远不会知道实际 IP。我要求您再次重新审核您的要求。
【讨论】:
【参考方案2】:不知道是什么让你卡在这里,如果我错了,请纠正我。 来自Wiki:
X-Forwarded-For (XFF) HTTP 标头字段是识别通过 HTTP 代理或负载平衡器连接到 Web 服务器的客户端的原始 IP 地址的常用方法。
我在标题中设置了 X-Forwarded-For 并使用 Postman 进行测试: https://imgur.com/a/8QZEdyH
【讨论】:
这是您手动设置的。我需要的客户端 ip 大多像 192.168.0.100 这样不是你的本地主机 ip 或任何其他手动设置我想跟踪计算机的局域网 ip。基于这篇文章forums.aws.amazon.com/thread.jspa?threadID=200198【参考方案3】:“X-Forwarded-For”标头显示用户的公共 ip。
这就是你所得到的。
内部 IP 不可见。
只有标头中指明的“公共 ip”。
【讨论】:
以上是关于使用 AWS api 网关 + lambda + Nodejs 的私有和公共 ip的主要内容,如果未能解决你的问题,请参考以下文章
AWS Lambda、API 网关和 Cognito:如何在 lambda 函数中获取身份对象?
如何将AWS API网关阶段指向特定的lambda函数别名?
使用 AWS api 网关 + lambda + Nodejs 的私有和公共 ip
我是不是需要在 Lambda 和 API 网关中验证 AWS Cognito 令牌?