分配两个 NIC 时无法通过 ssh 连接到实例

分配两个 NIC 时无法通过 ssh 连接到实例

我已经创建了一个具有两个 NIC 的实例:

nic0 具有共享 VPC,无公共 IP

nic1 具有默认 vpc 和公共 IP

在创建虚拟机期间我可以看到通知。

防火墙设置不适用于多个网络接口。

创建虚拟机后,我无法使用公共 IP 地址访问该机器。

我尝试使用共享 VPC,我能够从该 VPC 进行 ssh 和 ping VM。

唯一的问题是,当尝试通过公共 IP 地址访问时,我无法得到任何响应。

答案1

根据 gcloud 文档,

Compute Engine DHCP 服务器仅在虚拟机 (nic0) 的主网络接口上编程默认路由。如果我们想使用外部 IP 连接到辅助接口,我们必须通过串行控制台在该网络接口上设置默认路由。

如果您想使用分配给 nic1 的公共 IP 通过 ssh 进入机器,则必须更改默认监听接口(默认为 nic0)。

  1. 使用串行控制台 ssh 进入机器

gcloud compute --project=your_project connect-to-serial-port vm_name --zone=your_zone

  1. 删除默认接口

ip route del default

  1. 添加新接口作为默认接口

ip route add default required_ip dev required_interface

您将通过使用跳转服务器通过 ssh 进入虚拟机并运行命令来找到您required ip的。required interfaceip route

重要的:仅使用串行控制台而不是任何跳转服务器来更改默认路由,因为如果您通过跳转服务器执行此操作,则一旦删除默认接口,您将失去与机器的连接。

如果串行控制台中的 ssh 要求输入用户名和密码,而您尚未设置,则需要使用跳转服务器 ssh 进入虚拟机,运行sudo passwd $USER,完成该过程,然后尝试上述方法通过 nic1 进行 ssh。

跳转服务器是指与我的私有机器(没有任何外部 IP)位于同一网络中的机器,这样我们首先可以 ssh 进入跳转服务器,然后从那里 ssh(跳转)进入私有虚拟机。

我知道答案有点晚了但如果你仍然需要任何帮助,请将其评论出来。

答案2

当我重现您的配置时,我得到了相同的行为。

如果我恢复 nics 配置,我可以通过公共 IP 访问实例。
我将 nic0 设置为具有公共 IP 的默认 VPC,将 nic1 设置为没有公共 IP 的共享 VPC。

如果希望在辅助接口上连接到外部 IP,则需要添加路由。Google 云平台上有说明文档

还有这个文档是您的案例研究的重要信息来源。希望这对您有所帮助。

答案3

如果您可以通过第一个 IP 连接,但不能通过第二个 IP 连接,则显然您没有更改虚拟机上的路由表以使其正常工作。我不能说它有明确的记录。这在故障排除部分这里

一种方法是向虚拟机添加以下启动脚本:

instance=http://metadata.google.internal/computeMetadata/v1/instance
get() { curl -sS "$instance/network-interfaces/1/$1" \
             -H 'Metadata-Flavor: Google'; }
ip=`get ip`
gw=`get gateway`
ip route add default via "$gw" table 1
ip rule add from "$ip" table 1

这样,源 IP 等于第二个 IP 的数据包将转到第二个网关(而不是第一个网关,默认情况下是第一个网关)。为此,我为此类数据包创建了一条规则,以使用路由表 1,其中我将第二个默认路由添加到第二个网关。

他们还建议创建一个“到”规则和第二个网关的路由,但这似乎没有必要。

terraform可以找到一个演示此内容的项目这里

相关内容