本教程介绍了如何创建具有多个网络接口的虚拟机 (VM) 实例,每个接口都连接到不同的虚拟私有云 (VPC) 网络。此外,本教程还提供了一个示例,介绍如何在 Linux 虚拟机上配置路由,以便您可以对 nic1
接口成功运行 ping 命令。
具有多个网络接口控制器的虚拟机称为多 NIC 虚拟机。
费用
在本文档中,您将使用 Google Cloud 的以下收费组件:
准备工作
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Compute Engine API.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Compute Engine API.
配置示例
下图显示了您在本教程中创建的 VPC 网络、子网和虚拟机,以及可用于资源名称和子网 IP 地址范围的示例值:
创建两个 VPC 网络
如需创建多 NIC 虚拟机,您要连接到的 VPC 网络必须已存在。创建两个 VPC 网络。在本教程中,每个 VPC 网络都有两个子网。
如需创建示例配置中显示的配置,请使用以下值创建网络和子网:
- 名为
network-1
的网络,其中包含以下内容:- 名为
subnet-1
的子网,其主要 IPv4 地址范围为10.10.1.0/24
。 - 名为
subnet-3
的子网,其主要 IPv4 地址范围为10.10.3.0/24
。
- 名为
名为
network-2
的网络,其中包含以下内容:- 名为
subnet-2
的子网,其主要 IPv4 地址范围为10.10.2.0/24
。 - 名为
subnet-4
的子网,其主要 IPv4 地址范围为10.10.4.0/24
。
- 名为
控制台
在 Google Cloud 控制台中,进入 VPC 网络页面。
点击创建 VPC 网络。
在名称字段中,输入 VPC 网络的名称。
为子网创建模式选择自定义。
在新子网部分中,指定以下内容:
- 为子网提供名称。
- 选择区域。 确保您创建的两个 VPC 网络至少有一个子网使用同一区域。在下一部分中创建多 NIC 虚拟机时,请使用此同一区域。示例配置对所有子网使用同一区域。
输入 IP 地址范围。这是子网的主要 IPv4 范围。
如果您选择的范围不是 RFC 1918 地址,请确认该范围与现有配置不冲突。如需了解详情,请参阅 IPv4 子网范围。
点击完成。
点击添加子网以创建第二个子网。您可以使用第二个子网从虚拟机实例网络接口的主要子网范围外部测试
ping
。在防火墙规则部分中,选择 allow-custom 规则,然后点击修改。按如下方式配置规则,以确保您可以测试从测试虚拟机到
multi-nic-vm
的连接:- 在 IPv4 范围下,选中子网的 IPv4 地址范围对应的复选框。
- 在其他 IPv4 范围下,输入
35.235.240.0/20
,以便您可以使用 SSH 连接到测试虚拟机。包含此范围允许使用 Identity-Aware Proxy (IAP) TCP 转发的 SSH 连接。如需了解详情,请参阅允许到虚拟机的入站 SSH 连接。 - 在协议和端口下,选择指定的协议和端口。
- 选择 TCP,然后输入
22, 3389
以允许 RDP 和 SSH。 - 选择其他,然后输入
icmp
以允许 ICMP。
- 选择 TCP,然后输入
点击创建。
重复上述步骤,创建第二个 VPC 网络。确保子网 IP 地址范围不会与第一个网络中的子网重叠,例如示例配置中使用的 IP 地址范围。
gcloud
使用
networks create
命令创建 VPC 网络。gcloud compute networks create NETWORK --subnet-mode=custom
请替换以下内容:
NETWORK
:VPC 网络的名称。
使用
networks subnets create
命令为您的 VPC 网络创建子网。gcloud compute networks subnets create NAME \ --network=NETWORK \ --range=RANGE \ --region=REGION
请替换以下内容:
NAME
:子网的名称。NETWORK
:VPC 网络的名称。RANGE
:IP 地址范围。这是子网的主要 IPv4 地址范围。如果您输入的范围不是 RFC 1918 地址,请确认该范围与现有配置不冲突。如需了解详情,请参阅 IPv4 子网范围。
REGION
:区域。确保您创建的两个 VPC 网络至少有一个子网使用同一区域。在下一部分中创建多 NIC 虚拟机时,请使用此同一区域。示例配置对所有子网使用同一区域。
重复执行上一步,以创建另一个子网。您可以使用第二个子网从虚拟机实例网络接口的主要子网范围外部测试
ping
。创建防火墙规则以允许 SSH、RDP 和 ICMP:
gcloud compute firewall-rules create allow-ssh-rdp-icmp \ --network NETWORK \ --action=ALLOW \ --direction=INGRESS \ --rules=tcp:22,tcp:3389,icmp \ --source-ranges=SOURCE_RANGE
请替换以下内容:
NETWORK
:输入与您要创建的网络对应的值:- 对于第一个网络,请输入
network-1
。 - 对第二个网络重复本部分中的步骤时,请输入
network-2
。
- 对于第一个网络,请输入
SOURCE_RANGE
:输入与您要创建的网络对应的值:- 对于第一个网络,请输入
10.10.3.0/24, 35.235.240.0/20
。 若包含10.10.3.0/24
,则可确保您能够测试从test-vm-1
到multi-nic-vm
的nic0
接口的连接性。若包含35.235.240.0/20
,则允许使用 Identity-Aware Proxy (IAP) TCP 转发的 SSH 连接。如需了解详情,请参阅允许到虚拟机的入站 SSH 连接。 - 对第二个网络重复本部分中的步骤时,请输入
10.10.4.0/24, 35.235.240.0/20
。若包含10.10.4.0/24
,则可确保您能够测试从test-vm-2
到multi-nic-vm
的nic0
接口的连接性。若包含35.235.240.0/20
,则允许使用 Identity-Aware Proxy (IAP) TCP 转发的 SSH 连接。如需了解详情,请参阅允许到虚拟机的入站 SSH 连接。
- 对于第一个网络,请输入
重复上述步骤,创建第二个 VPC 网络。确保子网 IP 地址范围不会与第一个网络中的子网重叠,例如示例配置中使用的 IP 地址范围。
创建多 NIC 虚拟机
为您在上一部分中创建的每个 VPC 网络创建一个具有一个接口的虚拟机实例。
如需创建多 NIC 虚拟机,请执行以下操作:
控制台
在 Google Cloud 控制台中,转到创建实例页面。
在名称字段中,输入实例的名称。 这对应于示例配置中的
multi-nic-vm
。在区域字段中,选择您在每个 VPC 网络中创建了一个子网的同一区域。虚拟机实例必须与其接口所连接的子网位于同一区域。示例配置对所有子网使用同一区域。
在可用区字段中,选择一个可用区。
在高级选项部分,展开网络,然后执行以下操作:
- 查看网络接口部分。Google Cloud 会自动为第一个网络接口填充网络和子网。这对应于示例配置中的
network-1
和subnet-1
。 - 在主要内部 IPv4 地址字段中,选择以下选项之一:
- 临时,可分配新的临时 IPv4 地址
- 列表中的预留静态内部 IPv4 地址
- 预留静态内部 IPv4 地址,可预留并分配新的静态内部 IPv4 地址。如果您使用的是示例配置,请预留
10.10.1.3
。
对于外部 IPv4 地址,请选择一个
None
。如需添加其他接口,请点击添加网络接口。
对于网络和子网,请选择您创建的第二个网络和子网。这对应于示例配置中的
network-2
和subnet-2
。在 IP 栈类型字段中,选择 IPv4(单栈)。
在主要内部 IPv4 地址字段中,选择以下选项之一:
- 临时,可分配新的临时 IPv4 地址
- 列表中的预留静态内部 IPv4 地址
- 预留静态内部 IPv4 地址,可预留并分配新的静态内部 IPv4 地址。如果您使用的是示例配置,请预留
10.10.2.3
。
对于外部 IPv4 地址,请选择一个
None
。如需完成网络接口的添加,请点击完成。
- 查看网络接口部分。Google Cloud 会自动为第一个网络接口填充网络和子网。这对应于示例配置中的
点击创建。
gcloud
如需在新实例上创建网络接口,请使用 instances create
命令。
为每个接口添加 --network-interface
标志,后接任意合适的网络密钥,例如 network
、subnet
、private-network-ip
。对于外部 IP 地址,以下命令指定了 no-address
。
gcloud compute instances create INSTANCE_NAME \ --zone ZONE \ --network-interface \ network=NIC0_NETWORK,subnet=NIC0_SUBNET,private-network-ip=NIC0_INTERNAL_IPV4_ADDRESS,no-address \ --network-interface \ network=NIC1_NETWORK,subnet=NIC1_SUBNET,private-network-ip=NIC1_INTERNAL_IPV4_ADDRESS,no-address
请替换以下内容:
创建两个测试虚拟机
再创建两个虚拟机实例:
- 一个与您创建的多 NIC 虚拟机的
nic0
接口位于同一网络(不同子网)中。这对应于示例配置的subnet-3
中的test-vm-1
。 - 一个与您创建的多 NIC 虚拟机的
nic1
接口位于同一网络(不同子网)中。这对应于示例配置的subnet-4
中的test-vm-2
。
您可以使用这些虚拟机实例,测试来自具有多个网络接口的虚拟机实例的主子网范围外部的子网的 ping
。
如需创建虚拟机实例,请执行以下操作:
控制台
在 Google Cloud 控制台中,转到创建实例页面。
在名称字段中,输入实例的名称。
在区域字段中,选择您在第一个 VPC 网络中放置额外子网的区域。
在可用区字段中,选择一个可用区。
在高级选项部分,展开网络,然后执行以下操作:
- 查看网络接口部分。确保子网与多 NIC 虚拟机的
nic0
接口所用的子网不同。
- 查看网络接口部分。确保子网与多 NIC 虚拟机的
点击创建。
重复上述步骤,在第二个 VPC 网络中创建一个实例,并将其放置在与多 NIC 虚拟机的
nic1
接口不同的子网中。
gcloud
运行
instances create
命令并为每个接口添加--network-interface
标志,后接任意合适的网络键,例如network
、subnet
、private-network-ip
或address
。gcloud compute instances create INSTANCE_NAME \ --zone ZONE \ --network-interface \ network=NIC0_NETWORK,subnet=NIC0_SUBNET, private-network-ip=NIC0_INTERNAL_IPV4_ADDRESS
请替换以下内容:
INSTANCE_NAME
:要创建的虚拟机实例的名称。ZONE
:实例创建所在的区域。 输入您在第一个 VPC 网络中放置额外子网(多 NIC 虚拟机未使用的子网)所在的区域。NIC0_NETWORK
:接口所连接的网络。NIC0_SUBNET
:接口所连接的子网。NIC0_INTERNAL_IPV4_ADDRESS
:您希望接口在目标子网中具有的内部 IPv4 地址。如果只希望具有分配的有效地址,请忽略。
重复上一步,在第二个 VPC 网络以及与多 NIC 虚拟机的
nic1
接口不同的子网中创建实例。
测试与多 NIC 虚拟机的连接性
按照本部分中的步骤,测试您创建的额外虚拟机实例到具有多个网络接口的虚拟机实例的每个接口的 ping
。
下表显示了在本教程的此时可以使用示例配置中的 IP 地址值成功 Ping 通的场景。
来源 | 目的地 | ping successful |
---|---|---|
与 multi-nic-vm 的 nic0 接口位于同一网络(不同子网)中的虚拟机 (test-vm-1 )。 |
multi-nic-vm 的 nic0 接口的内部 IP 地址 (10.10.1.3 ) |
|
与 multi-nic-vm 的 nic1 接口位于同一网络(不同子网)中的虚拟机 (test-vm-2 ) |
multi-nic-vm 的 nic1 接口的内部 IP 地址 (10.10.2.3 ) |
获取多 NIC 虚拟机的 IP 地址
根据需要,获取多 NIC 虚拟机的接口 IP 地址,以便您在后续部分对其执行 Ping 操作。
控制台
在 Google Cloud 控制台中,转到虚拟机实例页面。
在虚拟机实例列表中,找到您创建的多 NIC 虚拟机,并记录以下值,以便在后续步骤中对其执行 Ping 操作:
nic0
和nic1
接口的内部 IP 地址
gcloud
-
gcloud compute instances list
找到多 NIC 虚拟机,然后从输出中记录以下内容:
INTERNAL_IP
:第一个地址和第二个地址分别对应于nic0
和nic1
网络接口。
对虚拟机的 nic0
接口执行 Ping 操作
在虚拟机实例列表中,找到您在多 NIC 虚拟机的
nic0
接口所在网络(不同子网)中创建的虚拟机。- 在实例对应的行中,点击 SSH。
运行以下命令以对多 NIC 虚拟机的
nic0
接口的内部 IP 地址执行 Ping 操作:ping INTERNAL_IP_NIC0
将
INTERNAL_IP_NIC0
替换为您之前记录的相应地址。如果您使用的是示例配置,请输入10.10.1.3
。请注意,Ping 操作已成功。
运行
exit
以关闭终端窗口。
对虚拟机的 nic1
接口执行 Ping 操作
在虚拟机实例列表中,找到您在多 NIC 虚拟机的
nic1
接口所在网络(不同子网)中创建的虚拟机。- 在实例对应的行中,点击 SSH。
运行以下命令以对多 NIC 虚拟机的第二个接口的内部 IP 地址执行 Ping 操作:
ping INTERNAL_IP_NIC1
将
INTERNAL_IP_NIC1
替换为您之前记录的相应地址。如果您使用的是示例配置,请输入10.10.2.3
。请注意,Ping 失败。
运行
exit
以关闭终端窗口。
配置政策路由
上一部分中的 ping 测试因非对称路由而失败 - 流量发送到 multi-nic-vm
的 nic1
接口,但虚拟机的默认路由导致系统从 nic0
发送回复。如需了解详情,请参阅使用多个网络接口的 DHCP 行为。
按照本部分中的步骤配置政策路由,以确保出站数据包通过正确的接口离开。
本教程使用 Linux 虚拟机。Windows 操作系统不支持基于来源的政策路由。
查找虚拟机的 nic1
接口的默认网关
您可以通过查询元数据服务器来查找虚拟机实例接口的默认网关。如果您使用的是示例配置,则值为 10.10.2.1
。
如需查找 nic1
接口的 IPv4 地址的默认网关,请从多 NIC 虚拟机发出以下请求:
curl http://metadata.google.internal/computeMetadata/v1/instance/network-interfaces/1/gateway -H "Metadata-Flavor: Google"
如需查找其他网络接口的默认网关,请指定相应的接口编号。如需查找 Google Cloud 为接口分配的名称,请参阅获取多 NIC 虚拟机的 IP 地址。这与操作系统分配的接口名称不同。接口的格式为 nicNUMBER
。在向元数据服务器发出的请求中,只需输入数字即可。例如,对于 nic2
,请指定 2
。
在多 NIC 虚拟机上配置新的路由表
本部分介绍如何在多 NIC 虚拟机上配置新的路由表。
按照启用对虚拟机实例的访问权限中的步骤启用串行控制台。
为避免在更改默认路由时断开与虚拟机的连接,请连接到串行控制台。
运行
ip link list
以列出虚拟机的网络接口,然后记录nic1
接口的名称,例如ens5
。运行以下命令,确保
nic1
接口已配置 IP 地址。ip addr show NIC
将
NIC
替换为上一步使用的nic1
接口名称。如果系统尚未自动为
nic1
接口分配 IP 地址,您可以通过运行以下命令手动分配 IP 地址:sudo ip addr add IP_ADDRESS dev NIC
请替换以下内容:
IP_ADDRESS
:要在接口上配置的内部 IP 地址。这对应于示例配置中的10.10.2.3
。NIC
:上一步使用的nic1
接口名称。
为
nic1
网络接口创建自定义路由表。echo "1 ROUTE_TABLE_NAME" | sudo tee -a /etc/iproute2/rt_tables
将
ROUTE_TABLE_NAME
替换为路由表的名称,例如route-nic1
。在用于
nic1
网络接口的自定义路由表中创建默认路由,并为发送到网关的数据包创建包含来源提示的路由。sudo ip route add default via GATEWAY dev NIC table ROUTE_TABLE_NAME sudo ip route add GATEWAY src IP_ADDRESS dev NIC table ROUTE_TABLE_NAME
请替换以下内容:
创建路由规则,指示虚拟机对来源或目标与分配给
nic1
接口的主要内部 IPv4 地址匹配的数据包使用自定义路由表:sudo ip rule add from IP_ADDRESS/PREFIX_LENGTH table ROUTE_TABLE_NAME sudo ip rule add to IP_ADDRESS/PREFIX_LENGTH table ROUTE_TABLE_NAME
请替换以下内容:
IP_ADDRESS
:接口上配置的内部 IP 地址。这对应于示例配置中的10.10.2.3
。PREFIX_LENGTH
:已配置的 IP 地址的前缀长度。ROUTE_TABLE_NAME
:路由表的名称。
运行以下命令可从缓存路由表中移除所有条目。如果您使用的是具有之前配置的路由表的现有虚拟机,则可能需要执行此操作。
sudo ip route flush cache
重新测试与多 NIC 虚拟机的连接性
下表显示了在配置了政策路由后,您可以成功执行 Ping 操作的场景。重复执行 Ping 虚拟机的 nic1 接口的步骤,以确认您现在可以成功对这两个 IP 地址执行 Ping 操作。
来源 | 目的地 | ping successful |
---|---|---|
与 multi-nic-vm 的 nic0 接口位于同一网络(不同子网)中的虚拟机 (test-vm-1 )。 |
multi-nic-vm 的 nic0 接口的内部 IP 地址 (10.10.1.3 ) |
|
与 multi-nic-vm 的 nic1 接口位于同一网络(不同子网)中的虚拟机 (test-vm-2 ) |
multi-nic-vm 的 nic1 接口的内部 IP 地址 (10.10.2.3 ) |
清理
为避免因本教程中使用的资源导致您的 Google Cloud 账号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。
删除项目
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
删除各个资源
如果您不想删除整个项目,请删除为教程创建的 VPC 网络和虚拟机实例。
如需删除某个网络,您必须先删除其所有子网中的所有资源,以及引用该网络的所有资源。
删除实例
如需删除实例,请执行以下操作:
控制台
在 Google Cloud 控制台中,转到虚拟机实例页面。
选中要删除的实例。
点击删除按钮。
gcloud
使用 gcloud compute instances delete
命令。
当您以这种方式删除实例时,实例将被关停并从实例列表中移除,而且附加到该实例的所有资源会被释放,例如永久性磁盘和任何静态 IP 地址。
要删除实例,请使用以下命令:
gcloud compute instances delete example-instance [example-instance-2 example-instance-3..]
删除 VPC 网络
如需删除 VPC 网络,请执行以下操作:
控制台
在 Google Cloud 控制台中,进入 VPC 网络页面。
点击某个 VPC 网络的名称以显示其 VPC 网络详情页面。
点击删除 VPC 网络。
在显示的消息中,点击删除进行确认。
gcloud
gcloud compute networks delete NETWORK
将 NETWORK
替换为要删除的网络的名称。
后续步骤
- 阅读多个网络接口的概览。
- 阅读创建具有多个网络接口的虚拟机。