多个网络接口
本页面简要介绍了虚拟机 (VM) 实例中的多个网络接口,包括这些网络接口的工作原理和示例配置。如需了解如何创建使用多个接口的配置,请参阅创建具有多个网络接口的虚拟机。
具有多个网络接口控制器的虚拟机称为多 NIC 虚拟机。
默认情况下,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 预配和配置实例
下文假设 subnet0
、subnet1
和 subnet2
已存在,并且范围没有重叠。
要在此示例中创建虚拟机和网络接口,请使用以下命令:
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 中有四个不同的应用(App1
、App2
、App3
和 App4
),它们托管在不同的服务项目中。您需要妥善保护这些应用,以防所有互联网流量全部入站,并且需要通过集中于共享 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-perimeter
(network-perimeter
的一部分),具有静态地址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 宿主项目中拥有 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
),接口 eth0
和 eth1
对于其各自的子网都有相应的路由。
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 网络中且包含具有匹配标记的静态路由,则虚拟机的网络标记会影响该接口。
例如:
- 虚拟机有两个接口:
nic0
和nic1
。nic0
接口位于vpc-net-a
中。nic1
接口位于vpc-net-b
中。虚拟机有一个名为vpn-ok
的网络标记。标记是有关实例的特性,而不是有关特定接口的特性。 vpc-net-a
网络有一个具有vpn-ok
标记的自定义静态路由。vpc-net-b
网络有一个具有vpn-123
标记的自定义静态路由。
这些带编号的步骤与图 3 对应:
对于 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 防火墙规则。
具有多个网络接口的实例中的防火墙
入站防火墙规则可以使用网络标记或服务账号来识别来源和/或目标(目的地)。
出站防火墙规则可以使用网络标记或服务账号来识别目标(来源)。
如需了解详情,请参阅按服务账号过滤来源和目标。
网络标记和服务帐号用于识别实例instances,而非特定的接口。 请记住,防火墙规则与单个 VPC 网络相关联,并且多 NIC 实例的每个接口都必须位于唯一 VPC 网络的子网中。
以下示例演示了如何有效地使用入站 allow
防火墙规则的来源标记。vm1
实例具有两个网络接口:
network-1
中的nic0
接口network-2
中的nic1
接口
假设您需要允许来自 vm1
的以下流量:
- 从
vm1
到network-1
中任意实例的 SSH 流量 - 从
vm1
到network-2
中任意实例的 HTTP 和 HTTPS 流量
为此,您可执行以下操作:
向
vm1
分配两个网络标记:vm1-network1
和vm1-network2
使用以下组件在
network-1
中创建入站流量allow
防火墙规则,以允许从vm1
到network-1
中所有虚拟机的 SSH 流量:- 操作:
allow
- 方向:
ingress
- 源:带
vm1-network1
标记的虚拟机 - 目标:VPC 网络中的所有实例
- 协议和端口:
tcp:22
- 操作:
使用以下组件在
network-2
中创建入站流量允许防火墙规则,以允许从vm1
到network-2
中所有虚拟机的 HTTP 和 HTTPS 流量:- 操作:
allow
- 方向:
ingress
- 源:带
vm1-network2
标记的虚拟机 - 目标:VPC 网络中的所有实例
- 协议和端口:
tcp:80,443
- 操作:
图 4 说明了此防火墙配置示例: