多个网络接口概览和示例

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

概览

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

VPC 网络中的每个实例都有默认网络接口。您可以创建更多连接到虚拟机的网络接口,但每个接口都必须连接到不同的 VPC 网络。您可通过多个网络接口创建配置,使其中的实例直接与多个 VPC 网络连接。每个接口都必须有一个内部 IP 地址,而且每个接口还可以有一个外部 IP 地址。 每个实例最多可以有 8 个接口,具体取决于实例类型。 如需了解详情,请参阅接口数量上限

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

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

使用场景

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

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

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

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

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

配置示例

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

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

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

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

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

用例 1:预配和配置具有多个接口的实例(点击可放大)
用例 1:预配和配置具有多个接口的实例(点击可放大)

针对示例 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 网络场景中使用第三方设备

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

用例 2:使用第三方设备的共享 VPC 示例(点击可放大)
用例 2:使用第三方设备的共享 VPC 示例(点击可放大)

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

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

要创建虚拟机设备:

gcloud compute instances create VM-appliance \
    --network-interface subnet=subnet-dmz,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-dmz(network-dmz 的一部分)且具有静态地址“reserved-address”
  • nic1 关联到 subnet-1(network-1 的一部分)且没有外部 IP
  • nic2 关联到 subnet-2(network-2 的一部分)且没有外部 IP
  • nic3 关联到 subnet-3(network-3 的一部分)且没有外部 IP
  • nic4 关联到 subnet-4(network-4 的一部分)且没有外部 IP

其他操作详情

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

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

通过共享 VPC,您可以创建与共享 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 上的默认路由离开该实例。

在此示例中,主要接口 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 标记的自定义静态路由。

这些带编号的步骤与下图的数字标注相对应:

自定义静态路由和多个网络接口(点击可放大)
自定义静态路由和多个网络接口(点击可放大)

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

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

如果您选择结合使用标记和路由,则需要注意标记在实例级层应用,因此标记会应用到虚拟机实例的所有接口。如果这不是希望的设置,则可以设置您的配置,以便仅将某些标记用于指定 VPC 网络中的路由,从而有效确保这些标记仅应用到与特定 VPC 网络关联的接口。

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

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

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

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

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

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

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

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

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

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

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

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

网络标记和服务帐号用于识别实例,而非特定的接口。 请注意,防火墙规则与单个 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

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

防火墙规则(点击可放大)
防火墙规则(点击可放大)

后续步骤