GCP:如何动态更改 VM 实例的公共 IP 并保持连接

Posted

技术标签:

【中文标题】GCP:如何动态更改 VM 实例的公共 IP 并保持连接【英文标题】:GCP: How to dynamically change an VM Instance's public IP and keep the connection 【发布时间】:2021-06-01 07:55:07 【问题描述】:

我们在 Compute Engine 中有许多用于抓取的 VM 实例,它们可能会在某些站点中被阻止,然后我们尝试使用 Nord*** 更改 IP。当我们检测到我们被阻止时,我们正在尝试创建一个 Python 脚本来自动更改 IP。目前,我们正在使用我们最近发现的这个 Python 包:Nord***-switcher,但我们遇到了下一个错误:

Connecting you to Denver ...
An unknown error occurred while connecting to a different server! 

An unknown error occurred while connecting to a different server! Retrying with a different server...

Traceback (most recent call last):
  File "demo.py", line 13, in <module>
    rotate_***(instructions)  # refer to the instructions variable here
  File "/home/eduardo_santos_housecallprosolut/.local/lib/python3.8/site-packages/nord***_switcher/nord***_switch.py", line 514, in rotate_***
    raise Exception("Unable to connect to a new server. Please check your internet connection.\n")
Exception: Unable to connect to a new server. Please check your internet connection.

注意:我们有互联网连接。

VM 实例也安装了 Nord***,如果我们手动尝试,我们可以更改它,但由于我们使用 SSH 连接到实例,在我们更改 IP 的那一刻,连接会丢失。

那么,目前的问题是:

    如何正确动态更改实例的IP? 更改发生后如何保持连接。

注意:爬虫和所有逻辑都是docker化的,Python版本是3.9

正如我一开始提到的,我们有很多机器用于scrape,我们希望保留每个使用的IP的注册表以便更好地分配,可能使用Redis DB o MongoDB中的小型集合.你怎么看待这件事?有什么好的方法来开发这个?

非常感谢。

【问题讨论】:

你是如何连接到你的虚拟机的?嘘,当然,但是如何?你能粘贴你执行的命令来登录你的虚拟机吗? 我使用 GCP 网站进行连接(单击连接列中的 SSH 按钮)bul 还使用 gcloud 命令(在终端或 bash 脚本中):gcloud compute ssh --project=$project_name -- zone=us-west2-a $instance_name 【参考方案1】:

我今晚在具有公共 IP 的 VM 上尝试了这个,然后我删除了公共 IP,它继续工作。这可能是解决方案!

您可以use IAP 连接到您的虚拟机。像这样在带有 gcloud 的终端中执行此操作:

gcloud compute ssh --tunnel-through-iap -project=$project_name --zone=us-west2-a $instance_name

告诉我。如果对你不起作用,我会删除答案

【讨论】:

请不要删除这个答案。我没有想到这种技术,这在其他情况下也很有用。 我试过了,但没用,根据你分享的文档,看起来它试图使用新的 IP(*** 提供的 IP)t(他 iap 工作时虚拟机没有 IP) 参数 --tunnel-through-iap 强制连接使用 IAP,即使 VM 具有公共 IP。但是,控制台无法做到这一点,只能使用 CLI。 好吧,我正在做的是:1)通过计算引擎页面中提供的 SSH 功能连接到虚拟机 2)在我的本地机器上使用您的命令连接(两件事都有效) 3)使用在浏览器中打开的外壳,我连接到 Nord***(此后我失去了两个终端的连接)我认为会发生的是使用 IAP 连接的终端将保持连接【参考方案2】:

如何正确动态更改实例的IP?

没有支持的方法。一旦 IP 地址更改,任何现有连接都将中断/失败。需要编写使用 IP 的软件来处理连接失败并尝试重新连接。这种类型的功能在手机应用程序中很常见,但在桌面/服务器世界中则较少。

Google Cloud(以及大多数云供应商)的重要一点是,您的虚拟机没有分配给网络接口的公共 IP 地址。公共 IP 地址分配给一对一 NAT 的一侧。这意味着操作系统和应用程序内的 IP 地址更改通知不会发生。

Google 提供了 CLI、SDK 和 API,可用于以编程方式更改分配给实例的 IP 地址。

更改发生后如何保持连接。

两种策略:

    添加另一个具有不变公共 IP 地址的网络接口。使用该 IP 地址连接到 VM。

    创建一个您将使用的公共 IP 地址池。使用具有跟踪连接地址更改的出色功能的 ***,例如 WireGuard。使用 VM 的私有 IP 地址通过 *** 连接,该地址在公共 IP 地址更改时不会更改。

我会使用第一种策略,因为它的复杂性和潜在问题更少。但是,一旦您了解了 WireGuard 如何管理连接并实现签名而不是 IP 地址,连接管理就会有很多可能性。

【讨论】:

以上是关于GCP:如何动态更改 VM 实例的公共 IP 并保持连接的主要内容,如果未能解决你的问题,请参考以下文章