多个网络接口概览和示例

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

概览

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

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

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

使用情形

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

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

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

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

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

  • 独立接口之间的带宽隔离:这包括避免控制平面与数据平面之间出现队头问题。您可以使用网络接口分隔管理、控制、存储和数据平面网络。在某些应用中,控制(例如检测信号)极其敏感。在此类应用中,需要将控制与数据路径接口分离开来,以保证在出现流量高峰或流量拥塞时可以使用最低带宽。在这种情况下,可使用专用虚拟接口将控制流量与其他流量分离开来。每个接口都有一个虚拟队列。虚拟队列可防止一个 VPC 网络出现的带宽高峰和 DDoS 攻击影响其他 VPC 网络。每个接口的虚拟队列还可以防止队头阻塞,并使每个 I/O 接口都能公平共用该实例的 CPU。如需了解详情,请参阅示例 3:分离 SaaS 架构中的管理和数据平面接口

配置示例

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

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

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

下图描述了一种典型设置。在这种特定情况下,您在从公共连接到专用连接的路径中配置虚拟网络设备。通过这种方式,流量只能从公共外部客户端通过应用级层虚拟化防火墙强制点访问专用 VPC 网络。这种应用级层防火墙在虚拟机上强制执行。

使用情形 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-5

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

  • 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

示例 3:分离 SaaS 架构中的管理和数据平面接口

如果您在 GCP 中运行一项向不同客户(租户)提供的服务,则可以通过单独的管理接口来管理服务。您可以使用管理接口执行软件升级、维护程序以及进行问题排查,且此接口独立于您的租户使用的接口。

下图描述了托管在云端的服务。作为服务提供方,您通过独立的 VPC 网络分离提供给每位租户的服务。也就是说,您为每位租户创建一个 VPC 网络,并为提供给每位客户的服务创建具体实例。例如,您为提供给租户 A 的服务创建实例,并通过网络 A 分离这些实例,因此通过租户 A 的本地机器可以访问此服务,但其他租户无法访问此服务。然后,您可以为租户 B 和租户 C 创建相同的配置。

不过,您必须有权访问每位租户托管在 GCP 上的服务,以便执行软件更新、提供支持以及进行问题排查。为此,您可以在每个实例上添加管理接口并将其与您的管理网络(以私密方式连接到您的本地设施)相关联。

使用情形 3:SaaS 示例(点击可放大)
使用情形 3:SaaS 示例(点击可放大)

租户 A 的实例具有两个接口:一个接口属于租户 A 的网络,另一个接口属于提供者(SaaS 提供商)的管理网络。同样,租户 B 的实例也具有两个接口:一个接口属于租户 B 的网络,另一个接口属于提供者(SaaS 提供商)的管理网络。

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

要在此示例中配置租户实例,请使用以下命令。

要创建 VM-A:

gcloud compute instances create vm-a \
    --network-interface subnet=subnet-a,no-address \
    --network-interface subnet=subnet-mgmt,private-network-ip=198.168.0.2, \
    no-address

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

  • nic0 关联到 subnet-a(network-a 的一部分)
  • nic1 关联到 subnet-mgmt(network-mgmt 的一部分)

要创建 VM-B:

gcloud compute instances create vm-b\
    --network-interface subnet=subnet-b,no-address \
    --network-interface subnet=subnet-mgmt,private-network-ip=198.168.0.3, \
    no-address

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

  • nic0 关联到 subnet-b(network-b 的一部分)
  • nic1 关联到 subnet-mgmt(network-mgmt 的一部分)

要创建 VM-C:

gcloud compute instances create vm-c\
    --network-interface subnet=subnet-c,no-address \
    --network-interface subnet=subnet-mgmt,private-network-ip=198.168.0.4, \
    no-address

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

  • nic0 关联到 subnet-c(network-c 的一部分)
  • nic1 关联到 subnet-mgmt(network-mgmt 的一部分)

其他操作详情

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

您可以通过共享 VPC 与 Cloud Organization 中的项目共享 VPC 网络。

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

当您创建具有多个网络接口的实例时,可以将实例或实例模板的部分接口关联到项目本地的子网,同时将其他接口关联到共享 VPC 网络。

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

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

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

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

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

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

在使用 DHCP 且具有多个接口的实例中,每个接口对于其所在子网都有一个路由。此外,该实例会有一个与主要接口 eth0 相关联的默认路由。除非手动配置,否则离开某个实例到往任何目标 IP 地址(直接关联的子网除外)的所有流量都会通过 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 网络进行应用,或应用到与配置的目标标记相匹配的 VPC 网络内的具体实例。

每个 VPC 网络都具有一组不同的路由。在您配置具有多个接口的实例时,每个接口都属于不同的 VPC 网络。因此,与每个接口相关联的流量都受此接口所属 VPC 网络的路由的约束。

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

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

具有多个网络接口的负载平衡器

如果负载平衡的后端(例如实例组或目标池)具有多个网络接口,则负载平衡器仅将流量发送至后端实例的默认接口。

这适用于 GCP 中支持的所有类型的负载平衡器

具有多个网络接口的防火墙规则

您可以将防火墙规则配置为仅允许由以下各项的某种组合定义的具体流量:

  • 来源 IP 地址范围、允许的 IP 地址块列表或来源标记、一组允许的实例
  • 目标协议和/或端口。

防火墙规则按 VPC 网络进行应用,或应用到与配置的目标标记相匹配的 VPC 网络内的具体实例。

每个 VPC 网络都具有一组不同的防火墙规则。在您配置具有多个网络接口的实例时,每个接口都属于不同的 VPC 网络。每个接口都受应用到此接口所属 VPC 网络的防火墙规则的限制。

在具有多个网络接口的实例中将标记用于防火墙

如果您决定使用标记来实施防火墙规则,则需要注意标记在实例级层应用,因此标记会应用到实例的所有接口。如果这不可行,则设置您的配置,以便仅将某些标记用于指定 VPC 网络中的路由和防火墙规则,从而确保这些标记仅应用到与特定 VPC 网络相关联的接口。

例如,如果您在标记中使用 VPC 网络的名称,则用户可以明确知道这些标记应用到哪些 VPC 网络,并在之后知道这些标记应用到哪些接口。

选择标记名称来标识特定 VPC 网络之后,仅将标记用于应用到该特定 VPC 网络的防火墙规则。

例如,考虑以下情景:您有两个 VPC 网络,即 network1network2。实例 vm-1 通过两个不同的接口关联到这两个 VPC 网络:nic0network1 相关联,而 nic1network2 相关联。

下图描述了此设置。

在防火墙中使用标记(点击可放大)
在防火墙中使用标记(点击可放大)

在这种情况下,应用以下防火墙规则:

  1. network1 中的所有实例仅接受来自 VM1 的 SSH 连接。
  2. network2 中的所有实例仅接受来自 VM1 的 HTTP/HTTPS 连接

要设置这些规则:

  1. network1 中的所有实例仅接受来自 VM1 的 SSH 连接。

    1. 在 VM1 中应用一个仅用于 Network1 的标记。在此示例中,此标记是 vm1-network1-foo

      gcloud compute instances add-tags vm1 \
          --tags vm1-network1-foo
      
    2. 将 Network1 中的防火墙规则配置为允许将标记 vm1-network1-foo 用作来源标记的 SSH(TCP,端口 22):

      gcloud compute firewall-rules create allow-ssh-from-vm1 \
          --allow tcp:22 \
          --network network1 \
          --source-tags vm1-network1-foo
      
  2. network2 中的所有实例仅接受来自 VM1 的 HTTP/HTTPS 连接。

    1. 在 VM1 中应用一个仅用于 Network2 的标记。在此示例中,此标记是 vm1-network2-foo

      gcloud compute instances add-tags vm1 \
          --tags vm1-network2-foo
      
    2. 将 Network2 中的防火墙规则配置为允许将标记 vm1-network2-foo 用作来源标记的 HTTP 和 HTTPS(TCP,端口 80,443):

      gcloud compute firewall-rules create allow-http-https-from-vm1 \
          --allow tcp:80,443 \
          --network network2\
          --source-tags vm1-network2-foo
      
防火墙规则(点击可放大)
防火墙规则(点击可放大)

后续步骤

阅读创建具有多个网络接口的实例

此页内容是否有用?请给出您的反馈和评价:

发送以下问题的反馈:

此网页