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 并保持连接的主要内容,如果未能解决你的问题,请参考以下文章

连接到 GCP App Engine 上的 SocketIO 服务器时如何使用域而不是公共 IP?

GCP 计算实例上的部署失败,为啥从 Gitlab 推送更改

无法通过 Visual Studio Code 远程 SSH 连接到 GCP VM

无法在 GCP 上打开 vm 实例的 ssh:无法连接到后端(代码:4003)

为啥 GCP“Memorystore for Redis”不允许添加公共 IP 的选项?

有条件地使用 terraform 配置 gcp vm 实例