使用 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 令牌?

如何使用 JSON 格式将 lambda 请求 ID 记录到 AWS CloudWatch Api 网关日志组中?

AWS Lambda + 网关 API + React JS