在 Python 中通过 Header 获取主机公共 IP

Posted

技术标签:

【中文标题】在 Python 中通过 Header 获取主机公共 IP【英文标题】:Get Host Public IP through Header in Python 【发布时间】:2019-10-06 13:15:57 【问题描述】:

我在 Amazon ECS 上有一个服务主机。 我的 ECS 前面还有负载均衡器和 CloudFront,下图是它们的架构:

当我的服务运行时,它需要自己的公共 IP 地址来记录。 我想在没有第三方图书馆或网站的情况下获得这些信息。我深入研究了 HTTP 标头中的字段,我在我的 chrome 中找到了这个(见下图),但我无法通过标头中的字段访问这些信息。

我的问题是:

    我可以在没有第三方库的情况下获取服务器的公共 IP 吗?

(由于以下问题,如果没有第三方库,这似乎是不可能的)

Get public/external IP address?

Discovering public IP programmatically

How can I get the public IP using python2.7?

    我可以像我在 python 中的 chrome 中看到的那样获得该字段吗?

【问题讨论】:

您想获取您的客户端 IP 吗?让我们更多地了解您的服务生态系统。你在用什么? @gd8 不,我想获取我的服务器的公共 IP。我不太确定我应该提供什么样的生态系统。但我使用 Python 和 Flask 框架编写了一个 RESTful Web 应用程序。将其 Docker 化并推送到 Amazon ECR。感谢您的提问。 “需要自己的公共 IP 地址来记录”是什么意思?您所说的“获取服务器的公共 IP”是什么意思——您指的是 ECS 实例吗?如果您的用户通过 CloudFront 访问您的服务,他们为什么需要公共 IP? @JohnRotenstein 实际上,我正在编写一个小测试应用程序。我想知道用户在发送请求时访问了哪个 IP(出于实验目的)。由于负载均衡器,他们在发送请求时会访问不同的 ECS。我只是想根据公共 IP 记录这种行为。感谢您的提问。 奇怪的要求,只是好奇你会用 CloudFront IP 地址做什么,Lambda@edge 事件结构不会记录远程/它自己的 IP 地址和 【参考方案1】:

您可以使用任何语言的几乎任何 HTTP 客户端或使用 cURL 等命令行工具读取 AWS Cloud Front 主机的远程 IP 地址。

但请记住,您在 HTTP 客户端(例如您的示例中的 Chrome)中看到的 Cloud Front 远程 IP 地址不是“您的”地址。它是离您的客户端最近的 Cloud Front 端点的 IP 地址。不要将 Cloud Front 端点 IP(不是“您的”并且可能会更改)与您的 Elastic Load Balancer IP(可以是“您的”,即为您保留)混淆。

【讨论】:

注意到了。但据我所知,我可以在架构的标头中的“X-Forwarded-For”字段中获取用户的 IP 和 CloudFront 的 IP(根据本文中的“客户端 IP 地址”部分:docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/…)。你说我在 chrome 中看到是离我的客户最近的云端,为什么我在 chrome 和“X-Forwarded-For”中得到不同的价值?还是我配置错误?感谢您的回复。

以上是关于在 Python 中通过 Header 获取主机公共 IP的主要内容,如果未能解决你的问题,请参考以下文章

Angular 中的 dom 操作(ViewChild)以及父子组件中通过 ViewChild 调用子组件的方法

在 Android 中通过改造获取对象数组

如何在 Python 中通过身份验证从 URL 获取 CSV 文件

如何在python中通过正则表达式获取dict值

如何在 Python 中通过 SFTP 检查 S_ISREG 以获取 Windows NTFS 文件?

在 Omnet++ 中通过 AP 将无线主机连接到标准主机