为其他网络接口配置路由


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

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

费用

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

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

准备工作

  1. 登录您的 Google Cloud 账号。如果您是 Google Cloud 新手,请创建一个账号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. 确保您的 Google Cloud 项目已启用结算功能

  4. 启用 Compute Engine API。

    启用 API

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

    Go to project selector

  6. 确保您的 Google Cloud 项目已启用结算功能

  7. 启用 Compute Engine API。

    启用 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. 运行以下命令,以 ping 多 NIC 虚拟机的 nic0 接口的内部 IP 地址:

    ping INTERNAL_IP_NIC0
    

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

    请注意,ping 成功。

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

对虚拟机的 nic1 接口执行 ping 测试

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

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

    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

如需查找接口的 IPv4 地址的默认网关,请从多 NIC 虚拟机发出以下请求:

curl http://metadata.google.internal/computeMetadata/v1/instance/network-interfaces/INTERFACE_NUMBER/gateway -H "Metadata-Flavor: Google"

INTERFACE_NUMBER 替换为接口的编号。例如,如需查找 nic1 的默认网关,请使用 1

在多 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. 在 Google Cloud 控制台中,进入管理资源页面。

    转到“管理资源”

  2. 在项目列表中,选择要删除的项目,然后点击删除
  3. 在对话框中输入项目 ID,然后点击关闭以删除项目。

删除各个资源

如果您不想删除整个项目,请删除为教程创建的 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 替换为要删除的网络的名称。

后续步骤