多个网络接口

本页面简要介绍了虚拟机 (VM) 实例中的多个网络接口,包括这些网络接口的工作原理和示例配置。如需了解如何创建使用多个接口的配置,请参阅创建具有多个网络接口的虚拟机

默认情况下,Google Cloud Virtual Private Cloud (VPC) 网络是独立的专用网络网域。网络具有全局范围并包含区域子网。只要防火墙规则允许,VPC 网络内的虚拟机实例就可以通过内部 IP 地址相互通信。但是,除非您设置 VPC 网络对等互连Cloud VPN 等机制,否则不允许内部 IP 地址在网络之间相互通信。

VPC 网络中的每个实例都有默认网络接口。 配置网络接口时,您需要选择 VPC 网络以及该 VPC 网络中的子网,以便将该接口连接到这些网络。您可以创建更多连接到虚拟机的网络接口,但每个接口都必须连接到不同的 VPC 网络。您可通过多个网络接口创建配置,使其中的实例直接与多个 VPC 网络连接。

每个实例最多可以有 8 个接口,具体取决于实例类型。 如需了解详情,请参阅网络接口数量上限

每个接口都可以配置以下 IP 地址:

  • 内部 IPv4 地址(必需)
  • 外部 IPv4 地址
  • IPv6 地址,可以是内部或外部,但不能同时是两者

    如需配置 IPv6 地址,您必须将该接口连接到已配置 IPv6 范围的子网。

通常情况下,如果您要将实例配置为网络设备以在网络之间执行负载平衡、入侵检测和预防 (IDS/IPS)、Web 应用防火墙 (WAF) 或 WAN 优化,则可能需要多个接口。如果在实例中运行的应用需要进行流量分离(例如分离数据层面流量和管理层面流量),多个网络接口也非常有用。

虚拟机上的每个接口都会受到连接网络的 MTU 的影响。如需详细了解接口 MTU,请参阅最大传输单元

使用场景

如果单个实例需要访问多个 VPC 网络,但您不想直接连接这些网络,就可使用多个网络接口。

  • 网络和安全功能:多个网络接口可以实现虚拟化网络设备功能,例如配置有多个网络接口的负载平衡器、网络地址转换 (NAT) 服务器和代理服务器。如需了解详情,请参阅示例 1:网络和安全虚拟设备

  • 边界隔离(也称为 DMZ 隔离):在分层网络架构方面,一项重要的最佳做法是将面向公众的服务与内部网络及其服务隔离开来。可以使用多个网络接口创建配置,在这些配置中,实例上存在独立的网络接口,其中一个网络接口接受面向公众的流量,另一个网络接口处理访问控制比较严格的后端专用流量。

    所有可从互联网访问的资源都应该与您的内部网络及其服务分离开来。这在很大程度上限制了安全违规可能影响的范围及造成的损害。例如,您可以在连接到中层网络(存在应用服务器)的每个 Web 服务器上再放置一个网络接口。应用服务器还可以是数据库服务器所在的后端网络的双宿主。 每个双宿主实例会先接收和处理前端请求,然后启动到后端的连接,接着将请求发送至后端网络上的服务器。

    通过配置独立接口(一个面向公众,另一个专用),您可以将独立的防火墙规则和访问权限控制分别应用于每个接口,并在从公共网域到专用网域的通信过程中强制实施安全功能。如需了解详情,请参阅示例 2:在共享 VPC 网络场景中使用第三方设备

配置示例

本部分介绍了如何使用多个网络接口的一些常见示例。

示例 1:网络和安全虚拟设备

网络和安全虚拟设备(例如 Web 应用防火墙 (WAF)、安全应用级层防火墙和 WAN 加速器)通常配置有多个虚拟接口。每个接口都配置有其专属内部 IP 地址,并根据需要配置有其专属外部 IP 地址。

图 1 展示了应用级层防火墙的示例配置,该配置控制互联网到 VPC 网络的流量。应用级层防火墙是在 Compute Engine 虚拟机中实现的。

在此示例中,设备虚拟机的默认路由已配置为使用 nic1

图 1. 具有虚拟机设备的实例具有三个网络接口。每个接口都连接到不同 VPC 网络中的子网(点击可放大)。

针对示例 1 预配和配置实例

下文假设 subnet0subnet1subnet2 已存在,并且范围没有重叠。

要在此示例中创建虚拟机和网络接口,请使用以下命令:

gcloud compute instances create vm-appliance \
    --network-interface subnet=subnet0,no-address \
    --network-interface subnet=subnet1 \
    --network-interface subnet=subnet2,no-address \
    --machine-type n1-standard-4

此命令会创建一个具有三个网络接口的实例:

  • nic0 连接到 subnet0,但没有外部 IP 地址。
  • nic1 连接到 subnet1,并且具有临时外部 IP 地址。
  • nic2 连接到 subnet2,但没有外部 IP 地址。

示例 2:在共享 VPC 网络中使用第三方设备的情景

如果您希望共享一组集中式第三方设备来处理托管在不同项目中的工作负载或应用,则此设置非常有用。图 2 中有四个不同的应用(App1App2App3App4),它们托管在不同的服务项目中。您需要妥善保护这些应用,以防所有互联网流量全部入站,并且需要通过集中于共享 VPC 宿主项目的第三方设备检查和过滤出站流量。

图 2. 共享 VPC 宿主项目中的实例托管虚拟机设备。该实例有一个网络接口用于四个服务项目中的每一个,另一个接口用于网络边界 VPC 网络(点击可放大)。

针对示例 2 预配和配置虚拟机及网络接口

要在此示例中创建虚拟机和网络接口,请使用以下命令:

gcloud compute instances create VM-appliance \
    --network-interface subnet=subnet-perimeter,address='reserved-address' \
    --network-interface subnet=subnet-1,no-address \
    --network-interface subnet=subnet-2,no-address \
    --network-interface subnet=subnet-3,no-address \
    --network-interface subnet=subnet-4,no-address \
    --machine-type=n1-standard-4

这会创建一个具有五个网络接口的实例:

  • nic0 连接到 subnet-perimeternetwork-perimeter 的一部分),具有静态地址 reserved-address
  • nic1 连接到 subnet-1network-1 的一部分),没有外部 IP 地址。
  • nic2 连接到 subnet-2network-2 的一部分),没有外部 IP 地址。
  • nic3 连接到 subnet-3network-3 的一部分),没有外部 IP 地址。
  • nic4 连接到 subnet-4network-4 的一部分),没有外部 IP 地址。

其他操作详情

共享 VPC 环境中的多个网络接口

借助共享 VPC,您可以在 Google Cloud 组织中的多个项目之间共享 VPC 网络。

通过共享 VPC,您可以创建与共享 VPC 网络(托管在集中式共享 VPC 宿主项目中)相关联的实例。如需了解如何配置共享 VPC 网络,请参阅预配共享 VPC

如需创建具有一个或多个接口(与共享 VPC 网络相关联)的实例,您必须在共享 VPC 宿主项目中拥有 Compute Network User 角色 (roles/compute.networkUser)。

具有多个网络接口的 DNS 解析

如果内部 DNS 查询由实例主机名构成,则会解析为实例的主要接口 (nic0)。如果实例的 nic0 接口所连接到的 VPC 网络不同于发出内部 DNS 查询的实例所属的 VPC 网络,则查询会失败。

系统不会为每个接口生成专用 Compute Engine DNS 记录。

具有多个网络接口的 DHCP 行为

在默认的多个接口配置中,操作系统被配置为使用 DHCP。每个接口的 DHCP 和 ARP 行为都与具有单个接口的实例的 DHCP 和 ARP 相同。

在使用 DHCP 且具有多个接口的实例中,每个接口对于其所在子网都有一个路由。此外,该实例有一个与主要接口 eth0 相关联的默认路由。除非手动配置,否则从某个实例流向任何目的地(直接关联的子网除外)的所有流量都将通过 eth0 上的默认路由离开该实例。

使用 IPv6 地址的接口的行为是相同的。该接口会获取其所在 IPv6 子网范围的路由,以及一个 IPv6 默认路由。

在此示例中,主要接口 eth0 有默认路由(default via 10.138.0.1 dev eth0),接口 eth0eth1 对于其各自的子网都有相应的路由。

instance-1:~$ ip route
default via 10.138.0.1 dev eth0
10.137.0.0/20 via 10.137.0.1 dev eth1
10.137.0.1 dev eth1 scope link
10.138.0.0/20 via 10.138.0.1 dev eth0
10.138.0.1 dev eth0 scope link

如需了解详情,请参阅配置政策路由部分。

自定义静态路由和多个网络接口

如果虚拟机实例有多个接口和一个网络标记,则该网络标记可能不会影响虚拟机的所有接口。如果某接口位于 VPC 网络中且包含具有匹配标记的自定义静态路由,则虚拟机的网络标记会影响该接口。

例如:

  1. 虚拟机有两个接口:nic0nic1nic0 接口位于 vpc-net-a 中。nic1 接口位于 vpc-net-b 中。虚拟机有一个名为 vpn-ok 的网络标记。标记是有关实例的特性,而不是有关特定接口的特性。
  2. vpc-net-a 网络有一个具有 vpn-ok 标记的自定义静态路由。
  3. vpc-net-b 网络有一个具有 vpn-123 标记的自定义静态路由。

这些带编号的步骤与图 3 对应:

图 3. vpc-net-a 中的自定义静态路由会影响 nic0,因为它们具有共同的标记,而 vpc-net-b 中的自定义静态路由不会影响 nic1(点击可放大)。

对于 vpc-net-a 网络,由于它与虚拟机同时具有一个带标记的路由,因此虚拟机的 vpn-ok 标记应用于 vpc-net-a 中虚拟机的 nic0 接口。相比之下,由于 vpc-net-b 没有带 vpn-ok 标记的静态路由,因此该虚拟机的 nic1 接口会忽略虚拟机的 vpn-ok 网络标记。

具有多个网络接口的实例中的路由中的标记

如果您选择结合使用标记和路由,则需要注意标记在实例级层应用,因此标记会应用到虚拟机实例的所有接口。如果不希望这样做,请确保应用于路由的标签对于每个 VPC 网络都是唯一的。

负载平衡器和多个网络接口

除了内部 TCP/UDP 负载平衡,其他所有 Google Cloud 负载平衡器都仅将流量分配到后端实例的第一个接口 (nic0)。

防火墙规则和多个网络接口

每个 VPC 网络都有自己的一组防火墙规则。如果实例的接口位于特定的 VPC 网络中,则该网络的防火墙规则会应用于该接口。

例如,假设虚拟机实例具有两个接口:

  • VPC 网络 network-1 中的 nic0 接口
  • VPC 网络 network-2 中的 nic1 接口

您针对 network-1 网络创建的防火墙规则应用于 nic0。您针对 network-2 网络创建的防火墙规则应用于 nic1

如需了解详情,请参阅 VPC 防火墙规则

具有多个网络接口的实例中的防火墙

  • 入站防火墙规则可以使用网络标记或服务账号来识别来源和/或目标(目的地)。

  • 出站防火墙规则可以使用网络标记或服务账号来识别目标(来源)。

如需了解详情,请参阅按服务账号过滤来源和目标

网络标记和服务账号用于识别实例,而非特定的接口。 请记住,防火墙规则与单个 VPC 网络相关联,并且多 NIC 实例的每个接口都必须位于唯一 VPC 网络的子网中。

以下示例演示了如何有效地使用入站 allow 防火墙规则的来源标记。vm1 实例具有两个网络接口:

  • network-1 中的 nic0 接口
  • network-2 中的 nic1 接口

假设您需要允许来自 vm1 的以下流量:

  • vm1network-1 中任意实例的 SSH 流量
  • vm1network-2 中任意实例的 HTTP 和 HTTPS 流量

为此,您可执行以下操作:

  1. vm1 分配两个网络标记vm1-network1vm1-network2

  2. 使用以下组件network-1创建入站 allow 防火墙规则,以允许从 vm1network-1 中所有虚拟机的 SSH 流量:

    • 操作:allow
    • 方向:ingress
    • 源:带 vm1-network1 标记的虚拟机
    • 目标:VPC 网络中的所有实例
    • 协议和端口:tcp:22
  3. 使用以下组件在 network-2 中创建入站允许防火墙规则,以允许从 vm1network-2 中所有虚拟机的 HTTP 和 HTTPS 流量:

    • 操作:allow
    • 方向:ingress
    • 源:带 vm1-network2 标记的虚拟机
    • 目标:VPC 网络中的所有实例
    • 协议和端口:tcp:80,443

图 4 说明了此防火墙配置示例:

图 4。 防火墙规则 1 和防火墙规则 2 各自都有与 VM1 关联的来源标记。防火墙规则 1 位于 network-1 中,仅影响 VM1 的 nic0,因为它们同时位于 network-1。防火墙规则 2 仅影响 VM1 的 nic1,因为它们也共享网络(点击可放大)。

后续步骤