TCP 代理 Codelab - 使用 TCP 代理负载平衡器进行速率限制和 IP 拒绝列表

1. 简介

Google Cloud 负载均衡是在全球 Google 入网点 (POP) 的 Google 网络边缘部署的。定向到 TCP 代理负载平衡器的用户流量会进入距离用户最近的 POP,然后在 Google 全球网络上进行负载均衡,传输到具有足够可用容量的最近后端。

Cloud Armor 是 Google 的分布式拒绝服务和 Web 应用防火墙 (WAF) 检测系统。Cloud Armor 与 Google Cloud TCP 代理负载平衡器紧密耦合,可让您对传入流量进行查询,以找出不需要的请求。借助此服务的速率限制功能,您可以根据请求量限制对后端资源的流量,并防止不受欢迎的流量占用您的虚拟私有云 (VPC) 网络上的资源。

借助 Google Cloud TCP/SSL 代理负载平衡器,您可以在后端服务之间代理 TCP/ SSL 类型的流量。

在本实验中,您将创建一个包含后端服务的 TCP/SSL 负载平衡器,并将对负载平衡器的访问权限限制为仅限一组特定的用户客户端。

be33dadf836374bb.png

学习内容

  • 如何创建 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. 要求

自定进度的环境设置

  1. 登录 Cloud 控制台,然后创建一个新项目或重复使用现有项目。 如果您还没有 Gmail 或 Google Workspace 账号,则必须创建一个

注意:通过记住 Cloud 控制台的网址 (console.cloud.google.com),您可以轻松访问 Cloud 控制台。

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

请记住项目 ID,它在所有 Google Cloud 项目中都是唯一的名称(上述名称已被占用,您无法使用,抱歉!)。它稍后将在此 Codelab 中被称为 PROJECT_ID。

注意:如果您使用的是 Gmail 账号,可以将默认位置设置为“无组织”。如果您使用的是 Google Workspace 账号,请选择对贵组织来说合理的位置。

  1. 接下来,您需要在 Cloud 控制台中启用结算功能,才能使用 Google Cloud 资源。

运行此 Codelab 应该不会产生太多的费用(如果有费用的话)。请务必按照“清理”部分中的所有说明操作,该部分介绍了如何关停资源,以免产生超出本教程范围的结算费用。Google Cloud 的新用户符合参与 300 美元免费试用计划的条件。

启动 Cloud Shell

虽然可以通过笔记本电脑对 Google Cloud 进行远程操作,但在此 Codelab 中,您将使用 Google Cloud Shell,这是一个在云端运行的命令行环境。

在 GCP 控制台中,点击右上角工具栏上的 Cloud Shell 图标:

bce75f34b2c53987.png

预配和连接到环境应该只需要片刻时间。完成后,您应该会看到如下内容:

f6ef2b5f13479f3a.png

这个虚拟机已加载了您需要的所有开发工具。它提供了一个持久的 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 区域中创建 instance1-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

为负载平衡器 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 条规则。

第 1 条规则会通过设置安全政策来拒绝特定 IP 访问 TCP 负载平衡器,第 2 条规则会执行速率限制。

  1. 在 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

立即请求可能会收到来自负载平衡器的响应,但请等到 curl 请求被拒绝或被丢弃,然后查看 Cloud Logging 中的日志,以验证触发的 IP 地址拒绝规则的日志条目。

前往 Cloud Logging,在“资源”下,将资源类型选择为“tcp_ssl_proxy_rule”,并将后端目标设置为“my-tcp-lb”。

通过为过滤定义的资源,我们可以验证 IP 拒绝规则是否有效(根据日志条目中的 PRIORITY 值为 1000),以及配置的操作 “DENY” 操作是否有效,因为这两项都遵循了拒绝规则,并且 IP 被拒绝,如下所示

db9b835e0360dcaf.png

8. 验证速率限制规则

在短时间内发送超出定义阈值(每分钟 5 个请求)的大量请求,以验证速率限制规则是否生效。

完成后,点击 Cloud Armor 服务中的“查看日志”,系统会将您转到 Cloud Logging,您可以在其中按负载平衡器过滤日志,以查看 Cloud Armor 日志。

速率限制条目应如下图所示。我们可以通过日志条目中的 PRIORITY 值 3000 来验证速率限制规则是否生效,并且根据配置的操作,“RATE BASED BAN” 操作已根据速率限制规则的说明生效。

37c76e5d7532623.png

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