![如何在 GCP 中根据 IP 地址获取区域](https://linux22.com/image/746393/%E5%A6%82%E4%BD%95%E5%9C%A8%20GCP%20%E4%B8%AD%E6%A0%B9%E6%8D%AE%20IP%20%E5%9C%B0%E5%9D%80%E8%8E%B7%E5%8F%96%E5%8C%BA%E5%9F%9F.png)
我已经创建并停止了几个 GCP 实例来收集网络延迟和带宽统计数据。我有它们的公共 IP 地址,但由于笔记本电脑崩溃,我丢失了映射文件。有没有办法将 IP 地址映射到 GCP 中的区域?
向日本地区说 35.243.94.242。
答案1
您可以根据区域保留公共 IP - 前往保留静态地址
更多信息 -https://cloud.google.com/compute/docs/ip-addresses/reserve-static-external-ip-address
答案2
如果您使用了 VM 的默认设置并且只是更改了区域,则无法通过 IP 区分 GCP 区域。
Google 有许多可用的 IP 范围块,但这些 IP 被分配到许多区域。有大量的 GCP 文档,但它只是给你一些线索。 StackOverflow 上也讨论了类似的案例。
有一种方法可以确定这些 IP 范围确实如此,但它们并没有以任何方式“映射”到区域。
如果您尝试对 IP 进行地理定位 - 您(在大多数情况下)最终会找到“加利福尼亚州山景城”(因为它们归 Google 所有)。
你也无法traceroute
准确找出这些 IP 的位置,因为Google 的安全策略 - 他们通过增加数据包离开虚拟机时的 TTL 时间来掩盖结果。
使用 traceroute 甚至无法让您知道数据包将要到达哪个大陆。我尝试过 traceroute 我的虚拟机(在 4 个不同的区域中),结果非常奇怪,除了最后部分路由被 Google 掩盖了。
如果你没有花一整天时间研究延迟时间,只需再次进行实验。这样你就能确保你做对了。
答案3
如果通过 HTTP 访问 VM 实例,则下面的方法可以起作用。
早在 2014 年,GCP 产品经理 Gary Ling 就曾解释道Google 群组公共地址的处理方式:
“我们意识到这个问题,(几乎)所有 Google IP 地址都被 SWIP 化为加利福尼亚州山景城。在 Google,将 IP 块从一个位置重新映射到另一个位置并不罕见,尤其是考虑到云端 IP 地址的弹性。遗憾的是,许多外部地理 IP 服务完全依赖于 SWIP 数据库。在我们评估我们可以做些什么来帮助客户的同时,我认为您最好的选择是联系您的 API 提供商并探索他们现在可能提供的选项。”
这意味着,直到将外部 IP 配置为标准(区域)类型时,才有可能根据地址获取虚拟机实例位置。
在这种情况下,VM 实例本身绑定到区域的事实可以帮助追溯恢复丢失的绑定。
遗憾的是,与内部 IP 不同,GCP Logging 不会保存有关外部 IP 地址绑定的信息。此外,当虚拟机实例停止时,此信息会在 Compute Engine 配置中丢失。
幸运的是,这些信息可以从 Web 服务器访问日志中获得。如果您停止并启动 VM 实例,它将丢失其临时外部 IP 并获取一个新 IP。因此,您需要请求有关 VM 实例拥有的两个地址的信息。
转到日志查看器并将其切换到新版本视图:
GCP 导航菜单 => Stackdriver => 日志 => 日志查看器 => 经典 => 预览新的日志查看器
输入并运行如下查询:
timestamp>="2019-12-18T16:55:55.671Z"
"GET"
"35.246.254.65" OR "35.198.96.135"
或者使用gcloud
CloudShell 中的命令行(为方便您使用,提供了准备步骤):
$ gcloud config list
$ gcloud config set account 'account'
$ gcloud config set core/project 'project_id'
$ gcloud logging read 'timestamp>="2019-12-19" AND "GET" AND "35.246.254.65" OR "35.198.96.135"'
您将看到来自 Web 服务器访问日志(此示例中为 Apache)的日志条目,其中包含 VM 实例的外部 IP、其 ID、区域和名称,分别为值、 和textPayload
。instance_id
在下面的示例中,信息是从日志中追溯恢复的,其中提到临时外部 IP已绑定到区域中的VM 实例:zone
compute.googleapis.com/resource_name
35.246.254.65
ssh2
europe-west3
{
"textPayload": "104.132.189.65 - - [19/Dec/2019:12:36:34 +0100] "GET /icons/openlogo-75.png HTTP/1.1" 200 6040 "http://35.246.254.65/" "Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0"",
"insertId": "46bi50g2tl8r4c",
"resource": {
"type": "gce_instance",
"labels": {
"project_id": "myworks2",
"instance_id": "8445465273187245258",
"zone": "europe-west3-c"
}
},
"timestamp": "2019-12-19T11:36:35.006315576Z",
"labels": {
"compute.googleapis.com/resource_name": "ssh2"
},
"logName": "projects/myworks2/logs/apache-access",
"receiveTimestamp": "2019-12-19T11:36:36.253027441Z"
}
这适用于临时和静态外部 IP,而且重要的是,即使在 VM 被删除后,它仍然保留在 Stackdriver 日志中。
查询的输出可能非常大。您可以根据需要使用--format
或--flatten
命令行参数或任何解析脚本来处理输出。
$ gcloud logging read 'timestamp>="2019-12-19" AND "GET" AND "35.246.254.65" OR "35.198.96.135"' --format="table(labels.'compute.googleapis.com/resource_name',resource.labels.instance_id,resource.labels.zone,textPayload)"
COMPUTE.GOOGLEAPIS.COM/RESOURCE_NAME INSTANCE_ID ZONE TEXT_PAYLOAD
ssh2 8445465273187245258 europe-west3-c 104.132.189.65 - - [19/Dec/2019:12:56:56 +0100] "GET /icons/openlogo-75.png HTTP/1.1" 200 6040 "http://35.198.96.135/" "Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0"
ssh2 8445465273187245258 europe-west3-c 104.132.189.65 - - [19/Dec/2019:12:36:34 +0100] "GET /icons/openlogo-75.png HTTP/1.1" 200 6040 "http://35.246.254.65/" "Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0"
更多高级查询示例请参阅以下链接: