为额外网络接口配置路由


本教程介绍了如何创建具有多个网络接口的虚拟机 (VM) 实例,每个接口都连接到不同的虚拟私有云 (VPC) 网络。此外,本教程还提供了一个示例,介绍如何在 Linux 虚拟机上配置路由,以便您可以对 nic1 接口成功运行 ping 命令。

具有多个网络接口控制器的虚拟机称为多 NIC 虚拟机

费用

在本文档中,您将使用 Google Cloud 的以下收费组件:

您可使用价格计算器根据您的预计使用情况来估算费用。 Google Cloud 新用户可能有资格申请免费试用

准备工作

  1. 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.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the Compute Engine API.

    Enable the API

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  6. Make sure that billing is enabled for your Google Cloud project.

  7. Enable the Compute Engine API.

    Enable the API

配置示例

下图显示了您在本教程中创建的 VPC 网络、子网和虚拟机,以及可用于资源名称和子网 IP 地址范围的示例值:

图 1. 在本教程中,您将创建两个 VPC 网络,每个网络有两个子网。所有子网都位于同一区域。此外,您还需要创建三个虚拟机:一个多 NIC 虚拟机连接到前两个子网,另外两个子网中各有 1 个虚拟机(点击可放大)。

创建两个 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

控制台

  1. 在 Google Cloud 控制台中,进入 VPC 网络页面。

    进入 VPC 网络页面

  2. 点击创建 VPC 网络

  3. 名称字段中,输入 VPC 网络的名称。

  4. 子网创建模式选择自定义

  5. 新子网部分中,指定以下内容:

    1. 为子网提供名称
    2. 选择区域。 确保您创建的两个 VPC 网络至少有一个子网使用同一区域。在下一部分中创建多 NIC 虚拟机时,请使用此同一区域。示例配置对所有子网使用同一区域。
    3. 输入 IP 地址范围。这是子网的主要 IPv4 范围

      如果您选择的范围不是 RFC 1918 地址,请确认该范围与现有配置不冲突。如需了解详情,请参阅 IPv4 子网范围

    4. 点击完成

  6. 点击添加子网以创建第二个子网。您可以使用第二个子网从虚拟机实例网络接口的主要子网范围外部测试 ping

  7. 防火墙规则部分中,选择 allow-custom 规则,然后点击修改。按如下方式配置规则,以确保您可以测试从测试虚拟机到 multi-nic-vm 的连接:

    1. IPv4 范围下,选中子网的 IPv4 地址范围对应的复选框。
    2. 其他 IPv4 范围下,输入 35.235.240.0/20,以便您可以使用 SSH 连接到测试虚拟机。包含此范围允许使用 Identity-Aware Proxy (IAP) TCP 转发的 SSH 连接。如需了解详情,请参阅允许到虚拟机的入站 SSH 连接
    3. 协议和端口下,选择指定的协议和端口
      1. 选择 TCP,然后输入 22, 3389 以允许 RDP 和 SSH。
      2. 选择其他,然后输入 icmp 以允许 ICMP。
  8. 点击创建

  9. 重复上述步骤,创建第二个 VPC 网络。确保子网 IP 地址范围不会与第一个网络中的子网重叠,例如示例配置中使用的 IP 地址范围。

gcloud

  1. 使用 networks create 命令创建 VPC 网络。

    gcloud compute networks create NETWORK --subnet-mode=custom
    

    请替换以下内容:

    • NETWORK:VPC 网络的名称。
  2. 使用 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 虚拟机时,请使用此同一区域。示例配置对所有子网使用同一区域。

  3. 重复执行上一步,以创建另一个子网。您可以使用第二个子网从虚拟机实例网络接口的主要子网范围外部测试 ping

  4. 创建防火墙规则以允许 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-1multi-nic-vmnic0 接口的连接性。若包含 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-2multi-nic-vmnic0 接口的连接性。若包含 35.235.240.0/20,则允许使用 Identity-Aware Proxy (IAP) TCP 转发的 SSH 连接。如需了解详情,请参阅允许到虚拟机的入站 SSH 连接
  5. 重复上述步骤,创建第二个 VPC 网络。确保子网 IP 地址范围不会与第一个网络中的子网重叠,例如示例配置中使用的 IP 地址范围。

创建多 NIC 虚拟机

为您在上一部分中创建的每个 VPC 网络创建一个具有一个接口的虚拟机实例。

如需创建多 NIC 虚拟机,请执行以下操作:

控制台

  1. 在 Google Cloud 控制台中,转到创建实例页面。

    转到“创建实例”

  2. 名称字段中,输入实例的名称。 这对应于示例配置中的 multi-nic-vm

  3. 区域字段中,选择您在每个 VPC 网络中创建了一个子网的同一区域。虚拟机实例必须与其接口所连接的子网位于同一区域。示例配置对所有子网使用同一区域。

  4. 可用区字段中,选择一个可用区。

  5. 高级选项部分,展开网络,然后执行以下操作:

    1. 查看网络接口部分。Google Cloud 会自动为第一个网络接口填充网络和子网。这对应于示例配置中的 network-1subnet-1
    2. 主要内部 IPv4 地址字段中,选择以下选项之一:
      • 临时,可分配新的临时 IPv4 地址
      • 列表中的预留静态内部 IPv4 地址
      • 预留静态内部 IPv4 地址,可预留并分配新的静态内部 IPv4 地址。如果您使用的是示例配置,请预留 10.10.1.3
    3. 对于外部 IPv4 地址,请选择一个 None

    4. 如需添加其他接口,请点击添加网络接口

    5. 对于网络子网,请选择您创建的第二个网络和子网。这对应于示例配置中的 network-2subnet-2

    6. IP 栈类型字段中,选择 IPv4(单栈)

    7. 主要内部 IPv4 地址字段中,选择以下选项之一:

      • 临时,可分配新的临时 IPv4 地址
      • 列表中的预留静态内部 IPv4 地址
      • 预留静态内部 IPv4 地址,可预留并分配新的静态内部 IPv4 地址。如果您使用的是示例配置,请预留 10.10.2.3
    8. 对于外部 IPv4 地址,请选择一个 None

    9. 如需完成网络接口的添加,请点击完成

  6. 点击创建

gcloud

如需在新实例上创建网络接口,请使用 instances create 命令

为每个接口添加 --network-interface 标志,后接任意合适的网络密钥,例如 networksubnetprivate-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

请替换以下内容:

  • INSTANCE_NAME:要创建的虚拟机实例的名称。 这对应于示例配置中的 multi-nic-vm
  • ZONE:实例创建所在的区域。 输入在每个 VPC 网络中创建一个子网的同一区域的可用区。虚拟机实例必须与其接口所连接的子网位于同一区域。示例配置对所有子网使用同一区域。
  • 第一个接口的值:
    • NIC0_NETWORK:接口所连接的网络。 这对应于示例配置中的 network-1
    • NIC0_SUBNET:接口所连接的子网。 这对应于示例配置中的 subnet-1
    • NIC0_INTERNAL_IPV4_ADDRESS:您希望接口在目标子网中具有的内部 IPv4 地址。如果您使用的是示例配置,请输入 10.10.1.3。如果只希望具有分配的有效地址,请忽略。
  • 第二个接口的值
    • NIC1_NETWORK:接口所连接的网络。 这对应于示例配置中的 network-2
    • NIC1_SUBNET:接口所连接的子网。 这对应于示例配置中的 subnet-2
    • NIC1_INTERNAL_IPV4_ADDRESS:您希望接口在目标子网中具有的内部 IPv4 地址。如果您使用的是示例配置,请输入 10.10.2.3。如果只希望具有分配的有效地址,请忽略。

创建两个测试虚拟机

再创建两个虚拟机实例:

  • 一个与您创建的多 NIC 虚拟机的 nic0 接口位于同一网络(不同子网)中。这对应于示例配置subnet-3 中的 test-vm-1
  • 一个与您创建的多 NIC 虚拟机的 nic1 接口位于同一网络(不同子网)中。这对应于示例配置subnet-4 中的 test-vm-2

您可以使用这些虚拟机实例,测试来自具有多个网络接口的虚拟机实例的主子网范围外部的子网的 ping

如需创建虚拟机实例,请执行以下操作:

控制台

  1. 在 Google Cloud 控制台中,转到创建实例页面。

    打开“创建实例”

  2. 名称字段中,输入实例的名称。

  3. 区域字段中,选择您在第一个 VPC 网络中放置额外子网的区域。

  4. 可用区字段中,选择一个可用区。

  5. 高级选项部分,展开网络,然后执行以下操作:

    1. 查看网络接口部分。确保子网与多 NIC 虚拟机的 nic0 接口所用的子网不同。
  6. 点击创建

  7. 重复上述步骤,在第二个 VPC 网络中创建一个实例,并将其放置在与多 NIC 虚拟机的 nic1 接口不同的子网中。

gcloud

  1. 运行 instances create 命令并为每个接口添加 --network-interface 标志,后接任意合适的网络键,例如 networksubnetprivate-network-ipaddress

    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 地址。如果只希望具有分配的有效地址,请忽略。
  2. 重复上一步,在第二个 VPC 网络以及与多 NIC 虚拟机的 nic1 接口不同的子网中创建实例。

测试与多 NIC 虚拟机的连接性

按照本部分中的步骤,测试您创建的额外虚拟机实例到具有多个网络接口的虚拟机实例的每个接口的 ping

下表显示了在本教程的此时可以使用示例配置中的 IP 地址值成功 Ping 通的场景。

来源 目的地 ping successful
multi-nic-vmnic0 接口位于同一网络(不同子网)中的虚拟机 (test-vm-1)。 multi-nic-vmnic0 接口的内部 IP 地址 (10.10.1.3)
multi-nic-vmnic1 接口位于同一网络(不同子网)中的虚拟机 (test-vm-2) multi-nic-vmnic1 接口的内部 IP 地址 (10.10.2.3)

获取多 NIC 虚拟机的 IP 地址

根据需要,获取多 NIC 虚拟机的接口 IP 地址,以便您在后续部分对其执行 Ping 操作。

控制台

  1. 在 Google Cloud 控制台中,转到虚拟机实例页面。

    转到虚拟机实例

  2. 在虚拟机实例列表中,找到您创建的多 NIC 虚拟机,并记录以下值,以便在后续步骤中对其执行 Ping 操作:

    • nic0nic1 接口的内部 IP 地址

gcloud

  1. 运行 instances list 命令

    gcloud compute instances list
    
  2. 找到多 NIC 虚拟机,然后从输出中记录以下内容:

    • INTERNAL_IP:第一个地址和第二个地址分别对应于 nic0nic1 网络接口。

对虚拟机的 nic0 接口执行 Ping 操作

  1. 在虚拟机实例列表中,找到您在多 NIC 虚拟机的 nic0 接口所在网络(不同子网)中创建的虚拟机。

    1. 在实例对应的行中,点击 SSH
  2. 运行以下命令以对多 NIC 虚拟机的 nic0 接口的内部 IP 地址执行 Ping 操作:

    ping INTERNAL_IP_NIC0
    

    INTERNAL_IP_NIC0 替换为您之前记录的相应地址。如果您使用的是示例配置,请输入 10.10.1.3

    请注意,Ping 操作已成功。

  3. 运行 exit 以关闭终端窗口。

对虚拟机的 nic1 接口执行 Ping 操作

  1. 在虚拟机实例列表中,找到您在多 NIC 虚拟机的 nic1 接口所在网络(不同子网)中创建的虚拟机。

    1. 在实例对应的行中,点击 SSH
  2. 运行以下命令以对多 NIC 虚拟机的第二个接口的内部 IP 地址执行 Ping 操作:

    ping INTERNAL_IP_NIC1
    

    INTERNAL_IP_NIC1 替换为您之前记录的相应地址。如果您使用的是示例配置,请输入 10.10.2.3

    请注意,Ping 失败。

  3. 运行 exit 以关闭终端窗口。

配置政策路由

上一部分中的 ping 测试因非对称路由而失败 - 流量发送到 multi-nic-vmnic1 接口,但虚拟机的默认路由导致系统从 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 虚拟机上配置新的路由表。

  1. 按照启用对虚拟机实例的访问权限中的步骤启用串行控制台。

  2. 为避免在更改默认路由时断开与虚拟机的连接,请连接到串行控制台

  3. 运行 ip link list 以列出虚拟机的网络接口,然后记录 nic1 接口的名称,例如 ens5

  4. 运行以下命令,确保 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 接口名称。
  5. nic1 网络接口创建自定义路由表。

    echo "1 ROUTE_TABLE_NAME" | sudo tee -a /etc/iproute2/rt_tables
    

    ROUTE_TABLE_NAME 替换为路由表的名称,例如 route-nic1

  6. 在用于 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
    

    请替换以下内容:

    • GATEWAY:接口的默认网关 IP 地址。 这对应于示例配置中的 10.10.2.1
    • NIC:要为其添加路由的接口。例如 ens5
    • ROUTE_TABLE_NAME:路由表的名称。
    • IP_ADDRESS:接口上配置的内部 IP 地址。这对应于示例配置中的 10.10.2.3
  7. 创建路由规则,指示虚拟机对来源或目标与分配给 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:路由表的名称。
  8. 运行以下命令可从缓存路由表中移除所有条目。如果您使用的是具有之前配置的路由表的现有虚拟机,则可能需要执行此操作。

    sudo ip route flush cache
    

重新测试与多 NIC 虚拟机的连接性

下表显示了在配置了政策路由后,您可以成功执行 Ping 操作的场景。重复执行 Ping 虚拟机的 nic1 接口的步骤,以确认您现在可以成功对这两个 IP 地址执行 Ping 操作。

来源 目的地 ping successful
multi-nic-vmnic0 接口位于同一网络(不同子网)中的虚拟机 (test-vm-1)。 multi-nic-vmnic0 接口的内部 IP 地址 (10.10.1.3)
multi-nic-vmnic1 接口位于同一网络(不同子网)中的虚拟机 (test-vm-2) multi-nic-vmnic1 接口的内部 IP 地址 (10.10.2.3)

清理

为避免因本教程中使用的资源导致您的 Google Cloud 账号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。

删除项目

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

删除各个资源

如果您不想删除整个项目,请删除为教程创建的 VPC 网络和虚拟机实例。

如需删除某个网络,您必须先删除其所有子网中的所有资源,以及引用该网络的所有资源。

删除实例

如需删除实例,请执行以下操作:

控制台

  1. 在 Google Cloud 控制台中,转到虚拟机实例页面。

    转到虚拟机实例

  2. 选中要删除的实例。

  3. 点击删除按钮。

gcloud

使用 gcloud compute instances delete 命令。 当您以这种方式删除实例时,实例将被关停并从实例列表中移除,而且附加到该实例的所有资源会被释放,例如永久性磁盘和任何静态 IP 地址。

要删除实例,请使用以下命令:

gcloud compute instances delete example-instance [example-instance-2 example-instance-3..]

删除 VPC 网络

如需删除 VPC 网络,请执行以下操作:

控制台

  1. 在 Google Cloud 控制台中,进入 VPC 网络页面。

    进入 VPC 网络页面

  2. 点击某个 VPC 网络的名称以显示其 VPC 网络详情页面。

  3. 点击删除 VPC 网络

  4. 在显示的消息中,点击删除进行确认。

gcloud

使用 networks delete 命令

gcloud compute networks delete NETWORK

NETWORK 替换为要删除的网络的名称。

后续步骤