为额外网络接口配置路由


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

本教程中的路由配置适用于两种网络接口类型:vNIC 和 Dynamic Network Interface (NIC)。虽然本教程中的示例使用具有多个 vNIC 的实例,不过您可以针对具有 Dynamic NIC 的实例配置相同的示例。

具有多个网络接口的实例称为多 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 实例连接到前两个子网,其余两个子网中各有一个实例(点击可放大)。

创建两个 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 发送回复。如需了解详情,请参阅“多个网络接口概览”中的规范

按照本部分中的步骤配置政策路由,以确保出站数据包通过正确的接口离开。

本教程使用 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 操作的场景。重复执行对实例的 nic1 接口执行 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)

清理

为避免因本教程中使用的资源导致您的 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 替换为要删除的网络的名称。

后续步骤