1. 简介
Google Cloud HTTP(S) 负载均衡部署于全球 Google 入网点 (POP) 的 Google 网络边缘。定向到 HTTP(S) 负载均衡器的用户流量会进入距离用户最近的 POP,然后在 Google 全球网络上进行负载均衡,传输到具有足够可用容量的最近后端。
Cloud Armor 是 Google 的分布式拒绝服务攻击和 Web 应用防火墙 (WAF) 检测系统。Cloud Armor 与 Google Cloud HTTP 负载平衡器紧密耦合,让您可以查询传入流量,看是否存在不必要的请求。借助此服务的速率限制功能,您可以根据请求量限制流向后端资源的流量,并防止不受欢迎的流量消耗您的 Virtual Private Cloud (VPC) 网络上的资源。
在本实验中,您将利用全球后端配置 HTTP 负载均衡器,如下图所示。然后,您需要对该负载平衡器进行压力测试,并添加一项 Cloud Armor 速率限制政策,以限制传入您的后端资源的流量。
学习内容
- 如何设置 HTTP 负载平衡器并进行适当的健康检查。
- 如何创建 Cloud Armor 速率限制政策。
- 如何验证从虚拟机运行压力测试时,速率限制政策是否屏蔽了流量。
所需条件
- 网络基本知识和 HTTP 知识
- Unix/Linux 命令行基础知识
2. 设置和要求
自定进度的环境设置
- 登录 Google Cloud 控制台,然后创建一个新项目或重复使用现有项目。如果您还没有 Gmail 或 Google Workspace 账号,则必须创建一个。
- 项目名称是此项目参与者的显示名称。它是 Google API 尚未使用的字符串,您可以随时对其进行更新。
- 项目 ID 在所有 Google Cloud 项目中必须是唯一的,并且不可变(一经设置便无法更改)。Cloud Console 会自动生成一个唯一字符串;通常情况下,您无需关注该字符串。在大多数 Codelab 中,您都需要引用项目 ID(它通常标识为
PROJECT_ID
),因此如果您不喜欢某个 ID,请再生成一个随机 ID,还可以尝试自己创建一个,并确认是否可用。然后,项目创建后,ID 会处于“冻结”状态。 - 第三个值是一些 API 使用的项目编号。如需详细了解所有这三个值,请参阅文档。
- 接下来,您需要在 Cloud Console 中启用结算功能,才能使用 Cloud 资源/API。运行此 Codelab 应该不会产生太多的费用(如果有费用的话)。要关闭资源以避免产生超出本教程范围的费用,请按照此 Codelab 末尾提供的任何“清理”说明操作。Google Cloud 的新用户符合参与 $300 USD 免费试用计划的条件。
启动 Cloud Shell
虽然可以通过笔记本电脑对 Google Cloud 进行远程操作,但在此 Codelab 中,您将使用 Google Cloud Shell,这是一个在云端运行的命令行环境。
在 GCP 控制台中,点击右上角工具栏上的 Cloud Shell 图标:
预配和连接到环境应该只需要片刻时间。完成后,您应该会看到如下内容:
这个虚拟机已加载了您需要的所有开发工具。它提供了一个持久的 5GB 主目录,并且在 Google Cloud 中运行,大大增强了网络性能和身份验证功能。只需一个浏览器,即可完成本实验中的所有工作。
准备工作
在 Cloud Shell 中,确保已设置项目 ID
gcloud config list project gcloud config set project [YOUR-PROJECT-NAME] PROJECT_ID=[YOUR-PROJECT-NAME] echo $PROJECT_ID
启用 API
启用所有必要的服务
gcloud services enable compute.googleapis.com gcloud services enable logging.googleapis.com gcloud services enable monitoring.googleapis.com
3. 配置防火墙规则以允许 HTTP 流量进入后端
配置防火墙规则,以允许来自 Google Cloud 健康检查和负载平衡器的 HTTP 流量传输到后端。
我们将使用在您项目中创建的 default VPC 网络。创建防火墙规则以允许 HTTP 流量进入后端。健康检查可确定负载均衡器的哪些实例能接收新连接。对于 HTTP 负载均衡,对负载均衡实例的健康检查探测来自于 130.211.0.0/22 和 35.191.0.0/16 范围内的地址。您的 VPC 防火墙规则必须允许这些连接。此外,负载平衡器会与同一 IP 范围内的后端进行通信。
- 在 Cloud 控制台中,前往导航菜单 ( ) >VPC 网络 >防火墙。
- 请注意现有的 ICMP、internal、RDP 和 SSH 防火墙规则。每个 Google Cloud 项目都从 default 网络和这些防火墙规则开始。
- 点击创建防火墙规则。
- 设置以下值,将所有其他值保留为默认值:
属性 | 值(按照说明输入值或选择选项) |
名称 | default-allow-health-check |
网络 | default |
目标 | 指定的目标标记 |
目标标记 | http-server |
来源过滤条件 | IP 范围 |
来源 IP 地址范围 | 130.211.0.0/22、35.191.0.0/16 |
协议和端口 | 指定的协议和端口;然后勾选“tcp” |
- 点击创建。
或者,如果您使用的是 gcloud 命令行。命令如下:
gcloud compute firewall-rules create default-allow-health-check --direction=INGRESS --priority=1000 --network=default --action=ALLOW --rules=tcp --source-ranges=130.211.0.0/22,35.191.0.0/16 --target-tags=http-server
4. 配置实例模板并创建代管式实例组
托管式实例组可使用实例模板来创建一组相同的实例。您可以使用这些实例来创建 HTTP 负载均衡器的后端。
配置实例模板
实例模板是一种用于创建虚拟机实例和代管式实例组的 API 资源。实例模板可定义机器类型、启动磁盘映像、子网、标签和其他实例属性。为 us-east1 和 europe-west1 各创建一个实例模板。
- 在 Cloud 控制台中,前往导航菜单 ( ) >Compute Engine >实例模板,然后点击创建实例模板。
- 对于名称,输入 us-east1-template。
- 对于系列,选择 N1。
- 点击网络、磁盘、安全、管理、单租户。
- 转到管理部分 -
- 在元数据下,点击添加项并指定以下内容:
键 | 值 |
startup-script-url | gs://cloud-training/gcpnet/httplb/startup.sh |
- 点击网络。
- 设置以下值,并将所有其他值保留为默认值 -
属性 | 值(按照说明输入值或选择选项) |
网络(在“网络接口”下) | 默认 |
子网(网络接口下) | 默认值 (us-east1) |
网络标记 | http-server |
- 点击创建。
- 等待实例模板创建完毕。
现在,通过复制 us-east1-template 为 subnet-b 创建另一个实例模板:
- 点击 us-east1-template,然后点击顶部的复制选项。
- 对于名称,输入 europe-west1-template。
- 点击网络、磁盘、安全、管理、单租户。
- 点击网络。
- 在网络接口下,修改默认接口。对于子网,选择 default (europe-west1)。
- 点击创建。
创建托管式实例组
在 us-east1 和 europe-west1 中各创建一个托管式实例组。
- 仍然在 Compute Engine 中,点击左侧菜单中的实例组。
- 点击创建实例组。选择新建代管式实例组(无状态)。
- 设置以下值,将所有其他值保留为默认值:
属性 | 值(按照说明输入值或选择选项) |
名称 | us-east1-mig |
位置 | 多个可用区 |
区域 | us-east1 |
实例模板 | us-east1-模板 |
自动扩缩 >自动扩缩政策 >点击 铅笔图标 >指标类型 | CPU 利用率 |
目标 CPU 利用率 | 80,点击“完成”。 |
冷却期 | 45 |
实例数下限 | 1 |
实例数上限 | 5 |
- 点击创建。
现在重复相同的过程,为 europe-west1 中的 europe-west1-mig 创建第二个实例组:
- 点击创建实例组。
- 设置以下值,将所有其他值保留为默认值:
属性 | 值(按照说明输入值或选择选项) |
名称 | europe-west1-mig |
位置 | 多个可用区 |
区域 | europe-west1 |
实例模板 | europe-west1-template 中 |
自动扩缩 >自动扩缩政策 >点击 铅笔图标 >指标类型 | CPU 利用率 |
目标 CPU 利用率 | 80,点击“完成”。 |
冷却期 | 45 |
实例数下限 | 1 |
实例数上限 | 5 |
- 点击创建。
5. 配置 HTTP 负载平衡器
配置 HTTP 负载平衡器,在两个后端(us-east1 中的 us-east1-mig 和 europe-west1 中的 europe-west1-mig)之间均衡流量,如以下网络图所示:
开始配置
- 在 Cloud 控制台中,点击导航菜单 ( ) >点击网络服务 >负载均衡,然后点击创建负载平衡器。
- 在 HTTP(S) 负载均衡下,点击开始配置。
- 依次选择从互联网到我的虚拟机、传统 HTTP(S) 负载平衡器,然后点击继续。
- 将名称设置为 http-lb。
配置后端
后端服务会将传入的流量定向到一个或多个关联的后端。每个后端由一个实例组和附加的服务容量元数据组成。
- 点击后端配置。
- 对于后端服务和后端存储桶,点击创建后端服务。
- 设置以下值,将所有其他值保留为默认值:
属性 | 值(按照说明选择选项) |
名称 | http-backend |
实例组 | us-east1-mig |
端口号 | 80 |
均衡模式 | 请求速率 |
RPS 上限 | 50(每个实例) |
容量 | 100 |
- 点击完成。
- 点击添加后端。
- 设置以下值,将所有其他值保留为默认值:
属性 | 值(按照说明选择选项) |
实例组 | europe-west1-mig |
端口号 | 80 |
均衡模式 | 利用率 |
后端利用率上限 | 80 |
容量 | 100 |
- 点击完成。
- 对于健康检查,请选择创建健康检查。
- 设置以下值,将所有其他值保留为默认值:
属性 | 值(按照说明选择选项) |
名称 | http-health-check |
协议 | TCP |
端口 | 80 |
- 点击保存。
- 选中启用日志记录框。
- 将 Sample Rate 设置为 1:
- 点击创建以创建后端服务。
配置前端
主机和路径规则决定将如何定向您的流量。例如,您可以将视频流量定向到一个后端,将静态流量定向到另一个后端。不过,主机和路径规则的配置并不在本实验的涵盖范围内。
- 点击前端配置。
- 指定以下内容,并将所有其他值保留为默认值:
属性 | 值(按照说明输入值或选择选项) |
协议 | HTTP |
IP 版本 | IPv4 |
IP 地址 | 临时 |
端口 | 80 |
- 点击完成。
- 点击添加前端 IP 和端口。
- 指定以下内容,并将所有其他值保留为默认值:
属性 | 值(按照说明输入值或选择选项) |
协议 | HTTP |
IP 版本 | IPv6 |
IP 地址 | 临时 |
端口 | 80 |
- 点击完成。
查看并创建 HTTP 负载平衡器
- 点击检查并最终确定。
- 检查后端服务和前端。
- 点击创建。
- 等待负载均衡器创建完毕。
- 点击负载均衡器的名称 (http-lb)。
- 请记下负载均衡器的 IPv4 和 IPv6 地址,下一个任务中会用到。它们将分别称为 [LB_IP_v4] 和 [LB_IP_v6]。
6. 测试 HTTP 负载平衡器
现在您已经为自己的后端创建了 HTTP 负载均衡器,接下来验证流量会转发到该后端服务。
访问 HTTP 负载平衡器
若要测试对 HTTP 负载均衡器的 IPv4 访问,在浏览器中打开一个新标签页,并转到 http://[LB_IP_v4]。请务必将 [LB_IP_v4] 替换为负载平衡器的 IPv4 地址。
如果您有本地 IPv6 地址,请尝试前往 http://[LB_IP_v6],尝试使用 HTTP 负载平衡器的 IPv6 地址。请务必将 [LB_IP_v6] 替换为负载平衡器的 IPv6 地址。
对 HTTP 负载平衡器进行压力测试
创建一个新虚拟机,使用 siege 模拟 HTTP 负载平衡器上的负载。然后确定当负载较高时,系统是否在两个后端之间均衡流量。
- 在控制台中,前往导航菜单 ( ) >Compute Engine >虚拟机实例。
- 点击创建实例。
- 设置以下值,将所有其他值保留为默认值:
属性 | 值(按照说明输入值或选择选项) |
名称 | siege-vm |
区域 | us-west1 |
可用区 | us-west1-c |
系列 | N1 |
- 点击创建。
- 等待 siege-vm 实例创建完成。
- 对于 siege-vm,点击 SSH 以启动一个终端并进行连接。
- 运行以下命令来安装 siege:
sudo apt-get -y install siege
- 如需将 HTTP 负载平衡器的 IPv4 地址存储在环境变量中,请运行以下命令,并将 [LB_IP_v4] 替换为 IPv4 地址:
export LB_IP=[LB_IP_v4]
- 若要模拟负载,请运行以下命令:
siege -c 250 http://$LB_IP
输出应类似于以下内容(请勿复制;这是输出示例):
New configuration template added to /home/student/.siege Run siege -C to view the current settings in that file ** SIEGE 4.0.4 ** Preparing 250 concurrent users for battle. The server is now under siege...
- 在 Cloud 控制台中,点击导航菜单 ( ),点击网络服务 >负载均衡。
- 点击 http-lb。
- 点击监控标签页。监控北美与两个后端之间的流量 2 到 3 分钟。
最初,流量应仅定向到 us-east1-mig,但随着 RPS 的增加,流量也会定向到 europe-west1-mig。
这表明在默认情况下,流量会转发到最近的后端,但如果负载过高,流量也会被分配到其他后端。
- 返回 siege-vm 的 SSH 终端。
- 按 CTRL+C 停止围攻。
7. 创建 Cloud Armor 速率限制政策
在本部分中,您将使用 Cloud Armor 设置速率限制政策,拒绝 siege-vm 访问 HTTP 负载平衡器。
- 在 Cloud Shell 中(请参阅“设置和要求”下的“启动 Cloud Shell”,了解如何使用 Cloud Shell),通过 gcloud 创建安全政策:
gcloud compute security-policies create rate-limit-siege \ --description "policy for rate limiting"
- 接下来,添加速率限制规则:
gcloud beta compute security-policies rules create 100 \ --security-policy=rate-limit-siege \ --expression="true" \ --action=rate-based-ban \ --rate-limit-threshold-count=50 \ --rate-limit-threshold-interval-sec=120 \ --ban-duration-sec=300 \ --conform-action=allow \ --exceed-action=deny-404 \ --enforce-on-key=IP
- 将安全政策附加到后端服务 http-backend:
gcloud compute backend-services update http-backend \ --security-policy rate-limit-siege –-global
- 在控制台中,前往导航菜单 >网络安全 >Cloud Armor。
- 点击速率限制 siege。您的政策应与以下内容类似:
验证安全政策
- 返回 siege-vm 的 SSH 终端。
- 对 LB IP 运行 curl 命令,验证您是否仍能连接到该 IP 地址,您应该能收到 200 响应。
curl http://$LB_IP
- 在 siege-vm 的 SSH 终端中,如需模拟加载,请运行以下命令:
siege -c 250 http://$LB_IP
输出应类似于以下内容(请勿复制;这是输出示例):
** SIEGE 4.0.4 ** Preparing 250 concurrent users for battle. The server is now under siege...
- 浏览安全政策日志,确定系统是否也阻止了此流量。
- 在控制台中,转到导航菜单 >网络安全 >Cloud Armor。
- 点击 rate-limit-siege。
- 点击日志。
- 点击查看政策日志。
- 在“日志记录”页面上,确保清除“查询预览”中的所有文本。
- 选择资源作为 Cloud HTTP Load Balancer >http-lb-forwarding-rule>http-lb,然后点击添加。或者,您也可以将下方 MQL(监控查询语言)查询复制并粘贴到查询修改器中:
resource.type="http_load_balancer" resource.labels.forwarding_rule_name="http-lb-forwarding-rule" resource.labels.url_map_name="http-lb"
- 现在,点击运行查询。
- 展开查询结果中的日志条目。
- 展开 httpRequest。请求应来自 siege-vm IP 地址。若非如此,请展开另外一条日志条目。
- 展开 jsonPayload。
- 展开 EnforceSecurityPolicy。
请注意,ConfigureAction 已设置为 RATE_BASED_BAN,名称为 rate-limit-siege。
- 再进行一次检查,方法是前往导航菜单 ( ),点击网络服务 >负载均衡。点击 http-lb。点击监控标签页。
您可以在图表中查看 siege 流量。您还会发现,速率限制流量不会到达后端,并且被 Cloud Armor 政策阻止。
恭喜!您已完成有关使用 Cloud Armor 进行速率限制的实验
©2020 Google LLC 保留所有权利。Google 和 Google 徽标是 Google LLC 的商标。其他所有公司名称和产品名称可能是其各自相关公司的商标。
8. 实验清理
- 导航至网络安全 >>Cloud Armor >>%POLICY NAME%,然后选择“删除 -”
- 前往网络 >>网络服务 >>负载均衡。选择您创建的负载平衡器,然后点击“删除”。
选择后端服务和健康检查作为要删除的其他资源 -
- 前往导航菜单 ( ) >Compute Engine >实例组。选择两个托管式实例组,然后点击“删除”
输入“delete”以确认删除。
等待这些代管式实例组被删除。此操作也会删除实例组中的实例。只有在实例组被删除后才可以删除模板。
- 从左侧窗格前往实例模板**。**选择两个实例模板,然后点击“删除”
- 从左侧窗格导航到虚拟机实例**。**选择 siege-vm 实例旁边的省略号,然后点击“删除”。
- 前往导航菜单 ( ) >VPC 网络 >防火墙。选择 default-allow-health-check 并点击“删除”
9. 恭喜!
您已成功使用 Cloud Armor 实施了速率限制。您配置了具有 us-east1 和 europe-west1 后端的 HTTP 负载平衡器。然后,您使用虚拟机对负载平衡器进行了压力测试,并通过 Cloud Armor 的速率限制将 IP 地址列入了拒绝名单。您能够浏览安全政策日志,以确定系统阻止流量的原因。
所学内容
- 如何设置实例模板并创建代管式实例组。
- 如何设置 HTTP 负载平衡器。
- 如何创建 Cloud Armor 速率限制政策。
- 如何验证速率限制政策是否按预期运行。
后续步骤
- 尝试根据来源 IP 地址范围设置速率限制政策。命令示例如下 -
gcloud alpha compute security-policies rules create 105 \ --security-policy sec-policy \ --src-ip-ranges "1.2.3.0/24" \ --action throttle \ --rate-limit-threshold-count 100 \ --rate-limit-threshold-interval-sec 60 \ --conform-action allow \ --exceed-action deny-429 \ --enforce-on-key IP
- 尝试根据区号设置速率限制政策。命令示例如下 -
gcloud alpha compute security-policies rules create 101 \ --security-policy sec-policy \ --expression "origin.region_code == 'US'" \ --action rate-based-ban \ --rate-limit-threshold-count 10 \ --rate-limit-threshold-interval-sec 60 \ --ban-duration-sec 300 \ --ban-threshold-count 1000 \ --ban-threshold-interval-sec 600 \ --conform-action allow \ --exceed-action deny-403 \ --enforce-on-key IP