GCP-DevOps-高级教程-三-

119 阅读24分钟

GCP DevOps 高级教程(三)

原文:Pro DevOps with Google Cloud Platform

协议:CC BY-NC-SA 4.0

十、GCP 的网络配置和管理

当我们提到云环境时,我们指的是通过网络共享的资源。这些资源必须通过网络进行配置和管理,因此我们必须确保公开和维护它们所需的安全级别。当我们创建云应用时,我们必须考虑让应用全天候运行。只有当我们设计的架构能够在网络上可靠运行时,这才有可能。在本章中,你将看到我们如何在谷歌云平台(GCP)中设计和维护良好的网络架构。

GCP 网络基础

首先,要定义和管理我们的网络,我们必须确定和了解 GCP 的网络是如何组织的。在 GCP,网络分为两个主要部分:

  • 地区

  • 区域

地区是我们管理资源的地理区域。一个区域可以包含一个或多个区域。位于一个区域中的资源,比如持久性磁盘,被称为区域资源。其他资源,如外部互联网协议(IP),被称为区域资源。同一区域中的每个资源都可以使用区域资源。并非所有的资源都是区域性的。GCP 的区域和带状资源列于表 10-1 。

表 10-1

GCP 的区域和地带性资源

|

类型

|

资源

|

描述

| | --- | --- | --- | | 地区的 | 地址 | 项目中定义的任何静态外部 IP 的集合 | | 地区的 | 子网络 | 区域子网用于分割网段中的地址。它用于识别主网络中的子网。 | | 地区的 | 区域管理的实例组 | 这些资源是跨越同一地区多个区域的同类资源的集合。 | | 地区的 | 区域持久磁盘 | 这用于跨不同区域提供持久的数据存储和复制。在故障转移的情况下,我们可以将资源连接到另一个区域,将数据迁移到云中。 | | 带状的 | 例子 | 每个实例必须位于一个区域中,并且可以访问同一区域中的一个或多个全局资源。 | | 带状的 | 永久磁盘 | 同一区域中的所有资源都可以访问永久磁盘。可以仅将磁盘连接到同一区域中的活动资源。 | | 带状的 | 机器类型 | 这些是预分区资源。实例和磁盘只能在同一区域中使用机器类型。 |

在考虑我们的架构时,我们必须定义在哪里放置我们的资源,仔细选择我们的区域和资源。这是因为正确的规划有助于实现网络的两个主要目标。

  • 处理故障:如果我们跨区域和地区分配资源,我们可以使用 Google Cloud 来设计在出现故障时彼此独立的区域。每个区域都是完全独立的,一个区域的故障不会导致其他区域的故障。当我们在一个区域出现故障时,我们可以将数据移动到另一个区域,从而实现云的高可用性。

  • 降低网络延迟:为了降低网络延迟,我们必须将资源放置在离我们最近的位置。这意味着如果我们想让我们的应用全球化,我们必须在不同的地区复制资源。

除了地区性和区域性资源,我们还有一些全球资源。这种类型的资源可以在整个云中全局使用。全球资源包括

  • 形象

  • 快照

  • VPC 网络

  • 防火墙

  • 路线

全球资源非常重要,因为它们可以在每个区域和每个地区使用。创建网络的基本要求是虚拟私有云(VPC)。这是展示和创建网络架构的基本资源。

虚拟私有云简介

VPC 为我们提供了在全球和地区级别上扩展和控制资源工作负载的灵活性。当我们将我们的资源连接到 GCP 时,我们可以访问我们的 VPC,而不必在每个地区复制连接。这是因为 VPC 为我们做了这些。一个单独的谷歌 VPC 不需要访问互联网就可以在不同地区共享资源。单个连接点可以跨区域共享资源。这降低了我们组织的复杂性。

在图 10-1 中,你可以看到使用谷歌 VPC,我们有不同的子网。每个子网都有一个带有内部 IP 的应用。VPC 与外部世界共享 IP,从而也与外部世界共享网络。

img/464715_1_En_10_Fig1_HTML.jpg

图 10-1

普通 VPC 和谷歌云平台 VPC 的区别

VPC 的另一个重要属性是它隔离项目的能力。有了 VPC,我们可以很容易地分离项目,每个项目有不同的账单。然而,我们可以通过云互联组件共享信息。VPC 网络通常简称为“网络”每次我们创建一个新项目,它都与一个默认网络相关联。这实质上是物理网络的虚拟表示,并提供与所有其他组件的连接,如计算引擎或 Kubernetes 引擎。每个 VPC 都有一些特定的属性。

  • VPC 网络及其所有相关组件(如防火墙规则和路由)都是全球性的。它们不与特定的区域或地区相关联。

  • 子网是一种区域性资源。每个子网定义一个 IP 地址范围。

  • 进出不同实例的流量可以由防火墙规则控制。

  • 资源可以使用内部私有 IPv4 地址跨不同子网进行通信。通信遵循为 VPC 定义的防火墙规则。

  • 如果我们为一个实例定义一个私有 IP,那么只有当我们为该实例所在的子网启用私有 Google 访问时,它才能与 Google API 通信。

  • 可以使用 IAM 角色来定义谁可以管理网络。

  • 一个网络可以使用 VPC 网络对等连接到另一个 VPC。

  • 使用云 VPN 或 Google Cloud Interconnect,可以在混合环境中安全地连接 VPC 网络。

  • VPC 网络仅支持 IPv4 单播流量。它不支持多播和广播或 IPv6 流量。可以使用 IPv6 来访问网络中的资源。

  • VPC 网络的最大传输单位(MTU)为 1460 字节。根据 RFC 2132,该 MTU 值通过 DHCP 选项 26 提供给实例。为大于 1460 字节的数据包配置 MTU 可能会导致数据包丢失。

这些属性有助于理解 VPC 的工作原理及其局限性。我们已经知道 VPC 允许子网之间相互通信,因此了解子网在 GCP 中的工作方式非常重要。

网络和子网

每个 VPC 网络由一个或多个 IP 范围组成。这些 IP 范围被称为子网。每个子网都与一个区域相关联。VPC 网络可以在一个或多个区域中包含一个或多个子网。这意味着我们的 VPC 网络可以跨越不同的地理位置,以确保云的高可用性。这意味着,在一个地区出现故障的情况下,另一个地区是可用的,我们可以向我们的客户保证云的功能。我们可以用两种方式定义 VPC 网络:

  • 自动模式:跨不同地区自动创建网络。

  • 自定义模式:网络是在没有任何关联子网的情况下创建的,这使得我们可以定义我们网络的所有特征。

当我们创建自动模式网络时,GCP 会为每个区域创建一个子网。子网与 0.128.0.0/9 CIDR(无类域间路由)块中预定义的一组 IP 范围相关联。当一个新的 GCP 区域变得可用时,一个新的子网被添加到该区域,并且网络使用与该区域相关联的 IP 网络。除了通过 GCP 添加子网之外,还可以手动向区域添加子网,并使用自动子网之外的 IP。当我们创建自定义模式网络时,GCP 不会提供默认子网。这种类型的网络留给用户来决定定义他们的网络的能力。我们可以使用我们想要的每个 IP 范围,并在我们决定使用的每个区域创建子网。

当我们规划网络时,我们必须考虑每种网络的优缺点。这有助于了解哪种类型的网络最适合我们的架构。自动模式网络易于设置和使用。它最适合以下使用情形:

  • 对于在每个区域自动创建的子网

  • 当预定义的 IP 范围不与我们为我们的体系结构配置的任何 IP 地址重叠时

另一方面,定制模式网络提供了更大的灵活性,更适合生产环境。这是因为我们可以定义我们的 IP 地址范围,并且我们可以更仔细地计划在哪里创建子网网络。我们可以确定一些基本使用案例,在这些案例中,强烈建议使用定制模式网络。

  • 当我们不需要在每个区域自动创建子网时

  • 当我们想要决定分配给我们子网的 IP 范围时,因为预定义的 IP 范围与网络上的其他 IP 重叠

  • 当我们计划使用 VPC 网络、对等网络或云 VPC 连接我们的子网时。

定义子网的 IP 范围

当我们创建自定义模式网络时,我们必须根据某些规则设计我们的 IP 范围。这些规则用于帮助我们正确实施子网的 IP 范围。

  • 子网必须有一个主地址范围。该范围必须是有效的 RFC 1918 CIDR 块。

  • 同一网络中的子网必须具有唯一的 IP 范围,但是不同网络中的子网,即使是同一项目的一部分,也可以使用相同的 IP 范围,并在另一个网络中重复使用。

  • 当我们定义 RFC 1918 CIDR 块时,我们必须对我们可以创建的 IP 范围施加一些限制。

  • 同一网络中的子网必须有唯一的 IP 地址。

  • 当我们使用 VPC 网络对等或云 VPC 连接 VPC 时,子网必须具有唯一的 IP 地址。

  • 当我们为通过云 VPN 或 Google Cloud Interconnect 连接的内部网络定义 IP 范围时,它们不应与 GCP 中定义的任何其他 IP 范围冲突。

  • 可以给一个子网分配一个或多个 IP 地址范围。这些范围保留给虚拟机(VM)实例。这些可以使用 RFC 1918 CIDR 块,并且必须遵守先前定义的相同规则。

  • 我们不必为我们在同一网络中定义的子网定义一个连续的 IP 范围。

  • 子网 CIDR 的最小大小是/29

注意

CIDR,有时也称为超网划分,是一种在分配互联网协议(IP)时允许更大灵活性的方法。这减缓了 IPv4 地址的耗尽。CIDR 引入了可变长度子网掩码(VLSM) 的概念。这种技术允许我们为前缀指定任意长度。CIDR 引入了一种表示 IP 地址的新方法,叫做 CIDR 符号。使用 CIDR 表示法时,地址或路由前缀会加上一个表示前缀位数的后缀,例如,IPv4 的 192.10.0.2/24。

当我们定义一个新的子网时,我们必须确保在其主 IP 范围内保留四个 IP 地址。这些保留地址在表 10-2 中列出。

表 10-2

为子网保留的 IP 地址

|

保留地址

|

描述

|

例子

| | --- | --- | --- | | 网络 | 子网主 IP 范围中的第一个 IP 地址 | 24 中的 10.10.1.0 | | 默认网关 | 子网主 IP 范围中的第二个 IP 地址 | 10.10.1.0/24 | | 倒数第二次预订 | 子网主 IP 范围中倒数第二个 IP 地址 | 10.10.1.0/24 | | 广播 | 子网主 IP 范围中的最后一个 IP 地址 | 24 中的 10 . 10 . 1 . 0/25 |

保留的 IP 地址仅存在于主 IP 地址中。这意味着当我们定义辅助 IP 地址时,我们在辅助地址中没有保留地址。

路由和防火墙

路由和防火墙是每个网络的一些基本组件。一条路由是一对定义的地址,代表目的地网关。当我们试图使用特定的网关将数据包发送到特定的目的地时,就会用到路由。我们可以确定三种目的地。

  • 单个主机

  • 子网络

  • 默认

网关也有三种类型。

  • 单个主机

  • 界面或链接

  • 以太网硬件地址(MAC)

当我们创建一个 VPC GCP 来自动生成一条系统生成的路线时,这条路线在其中被创建和管理,如下所示:

  • GCP 创建了一条目的地为 0.0.0.0/0 且下一跳是默认 Internet 网关的路由。

  • 对于我们创建的每个子网,都会创建一个路由来定义其资源的路径。这些子网路由在 GCP 控制台中显示虚拟网络的下一跳。通信许可由防火墙规则定义。

  • 子网路由的优先级固定为 1000。

  • 自动模式网络会自动为我们创建的每个子网创建路由。

  • 对于我们创建的每个子网,都会自动创建一个子网路由。

  • 当我们删除子网时,所有路由都会自动删除。

我们可以识别系统生成的路线,因为名称以default-route-前缀开头。这有助于识别哪些路线是手动添加的,哪些是由系统生成的。例如,如果我们打开 GCP 并移动到路线部分,我们可以看到如图 10-2 所示的内容。

img/464715_1_En_10_Fig2_HTML.jpg

图 10-2

默认路由示例

与应用于路由的默认规则一样,在 GCP,我们可以找到一些通用的防火墙规则。这些规则允许我们定义允许或拒绝哪些流量进出虚拟机。

这些规则总是被使用,即使我们呆在我们的网络中,流量也是被控制的。这意味着当我们从一个私有内部虚拟机移动到另一个私有内部虚拟机时,防火墙会应用我们之前定义的规则。每个 VPC 都有两条隐含的防火墙规则。这些不会显示在 GCP 控制台中,但是在我们创建新的 VPC 时会用到和定义。这些规则是:

  • 隐含允许出口规则:该规则允许出口流量。允许到达目的地 0.0.0.0/0 的传入流量,优先级尽可能最低,为 65535。

  • 隐含的拒绝进入规则:如果源是 0.0.0.0/0 并且优先级尽可能低,该规则拒绝进入流量,65535。

这些隐含的规则不能被删除,但可以被覆盖。要覆盖这些规则,我们必须创建一个优先级更高的新规则,其优先级小于 65535。这是因为两个隐含规则的优先级都是 65535。默认网络添加了一些额外的默认规则,可以根据需要进行修改或删除。这些规则是:

  • default-allow-internal:该规则允许网络中实例间所有协议和端口的入口连接。此规则的优先级是 65534。

  • default-allow-sh:该规则允许从任何源或实例到网络的 TCP 与端口 22 的连接。此规则的优先级是 65534。

  • default-allow-rdp:该规则允许 TCP 与端口 3389 的连接。此规则的优先级为 65534,用于允许 Windows 远程桌面。

  • default-allow-icmp:此规则允许网络上任何来源或实例的 ICMP 流量。该规则的优先级为 65534。

在 GCP,默认情况下,一些流量被阻止。不可能创建防火墙规则来允许此流量。阻塞的流量是

  • GRE 流量

  • TCP、UDP、ICMP、IPIP 之外的协议

  • TCP 和端口 25 上的出口流量

  • TCP 和端口 465 或 587 上的出口流量(SSL/TLS 上的 SMTP)

了解路由和防火墙的基本知识对于理解如何在 GCN 设计和实施 VPC 非常重要。

标签网络

一个非常有用的功能是网络标签。网络标签是一种属性,我们可以将其添加到计算引擎虚拟机中,并与防火墙和路由一起使用,仅适用于某些特定的计算引擎虚拟机。标签不需要在多个 VPC 网络中是唯一的。

当我们为网络创建标记时,我们可以将防火墙规则或路由应用于一组特定的实例。有了标签,我们可以

  • 使用目标标记和源标记,将防火墙规则应用于特定实例

  • 通过使用标签,将路线应用于特定实例

在 GCP,每个防火墙都有一个目标。默认情况下,所有防火墙都有目标all instances of the network。我们可以使用目标标签或目标服务帐户将实例指定为目标。一个目标标签被用来标识规则所应用到的 GCP 虚拟机。该规则适用于主要内部 IP 地址和具有相同网络标记的所有实例。

要在我们的网络中创建一个标签,我们必须使用这个命令:

gcloud compute instances add-tags <INSTANCE-NAME> --zone <ZONE> --tags <TAGS>

这会向实例中添加一个新标记,这意味着命令不会删除或修改现有标记。该命令的结果如清单 10-1 所示。

pierluigi_riti@practicaldevopsgcp-197023:~$ gcloud compute instances add-tags test-tag --zone us-east1-b --tags test-tag
Updated [https://www.googleapis.com/compute/v1/projects/practicaldevopsgcp-197023/zones/us-east1-b/instances/test-tag].

Listing 10-1Result of the add-tags Command

我们可以使用命令remove-tags移除标签。语法是

gcloud compute instances remove-tags <INSTANCE-NAME> --zone <ZONE> --tags <TAGS>

当我们想要将防火墙规则或路由应用到一组特定的虚拟机实例时,标记非常有用。这使我们能够对网络有一个“逻辑”的表示,并且我们可以很容易地确定哪些规则适用于特定的虚拟机。

实施 VPC 网络

到目前为止,我已经介绍了 VPC 网络的理论和基础,但是要更好地理解这些,您必须亲自动手。所以,让我们开始为我们的谷歌云平台创建一个 VPC 网络。创建 VPC 的简单方法是通过 GCP 控制台创建一个自动模式网络。我们可以通过这些简单的步骤创建 VPC:

  1. 连接到 GCP 控制台。

  2. Move to the VPC networks page (Figure 10-3).

    img/464715_1_En_10_Fig3_HTML.jpg

    图 10-3

    用于创建新 VPC 网络的网络部分

  3. This opens the page from which it is possible to find all the VPC networks and create a new one. To create a new network, just click the CREATE VPC NETWORK button (Figure 10-4).

    img/464715_1_En_10_Fig4_HTML.jpg

    图 10-4

    创建新 VPC 网络的按钮

创建 VPC 网络的页面现已打开。在此页面上,我们可以添加并指明创建 VPC 所需的所有信息。首先,在适当的字段中,我们必须指明网络的名称。这必须是所有小写字母,没有空格。我们可以在网络名称中使用数字或连字符。有了名称,我们可以添加网络描述。这可以用来表示网络的范围。当我们创建名称并添加描述时,我们必须创建子网来连接 VPC。我们可以通过两种方式创建子网:

  • 自动的

  • 习俗

如果我们选择自动模式来创建 VPN,我们只需为我们的子网选择区域,GCP 就会为该区域分配默认的 IP 地址范围(图 10-5 )。

img/464715_1_En_10_Fig5_HTML.jpg

图 10-5

自动子网创建选项

当我们选择创建自定义子网时,我们必须为子网指定更多的值。我们可以指明网络的名称,遵守与 VPC 相同的规则。该名称必须全部为小写字母,只能包含字母、数字或连字符,不能包含空格。可以为子网添加描述。这对于指示子网的类型和用途很有用。

我们需要为子网指定的另一个参数是我们想要创建 VPC 的区域。该区域是我们可以在 Google Cloud 中使用的经典区域。在 IP 地址范围部分,我们可以确定 VPC 的私有 IP 范围。总是可以添加第二个 IP 范围。在这种情况下,我们可以指定一个名称和我们想要使用的 IP 范围。我们子网的最后两个选项是

  • 私有 Google 访问:该选项表示我们的 VPC 是否可以在不分配外部 IP 的情况下访问其他服务。

  • Flow logs : This option is used to generate the log of the subnet. It doesn’t slow down any service but generates Stackdriver traffic and can improve the cost of the service (Figure 10-6).

    img/464715_1_En_10_Fig6_HTML.jpg

    图 10-6

    用于生成自定义子网的选项

最后一个选项是动态路由模式。此选项用于确定哪些子网在云路由器中可见。我们可以设置两种类型的路由:

  • 地区的

  • 全球的

如果我们选择区域路由,Google 云路由器会在定义子网的区域中通告并传播我们的子网。通过全局路由,云路由器将我们的 VPC 中定义的所有子网通告给本地网络。云路由器将学习到的路由传播到 VPC 的所有地区。设置好所有选项后,我们可以单击“Create”按钮,这样就创建了 VPC。我们可以在谷歌控制台中看到创建的网络(图 10-7 )。

img/464715_1_En_10_Fig7_HTML.jpg

图 10-7

Google 控制台显示了我们刚刚创建的网络的信息

创建 VPC 的另一种方法是使用gcloud命令行。要创建网络和子网,我们必须执行两个不同的步骤。首先,我们必须创建网络,然后是子网。要创建网络,我们必须使用以下格式的命令:

gcloud compute --project=<project name> networks create <network name> --subnet-mode=auto/custom

如果我们想创建一个自定义模式的网络,我们必须添加一个子网。创建子网的命令是

gcloud compute --project=<project name> networks subnets create <subnet name> --network=<network name> --region=<region name> --range=<ip range> --secondary-range=<secondary range name>=<ip range> --bgp-routing-mode <routing mode>

路由模式部分是可选的,用于指示我们想要使用哪种类型的路由模式。我们现在可以尝试使用该命令来创建网络。第一步是创建网络。完整的命令是

gcloud compute --project=<your project name> networks create practicaldevopsgcp --subnet-mode=auto

该命令的结果显示了我们刚刚想要创建的网络的信息。我们可以看到清单 10-2 中命令的结果。

 pierluigi_riti@practicaldevopsgcp-197023:~$ gcloud compute --project=practicaldevopsgcp-197023 networks create practicaldevopsgcp --subnet-mode=auto
Created [https://www.googleapis.com/compute/v1/projects/practicaldevopsgcp197023/global/networks/practicaldevopsgcp].
NAME               SUBNET_MODE   BGP_ROUTING_MODE  IPV4_RANGE  GATEWAY_IPV4
practicaldevopsgcp  AUTO         REGIONAL
Instances on this network will not be reachable until firewall rules
are created. As an example, you can allow all internal traffic between
instances as well as SSH, RDP, and ICMP by running:
$ gcloud compute firewall-rules create <FIREWALL_NAME> --network practicaldevopsgcp --allow tcp,udp,icmp --source-ranges <IP_RANGE>
$ gcloud compute firewall-rules create <FIREWALL_NAME> --network practicaldevopsgcp --allow tcp:22,tcp:3389,icmp

Listing 10-2The Result of the Command Line Network Creation

在 Google 控制台中,可以看到新创建的网络。因为我们已经在自动模式下创建了网络,所以控制台会显示任何地区的 IP 地址。全局路由被禁用,因为我们没有为网络指定任何路由,当然,我们也没有任何特定的防火墙规则。如果我们想创建我们的子网网络,我们必须用自定义模式创建网络。执行此操作的命令是

gcloud compute --project=<your project name> networks create practicaldevopsgcp-custom --subnet-mode=custom

该命令的结果显示了网络的创建和用于创建防火墙规则的命令(参见清单 10-3 )。

pierluigi_riti@practicaldevopsgcp-197023:~$ gcloud compute --project=practicaldevopsgcp-197023 networks create practicaldevopsgcp-custom --subnet-mode=custom
Created [https://www.googleapis.com/compute/v1/projects/practicaldevopsgcp-197023/global/networks/practicaldevopsgcp-custom].
NAME                      SUBNET_MODE  BGP_ROUTING_MODE  IPV4_RANGE  GATEWAY_IPV4
practicaldevopsgcp-custom CUSTOM       REGIONAL
Instances on this network will not be reachable until firewall rules
are created. As an example, you can allow all internal traffic between
instances as well as SSH, RDP, and ICMP by running:
$ gcloud compute firewall-rules create <FIREWALL_NAME> --network practicaldevopsgcp-custom --allow tcp,udp,icmp --source-ranges <IP_RANGE>
$ gcloud compute firewall-rules create <FIREWALL_NAME> --network practicaldevopsgcp-custom --allow tcp:22,tcp:3389,icmp

Listing 10-3The Result of the Command to Create the Network in Custom Mode

网络现在显示在谷歌云控制台上,但因为我们没有在网络上添加任何子网,这只是在自定义模式下创建的名称(图 10-8 )。

img/464715_1_En_10_Fig8_HTML.jpg

图 10-8

创建的没有子网的自定义网络

下一步是创建与网络相关的子网。创建与网络相关联的子网的命令是

gcloud compute --project=<you project name> networks subnets create practicaldevopsgcp-subnet --network=practicaldevopsgcp-custom --region=us-central1 --range=10.0.0.0/24

用于创建网络的参数首先需要子网的名称。我们将网络的新子网与参数--network相关联。该命令的结果如清单 10-4 所示。

pierluigi_riti@practicaldevopsgcp-197023:~$ gcloud compute --project=practicaldevopsgcp-197023 networks subnets create practicaldevopsgcp-subnet --network=practicaldevopsgcp
-custom --region=us-central1 --range=10.0.0.0/24
Created [https://www.googleapis.com/compute/v1/projects/practicaldevopsgcp-197023/regions/us-central1/subnetworks/practicaldevopsgcp-subnet].
NAME                      REGION      NETWORK                   RANGE
practicaldevopsgcp-subnet  us-central1  practicaldevopsgcp-custom  10.0.0.0/24

Listing 10-4The Result of the Subnet Associated with the Network

该命令将新的子网与我们之前创建的网络相关联。我们可以在控制台中看到与网络相关联的子网(图 10-9 )。

img/464715_1_En_10_Fig9_HTML.jpg

图 10-9

与先前网络相关联的子网

我们现在已经创建了一个网络,并将其与一个子网网络相关联。对于自定义网络,我们必须为要复制 VPC 的每个区域创建一个子网。

创建和维护防火墙规则

你已经学会了如何创造一个新的 VPC,但是创造一个 VPC 是不够的。为了保证访问的安全性,我们必须配置防火墙。防火墙是网络安全的基本组件之一,防火墙的目的是在流量不遵守某些规则的情况下拒绝或允许流量进入网络。

我们看到,当我们创建 VPC 时,GCP 为我们的 VPC 分配了一些默认防火墙规则。这是为了定义 VPC 允许或拒绝哪些流量,但这些规则不足以管理网络。为此,我们必须创建和管理管理 VPC 所需的防火墙规则。现在您将学习如何使用gcloud创建新的防火墙规则。创建新防火墙规则的命令是

gcloud compute firewall-rules create [NAME] \
    [--network [NETWORK]; default="default"] \
    [--priority [PRIORITY];default=1000] \
    [--direction (ingress|egress|in|out); default="ingress"] \
    [--action (deny | allow )] \
    [--target-tags [TAG][,TAG,...]] \
    [--target-service-accounts=[IAM Service Account] \
    [--source-ranges [CIDR-RANGE][, CIDR-RANGE...]] \
    [--source-tags [TAG][,TAG,...]] \
    [--source-service-accounts=[IAM Service Account] \
    [--destination-ranges [CIDR-RANGE][,CIDR-RANGE...]] \
    [--rules ([PROTOCOL][:PORT[-PORT]],[PROTOCOL[:PORT[-PORT]],...]] | all ) \
    [--disabled | --no-disabled]

所有这些参数都用于定义我们想要创建的防火墙规则的类型。以下是所有参数及其在创建防火墙规则中的作用。

  • --network:该参数表示我们创建防火墙规则的网络。如果我们没有指明任何网络,规则是在default网络中创建它。

  • --priority:表示规则优先级的数值。最低级别是 65535,通常分配给默认防火墙规则。数字越小,规则的优先级越高。数字越大,表示规则的优先级越低。

  • --direction:该参数表示规则的方向。入口是用来表示从源到目标的流量的方向。出口是指示从目标到目的地的流量的方向。

  • --action:此参数表示我们希望对防火墙规则执行什么操作。我们可以定义两个动作之一:

    • allow:这允许连接

    • deny:这阻止了连接

防火墙规则必须应用于目标。该目标可以是网络或服务用户。定义目标的两个不同值是

  • --target-tags:用于表示防火墙规则适用的网络。

  • --target-service-accounts:表示该规则适用的服务账户。

如果我们没有定义任何目标值,那么规则只适用于整个网络。配置的另一个重要部分是我们想要用来定义规则方向的流量方向。对于入口规则,我们必须指定一个源。我们可以指定三种类型的来源。

  • --source-ranges:通过这个标志,我们可以指定 CIDR 格式的源地址的范围。

  • 有了这个标志,我们将规则应用于所有来自特定标记网络的 IP 地址。

  • 使用这个标志,我们可以为一个服务帐户指定所有的 IP 地址。只有在不配置源标签的情况下,我们才能使用这个标签。

如果我们不指定任何来源,我们将在任何地方应用该规则,因为它适用于 IP 0.0.0.0/0。我们可以定义一个出口规则来使用目的地。这只有以下选择:

  • --destination-range:该标志使用 CIDR 格式定义目的 IP 的范围。

如果我们省略 destination 选项,出口目的地将应用于 IP 0.0.0.0/0 的任何地方。--rules选项定义规则适用于哪些协议和端口。如果我们使用All,我们将该规则应用于 VPC 网络中的所有协议和端口。防火墙规则的一个例子是

gcloud compute --project=<your project name> firewall-rules create test --direction=INGRESS --priority=1000 --network=practicaldevopsgcp-custom --action=deny --rules=tcp

该命令的结果是创建规则(参见清单 10-5 )。

pierluigi_riti@practicaldevopsgcp-197023:~$ gcloud compute --project=practicaldevopsgcp-197023 firewall-rules create test --direction=INGRESS --priority=1000 --network=practical
devopsgcp-custom --action=deny --rules=tcp
Creating firewall...Created [https://www.googleapis.com/compute/v1/projects/practicaldevopsgcp-197023/global/firewalls/test].
Creating firewall...done.
NAME  NETWORK                    DIRECTION    PRIORITY    ALLOW  DENY
test  practicaldevopsgcp-custom  INGRESS      1000        tcp

Listing 10-5The Newly Created Firewall Rule

如果我们想要更新防火墙规则,我们可以使用相同的基本语法,只是我们不使用firewall-rules create,而是使用firewall-rules update命令。

在 GCP 创建和维护路线

在本章的开始,你学习了什么是路线。每个网络都有一些由系统生成的从 VPC 网络到 Internet 的路由。我们不能覆盖到同一网络中另一个子网的路由,但我们可以覆盖默认路由 0.0.0.0/0。我们可以创建到特定目的地范围的路线。这是为了将流量定向到 VPN 隧道、特定实例或其他目的地。

当我们规划网络时,我们希望确保不要覆盖任何现有路由。我们可以用这个简单的命令列出网络中的实际路由:

gcloud compute routes list

该命令的结果显示了系统中实际配置的所有路由。我们可以在清单 10-6 中看到路由的摘录。

pierluigi_riti@practicaldevopsgcp-197023:~$ gcloud compute routes list
NAME                            NETWORK  DEST_RANGE     NEXT_HOP             PRIORITY
default-route-1d7c378c35a58bf1  default  10.142.0.0/20  default              1000
default-route-2733f6b435addfb8  default  10.146.0.0/20  default              1000
default-route-27ee2255201b7609  default  10.152.0.0/20  default              1000
default-route-2ba825e5b5d3dd2a  default  10.160.0.0/20  default              1000
default-route-2eca2b974eff32fb  default  0.0.0.0/0      default-internet-gateway     1000

Listing 10-6The Route List Result

要查看单个路由的详细信息,我们可以使用以下命令:

gcloud compute routes describe <route name>

例如,我们可以使用以下命令行查看其中一条默认路由的详细信息:

gcloud compute routes describe default-route-9702087d924fe3ad

结果是路线的描述。

creationTimestamp: '2018-07-29T14:07:03.497-07:00'
description: Default local route to the subnetwork 10.132.0.0/20.
destRange: 10.132.0.0/20
id: '1148425788491797144'
kind: compute#route
name: default-route-9702087d924fe3ad
network: https://www.googleapis.com/compute/v1/projects/practicaldevopsgcp-197023/global/networks/practicaldevopsgcp
nextHopNetwork: https://www.googleapis.com/compute/v1/projects/practicaldevopsgcp-197023/global/networks/practicaldevopsgcp
priority: 1000
selfLink: https://www.googleapis.com/compute/v1/projects/practicaldevopsgcp-197023/global/routes/default-route-9702087d924fe3ad

路由描述向我们显示了与路由相关的信息,例如,路由的创建、路由的种类、与路由相关联的网络以及网络的下一跳。

我们希望对路由执行的最重要的操作是创建新的静态路由。创建新静态路由的语法是

gcloud compute routes create [ROUTE] \
--destination-range [DEST_RANGE] \
--network [NETWORK]\
[--tags=TAG,[TAG,...]] \
[--next-hop-address=[ADDRESS]] |
[--next-hop-gateway=default-internet-gateway]  |
[--next-hop-instance=[INSTANCE_NAME] |
[--next-hop-vpn-tunnel=[VPN_TUNNEL]]

用于创建路线的参数指示了我们在 GCP 创建新路线所需的所有信息。

  • --destination-range:该值表示输出数据包的目的地范围。

  • --network:表示我们定义规则的网络。我们必须小心地正确指示网络,否则我们可能会将路由应用到另一个网络。

  • --tags:我们可以使用这个选项来指示我们想要将哪个虚拟机关联到该路由。

跃点参数只能指定一次。我们可以在同一个定义中有两个跳跃参数。参数说明如下:

  • --next-hop-address:用于指定路由想要发送流量的 IP 地址。

  • --next-hop-gateway:此标志用于指定我们可以通过哪个子网将数据包发送到互联网连接。

  • --next-hop-instance:该标志用于指定我们要用来发送数据包的实例。

  • --next-hop-vpn-tunnel:该标志用于指定我们要通过哪个 VPN 隧道发送数据包。

生成新路由的命令是

gcloud compute --project=<your project name> routes create route-gcp --network=default --priority=1000 --destination-range=10.0.0.0/16 --next-hop-gateway=default-internet-gateway

操作的结果显示了路线的创建(列表 10-7 )。

gcloud compute --project=practicaldevopsgcp-197023 routes create route-gcp --network=default --priority=1000 --destination-range=
10.0.0.0/16 --next-hop-gateway=default-internet-gateway
Created [https://www.googleapis.com/compute/v1/projects/practicaldevopsgcp-197023/global/routes/route-gcp].
NAME       NETWORK  DEST_RANGE   NEXT_HOP                     PRIORITY
route-gcp  default  10.0.0.0/16  default-internet-gateway     1000

Listing 10-7The Result of the Route Creation

对于 GCP,默认情况下,我们不能将 IP 转发到另一个实例。这意味着我们可以向一个 IP 发送数据包,除非该 IP 与目的地不匹配,但是当我们想要创建一个新的路由或使用路由数据包的实例时,我们必须转发该 IP。为了转发 IP,我们必须创建带有标志--can-ip-forward的实例。为此,命令行如下:

gcloud compute instances create ... --can-ip-forward

这将创建能够转发 IP 的实例,并允许实例使用路由的帮助。我们必须研究的最后一个命令是删除路由。要删除一条路由,我们可以使用以下命令:

gcloud compute routes delete [ROUTE]

此命令删除名称中指示的路由。

结论

本章讲述了在 GCP 创建和维护网络和私有云资源的基础知识。当我们规划云项目时,这一功能非常重要。我们必须仔细规划网络,确保网络始终可达,并与客户保持准确的 SLA。此外,精心规划的网络有助于防止黑客攻击导致的数据泄露和服务中断。除了良好的路由之外,拥有强大的防火墙规则有助于加快网络速度,并防止黑客最常见的攻击。