1. 简介
Google Cloud Load Balancing 部署于全球 Google 入网点 (POP) 的 Google 网络边缘。定向到 TCP 代理负载平衡器的用户流量会进入距离用户最近的 POP,然后通过 Google 的全球网络进行负载均衡,传输到有足够可用容量的最近后端。
Cloud Armor 是 Google 的分布式拒绝服务攻击和 Web 应用防火墙 (WAF) 检测系统。Cloud Armor 与 Google Cloud TCP 代理负载平衡器紧密耦合,让您可以查询传入流量,看是否存在不必要的请求。借助此服务的速率限制功能,您可以根据请求量限制流向后端资源的流量,并防止不受欢迎的流量消耗您的 Virtual Private Cloud (VPC) 网络上的资源。
Google Cloud TCP/SSL 代理负载平衡器允许您在后端服务之间代理 TCP/ SSL 类型的流量。
在此 Codelab 中,您将创建一个具有后端服务的 TCP/SSL 代理负载平衡器,并使用 Cloud Armor 限制只有一组特定用户客户端可以访问该负载平衡器。
学习内容
- 如何创建 TCP/SSL 代理负载平衡器
- 如何创建 Cloud Armor 安全政策
- 如何在 Cloud Armor 中为 TCP/SSL 代理负载平衡器创建 IP 拒绝列表规则
- 如何在 Cloud Armor 中为 TCP 代理负载平衡器创建速率限制规则
- 如何将安全政策添加到 TCP/SSL 负载均衡后端服务
所需条件
- 具备 Google Compute Engine 基础知识 ( Codelab)
- 网络组建和管理以及 TCP/IP 基础知识
- Unix/Linux 命令行基础知识
- 通过 Google Cloud 中的网络完成 GCP 中的网络导览,很有帮助
2. 要求
自定进度的环境设置
注意:通过记住 Cloud 控制台的网址(即 console.cloud.google.com),您可以轻松访问 Cloud 控制台。
请记住项目 ID,它在所有 Google Cloud 项目中都是唯一的名称(上述名称已被占用,您无法使用,抱歉!)。稍后,此 Codelab 将将其称为 PROJECT_ID。
注意:如果您使用的是 Gmail 账号,则可将默认位置设置为“无单位”。如果您使用的是 Google Workspace 账号,请选择对贵组织来说合理的位置。
- 接下来,您需要在 Cloud 控制台中启用结算功能,才能使用 Google Cloud 资源。
运行此 Codelab 应该不会产生太多的费用(如果有费用的话)。请务必按照“清理”部分部分,其中会指导您如何关停资源,以免产生超出本教程范围的结算费用。Google Cloud 的新用户符合参与 300 美元的免费试用计划的条件。
启动 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. 创建后端服务
按如下方式创建 2 个实例:在 us-central1-b 可用区中创建实例 1-b1
gcloud compute instances create vm-1-b1 \ --image-family debian-9 \ --image-project debian-cloud \ --tags tcp-lb \ --zone us-central1-b \ --metadata startup-script="#! /bin/bash sudo apt-get update sudo apt-get install apache2 -y sudo sed -i '/Listen 80/c\Listen 110' /etc/apache2/ports.conf sudo service apache2 restart echo '<!doctype html><html><body><h1>This is VM1-b1 in central1-b</h1></body></html>' | tee /var/www/html/index.html EOF"
在 us-central1-b 可用区中创建实例 1-b2
gcloud compute instances create vm-1-b2 \ --image-family debian-9 \ --image-project debian-cloud \ --tags tcp-lb \ --zone us-central1-b \ --metadata startup-script="#! /bin/bash sudo apt-get update sudo apt-get install apache2 -y sudo sed -i '/Listen 80/c\Listen 110' /etc/apache2/ports.conf sudo service apache2 restart echo '<!doctype html><html><body><h1>This is VM1-b2 in central1-b</h1></body></html>' | tee /var/www/html/index.html EOF"
创建实例组 vm-ig1
gcloud compute instance-groups unmanaged create vm-ig1 --zone us-central1-b
为实例组创建一个已命名的端口。在本实验中,我们将使用端口 110
gcloud compute instance-groups set-named-ports vm-ig1 \ --named-ports tcp 110:110 --zone us-central1-b
将实例添加到实例组
gcloud compute instance-groups unmanaged add-instances vm-ig1 \ --instances vm-1-b1,vm-1-b2 --zone us-central1-b
4. 配置负载平衡器
接下来,我们将创建健康检查。
gcloud compute health-checks create tcp my-tcp-health-check --port 110
创建后端服务
gcloud compute backend-services create my-tcp-lb --global-health-checks --global \ --protocol TCP --health-checks my-tcp-health-check --timeout 5m --port-name tcp110
将实例组添加到后端服务
gcloud compute backend-services add-backend my-tcp-lb --global --instance-group \ vm-ig1 --instance-group-zone us-central1-b --balancing-mode UTILIZATION \ --max-utilization 0.8
配置目标 TCP 代理
gcloud compute target-tcp-proxies create my-tcp-lb-target-proxy --backend-service \ my-tcp-lb --proxy-header NONE
预留全局静态 IPv4 地址
您将使用此 IP 地址访问负载均衡服务。
gcloud compute addresses create tcp-lb-static-ipv4 --ip-version=IPV4 --global
为 LB IP 地址配置全局转发规则。
gcloud compute forwarding-rules create my-tcp-lb-ipv4-forwarding-rule \ --global --target-tcp-proxy my-tcp-lb-target-proxy --address LB_STATIC_IPV4 \ --ports 110
5. 为 TCP 代理负载平衡器创建防火墙规则
gcloud compute firewall-rules create allow-tcplb-and-health \ --source-ranges 130.211.0.0/22,35.191.0.0/16 \ --target-tags tcp-lb \ --allow tcp:110
创建负载平衡器后,使用以下命令对其进行测试
Curl LB_IP:110
接下来,创建虚拟机以验证对负载平衡器的访问遭拒的验证
您应该创建 2 个实例,每个实例都具有一个公共 IP 地址且名为 test-server1 和 test-server2
6. 在 Cloud Armor 中创建安全政策
在本部分中,您将在 Cloud Armor 的政策中创建一项后端安全政策和 2 条规则。
第一条规则通过设置安全政策来拒绝某些 IP,拒绝一组有限的 IP 访问 TCP 负载平衡器,第二条规则将执行速率限制。
- 在 Cloud Shell 中(请参阅“设置和要求”下的“启动 Cloud Shell”,了解如何使用 Cloud Shell),创建名为 rate-limit-and-deny-tcp 的后端服务安全政策,如下所示
gcloud compute security-policies create rate-limit-and-deny-tcp \ --description "policy for tcp proxy rate limiting and IP deny"
将规则添加到安全政策
接下来,将拒绝列表规则添加到 Cloud Armor 政策“rate-limit-and-deny-tcp”。
gcloud compute security-policies rules create 1000 --action deny --security-policy \ rate-limit-and-deny-tcp --description "deny test-server1" --src-ip-ranges \ "enter-test-server-1ip-here"
向 Cloud Armor 安全政策“rate-limit-and-deny-tcp”添加速率限制规则
gcloud compute security-policies rules create 3000 \ --security-policy=rate-limit-and-deny-tcp \ --expression="true" --action=rate-based-ban --rate-limit-threshold-count=5 \ --rate-limit-threshold-interval-sec=60 --ban-duration-sec=300 \ --conform-action=allow --exceed-action=deny-404 --enforce-on-key=IP
将政策附加到 TCP 代理后端服务:
运行以下命令以确保安全政策已附加到 TCP 代理后端服务。
gcloud compute backend-services update my-tcp-lb --security-policy \ rate-limit-and-deny-tcp
启用 TCP 代理负载平衡器的日志记录
gcloud beta compute backend-services update my-tcp-lb \ --enable-logging --logging-sample-rate=1
7. 验证拒绝名单规则
登录在拒绝列表规则中指定了 IP 的测试服务器,验证拒绝列表规则,然后运行以下命令
Curl LB_IP:110
即时请求可能会从 LB 收到响应,但需等到 curl 请求遭拒或被丢弃,然后查看 Cloud Logging 中的日志,确认所触发的 IP 拒绝规则对应的日志条目。
转到 Cloud Logging,然后在资源下选择“tcp_ssl_proxy_rule”资源类型并将后端目标设置为“my-tcp-lb”。
为过滤定义资源后,我们可以从日志条目中的 PRIORITY 值 1000 验证 IP 拒绝规则是否有效,以及配置的操作 "DENY" 操作是否有效,因为两者都根据拒绝规则和 IP 被拒绝,如下所示
8. 验证速率限制规则
通过在短时间内发送大量超出指定阈值(每分钟 5 个请求)的请求,验证速率限制规则是否有效。
完成上述操作后,点击 Cloud Armor 服务中的“View logs”(查看日志),即可转到 Cloud Logging,在这里您可以按负载平衡器过滤日志,即时查看 Cloud Armor 日志。
速率限制条目应如以下屏幕截图所示。通过日志条目中的 PRIORITY 值 3000,我们可以验证速率限制规则是否有效,以及从所配置的操作中,我们可以按照速率限制规则的说明,验证“基于费率的禁止”操作是否有效。
9. 环境清理
请务必清理所创建的基础设施,以避免未使用的基础设施产生费用。
最快的方法是删除 GCP 中的整个项目,以确保没有无人使用的悬空资源。不过,使用以下命令删除各个资源
TCP 代理负载平衡器
gcloud compute target-tcp-proxies delete my-tcp-lb
实例组
gcloud compute instance-groups unmanaged delete vm-ig1
已创建 2 个测试虚拟机实例
gcloud compute instances delete Instance_name --zone=instance_zone
后端服务
gcloud compute backend-services delete BACKEND_SERVICE_NAME
政策中的 Cloud Armor 规则
gcloud compute security-policies rules delete 1000 \ --security-policy=rate-limit-and-deny-tcp && gcloud compute security-policies rules delete 3000 \ --security-policy=rate-limit-and-deny-tcp
Cloud Armor 安全政策
gcloud compute security-policies delete rate-limit-and-deny-tcp