arrow_back

将 Google Cloud 数据包镜像与开源 IDS 搭配使用

登录 加入
访问 700 多个实验和课程

将 Google Cloud 数据包镜像与开源 IDS 搭配使用

实验 1 小时 30 分钟 universal_currency_alt 1 个积分 show_chart 入门级
info 此实验可能会提供 AI 工具来支持您学习。
访问 700 多个实验和课程

GSP474

Google Cloud 自学实验的徽标

概览

流量镜像是 Google Cloud 网络中的一项关键功能,可用于安全和网络分析。其功能类似于传统网络中的网络分流器或 span 会话。简而言之,数据包镜像会捕获来自所选“镜像来源”的网络流量(入站流量和出站流量),然后复制流量并将其转发到“收集器”。

请务必注意,数据包镜像会捕获每个数据包的完整载荷,因此会占用额外的带宽。由于数据包镜像不基于任何采样周期,因此可用于更好地进行问题排查、部署安全解决方案,以及执行基于更高层应用的分析。

数据包镜像基于“数据包镜像政策”,该政策包含以下属性:

  • 区域
  • VPC 网络
  • 镜像来源
  • 收集器(目标位置)
  • 镜像流量(过滤条件)

此外,还需要考虑以下几个要点:

  • 只能对 TCP、UDP 和 ICMP 流量进行镜像。不过,这应该可以满足大多数用例的需求。
  • “镜像来源”和“收集器”必须位于同一区域,但可以位于不同的可用区,甚至是不同的 VPC 中,前提是这些 VPC 已正确对等互连。
  • 需要支付额外的带宽费用,尤其是在不同可用区之间。如需限制镜像的流量,可以使用过滤条件。

“数据包镜像”的一个主要用例是在入侵检测系统 (IDS) 解决方案中使用。某些基于云的 IDS 解决方案要求在每个来源虚拟机上运行一项特殊服务,或者在网络来源和目标位置之间串联部署一个 IDS 虚拟设备。这两种情况都具有重大影响。例如,基于服务的解决方案虽然是完全分布式的,但要求客机操作系统支持该软件。“串联”解决方案可能会造成网络瓶颈,因为所有流量都必须通过 IDS 设备。串联解决方案还无法捕获同一 VPC 中虚拟机之间的“东西向”流量。

Google Cloud 数据包镜像不要求在虚拟机上运行任何其他软件,并且完全分布在每个镜像的虚拟机上。“收集器”IDS 通过内部网络负载均衡器 (ILB) 以旁路方式部署,并会同时接收“南北向”流量和“东西向”流量。

数据包镜像实验说明

为了演示如何将数据包镜像与 IDS 搭配使用,我们参考以下使用开源 IDS Suricata 的示例。

  • 一个 VPC,包含 2 个子网,其中一个子网用于镜像来源,一个子网用于收集器
  • 创建了 2 个具有公共 IP 地址的 Web 服务器
  • 出于安全考虑,创建了 1 个没有公共 IP 的收集器服务器 (IDS)
  • 启用了 Cloud NAT,以便根据需要访问互联网
  • 为简化流程并降低费用,在同一区域和可用区中创建了所有虚拟机

在本实验中,您将创建一个 Google Cloud 环境,配置“收集器”ILB 和数据包镜像政策,并在虚拟实例上安装和配置 [Suricata] (https://suricata-ids.org/),以充当 IDS。完成后,执行网络测试,以验证数据包镜像与开源 IDS 的配置和使用情况。为简化演示,我们使用高度精简的规则集和 Suricata 配置。

Google Cloud 环境图

目标

  • 构建 Google Cloud 网络环境,如上图所示
  • 使用 gcloud 命令创建 2 个虚拟机,充当 Web 服务器
  • 使用 gcloud 命令创建单个虚拟机,以充当 IDS
  • 创建内部负载均衡器 (ILB),充当数据包镜像的“收集器”
  • 在 IDS 虚拟机上安装并配置开源 IDS (Suricata)
  • 查看一些基本的 IDS 提醒规则
  • 创建数据包镜像政策
  • 通过生成流向“镜像”子网的网络流量来测试数据包镜像
  • 生成网络流量来模拟 IDS 事件并查看 IDS 日志记录,从而测试 Suricata IDS

设置和要求

点击“开始实验”按钮前的注意事项

请阅读以下说明。实验是计时的,并且您无法暂停实验。计时器在您点击开始实验后即开始计时,显示 Google Cloud 资源可供您使用多长时间。

此实操实验可让您在真实的云环境中开展实验活动,免受模拟或演示环境的局限。为此,我们会向您提供新的临时凭据,您可以在该实验的规定时间内通过此凭据登录和访问 Google Cloud。

为完成此实验,您需要:

  • 能够使用标准的互联网浏览器(建议使用 Chrome 浏览器)。
注意:请使用无痕模式(推荐)或无痕浏览器窗口运行此实验。这可以避免您的个人账号与学生账号之间发生冲突,这种冲突可能导致您的个人账号产生额外费用。
  • 完成实验的时间 - 请注意,实验开始后无法暂停。
注意:请仅使用学生账号完成本实验。如果您使用其他 Google Cloud 账号,则可能会向该账号收取费用。

如何开始实验并登录 Google Cloud 控制台

  1. 点击开始实验按钮。如果该实验需要付费,系统会打开一个对话框供您选择支付方式。左侧是“实验详细信息”窗格,其中包含以下各项:

    • “打开 Google Cloud 控制台”按钮
    • 剩余时间
    • 进行该实验时必须使用的临时凭据
    • 帮助您逐步完成本实验所需的其他信息(如果需要)
  2. 点击打开 Google Cloud 控制台(如果您使用的是 Chrome 浏览器,请右键点击并选择在无痕式窗口中打开链接)。

    该实验会启动资源并打开另一个标签页,显示“登录”页面。

    提示:将这些标签页安排在不同的窗口中,并排显示。

    注意:如果您看见选择账号对话框,请点击使用其他账号
  3. 如有必要,请复制下方的用户名,然后将其粘贴到登录对话框中。

    {{{user_0.username | "<用户名>"}}}

    您也可以在“实验详细信息”窗格中找到“用户名”。

  4. 点击下一步

  5. 复制下面的密码,然后将其粘贴到欢迎对话框中。

    {{{user_0.password | "<密码>"}}}

    您也可以在“实验详细信息”窗格中找到“密码”。

  6. 点击下一步

    重要提示:您必须使用实验提供的凭据。请勿使用您的 Google Cloud 账号凭据。 注意:在本实验中使用您自己的 Google Cloud 账号可能会产生额外费用。
  7. 继续在后续页面中点击以完成相应操作:

    • 接受条款及条件。
    • 由于这是临时账号,请勿添加账号恢复选项或双重验证。
    • 请勿注册免费试用。

片刻之后,系统会在此标签页中打开 Google Cloud 控制台。

注意:如需访问 Google Cloud 产品和服务,请点击导航菜单,或在搜索字段中输入服务或产品的名称。 “导航菜单”图标和“搜索”字段

激活 Cloud Shell

Cloud Shell 是一种装有开发者工具的虚拟机。它提供了一个永久性的 5GB 主目录,并且在 Google Cloud 上运行。Cloud Shell 提供可用于访问您的 Google Cloud 资源的命令行工具。

  1. 点击 Google Cloud 控制台顶部的激活 Cloud Shell “激活 Cloud Shell”图标

  2. 在弹出的窗口中执行以下操作:

    • 继续完成 Cloud Shell 信息窗口中的设置。
    • 授权 Cloud Shell 使用您的凭据进行 Google Cloud API 调用。

如果您连接成功,即表示您已通过身份验证,且项目 ID 会被设为您的 Project_ID 。输出内容中有一行说明了此会话的 Project_ID

Your Cloud Platform project in this session is set to {{{project_0.project_id | "PROJECT_ID"}}}

gcloud 是 Google Cloud 的命令行工具。它已预先安装在 Cloud Shell 上,且支持 Tab 自动补全功能。

  1. (可选)您可以通过此命令列出活跃账号名称:
gcloud auth list
  1. 点击授权

输出:

ACTIVE: * ACCOUNT: {{{user_0.username | "ACCOUNT"}}} To set the active account, run: $ gcloud config set account `ACCOUNT`
  1. (可选)您可以通过此命令列出项目 ID:
gcloud config list project

输出:

[core] project = {{{project_0.project_id | "PROJECT_ID"}}} 注意:如需查看在 Google Cloud 中使用 gcloud 的完整文档,请参阅 gcloud CLI 概览指南

任务 1. 构建网络足迹

在此部分中,您将创建一个 VPC,并在该 VPC 内创建 2 个子网。这一切都将使用 Google Cloud Shell 内的 gcloud CLI 命令完成。

  1. 运行以下命令,创建虚拟专用网:
gcloud compute networks create dm-stamford \ --subnet-mode=custom
  1. 中向 VPC 添加用于镜像流量的子网:
gcloud compute networks subnets create dm-stamford-{{{project_0.default_region | REGION}}} \ --range=172.21.0.0/24 \ --network=dm-stamford \ --region={{{project_0.default_region | REGION}}}
  1. 中向 VPC 添加用于收集器的子网:
gcloud compute networks subnets create dm-stamford-{{{project_0.default_region | REGION}}}-ids \ --range=172.21.1.0/24 \ --network=dm-stamford \ --region={{{project_0.default_region | REGION}}}

点击检查我的进度以验证是否完成了以下目标:

构建网络足迹

任务 2. 创建防火墙规则和 Cloud NAT

完成本实验总共需要创建三条防火墙规则。

  • 规则 1 允许来自所有来源的流量通过标准 HTTP 端口 (TCP 80) 和 ICMP 协议访问所有虚拟机。
  • 规则 2 允许 IDS 接收来自所有来源的所有流量。请注意,在后面的部分中,请不要为 IDS 虚拟机分配公共 IP。
  • 规则 3 允许通过“Google Cloud IAP Proxy”IP 范围 TCP 端口 22 访问所有虚拟机,使您能够通过 Cloud 控制台使用 SSH 连接到虚拟机

运行以下命令,创建防火墙规则:

gcloud compute firewall-rules create fw-dm-stamford-allow-any-web \ --direction=INGRESS \ --priority=1000 \ --network=dm-stamford \ --action=ALLOW \ --rules=tcp:80,icmp \ --source-ranges=0.0.0.0/0 gcloud compute firewall-rules create fw-dm-stamford-ids-any-any \ --direction=INGRESS \ --priority=1000 \ --network=dm-stamford \ --action=ALLOW \ --rules=all \ --source-ranges=0.0.0.0/0 \ --target-tags=ids gcloud compute firewall-rules create fw-dm-stamford-iapproxy \ --direction=INGRESS \ --priority=1000 \ --network=dm-stamford \ --action=ALLOW \ --rules=tcp:22,icmp \ --source-ranges=35.235.240.0/20

点击检查我的进度以验证是否完成了以下目标:

创建 Cloud 防火墙规则和 Cloud NAT

创建 Cloud Router

  • 必须先在相应区域配置 Cloud Router,这是 Cloud NAT 的先决条件:
gcloud compute routers create router-stamford-nat-{{{project_0.default_region | REGION}}} \ --region={{{project_0.default_region | REGION}}} \ --network=dm-stamford

配置 Cloud NAT

  • 如需为没有公共 IP 的虚拟机提供互联网访问权限,必须在相应区域创建 Cloud NAT:
gcloud compute routers nats create nat-gw-dm-stamford-{{{project_0.default_region | REGION}}} \ --router=router-stamford-nat-{{{project_0.default_region | REGION}}} \ --router-region={{{project_0.default_region | REGION}}} \ --auto-allocate-nat-external-ips \ --nat-all-subnet-ip-ranges

创建的 IDS 虚拟机将不具有公共 IP,这是为了确保无法通过互联网访问它。不过,它需要具有互联网访问权限才能下载更新和安装 Suricata 数据包。

点击检查我的进度以验证是否完成了以下目标:

创建 Cloud Router 并配置 Cloud NAT

任务 3. 创建虚拟机

为 Web 服务器创建实例模板

  • 此模板会在 中准备一个 Ubuntu 服务器,并安装简单的 Web 服务:
gcloud compute instance-templates create template-dm-stamford-web-{{{project_0.default_region | REGION}}} \ --region={{{project_0.default_region | REGION}}} \ --network=dm-stamford \ --subnet=dm-stamford-{{{project_0.default_region | REGION}}} \ --machine-type=e2-small \ --image=ubuntu-1604-xenial-v20200807 \ --image-project=ubuntu-os-cloud \ --tags=webserver \ --metadata=startup-script='#! /bin/bash apt-get update apt-get install apache2 -y vm_hostname="$(curl -H "Metadata-Flavor:Google" \ http://169.254.169.254/computeMetadata/v1/instance/name)" echo "Page served from: $vm_hostname" | \ tee /var/www/html/index.html systemctl restart apache2'

为 Web 服务器创建托管式实例组

  • 以下命令使用上一步中的实例模板创建 2 个 Web 服务器:
gcloud compute instance-groups managed create mig-dm-stamford-web-{{{project_0.default_region | REGION}}} \ --template=template-dm-stamford-web-{{{project_0.default_region | REGION}}} \ --size=2 \ --zone={{{project_0.default_zone | "ZONE"}}}

为 IDS 虚拟机创建实例模板

  • 此模板会在 中准备一个没有公共 IP 的 Ubuntu 服务器:
gcloud compute instance-templates create template-dm-stamford-ids-{{{project_0.default_region | REGION}}} \ --region={{{project_0.default_region | REGION}}} \ --network=dm-stamford \ --no-address \ --subnet=dm-stamford-{{{project_0.default_region | REGION}}}-ids \ --image=ubuntu-1604-xenial-v20200807 \ --image-project=ubuntu-os-cloud \ --tags=ids,webserver \ --metadata=startup-script='#! /bin/bash apt-get update apt-get install apache2 -y vm_hostname="$(curl -H "Metadata-Flavor:Google" \ http://169.254.169.254/computeMetadata/v1/instance/name)" echo "Page served from: $vm_hostname" | \ tee /var/www/html/index.html systemctl restart apache2'

为 IDS 虚拟机创建托管式实例组

  • 以下命令使用上一步中的实例模板创建 1 个虚拟机,以配置为 IDS。我们将在后面的部分中介绍 Suricata 的安装。
gcloud compute instance-groups managed create mig-dm-stamford-ids-{{{project_0.default_region | REGION}}} \ --template=template-dm-stamford-ids-{{{project_0.default_region | REGION}}} \ --size=1 \ --zone={{{project_0.default_zone | "ZONE"}}}

点击检查我的进度以验证是否完成了以下目标:

创建虚拟机

任务 4. 创建内部负载均衡器

数据包镜像使用内部负载均衡器 (ILB) 将镜像流量转发到一组收集器。在此例中,收集器组包含一个虚拟机。

  1. 为后端服务创建基本健康检查:
gcloud compute health-checks create tcp hc-tcp-80 --port 80
  1. 创建将用于 ILB 的后端服务组:
gcloud compute backend-services create be-dm-stamford-suricata-{{{project_0.default_region | REGION}}} \ --load-balancing-scheme=INTERNAL \ --health-checks=hc-tcp-80 \ --network=dm-stamford \ --protocol=TCP \ --region={{{project_0.default_region | REGION}}}
  1. 将创建的 IDS 托管式实例组添加到上一步中创建的后端服务组:
gcloud compute backend-services add-backend be-dm-stamford-suricata-{{{project_0.default_region | REGION}}} \ --instance-group=mig-dm-stamford-ids-{{{project_0.default_region | REGION}}} \ --instance-group-zone={{{project_0.default_zone | "ZONE"}}} \ --region={{{project_0.default_region | REGION}}}
  1. 创建前端转发规则,以充当收集端点:
gcloud compute forwarding-rules create ilb-dm-stamford-suricata-ilb-{{{project_0.default_region | REGION}}} \ --load-balancing-scheme=INTERNAL \ --backend-service be-dm-stamford-suricata-{{{project_0.default_region | REGION}}} \ --is-mirroring-collector \ --network=dm-stamford \ --region={{{project_0.default_region | REGION}}} \ --subnet=dm-stamford-{{{project_0.default_region | REGION}}}-ids \ --ip-protocol=TCP \ --ports=all 注意:虽然 TCP 列为协议,但实际的镜像流量类型将在后面部分的数据包镜像政策中进行配置。另请注意,--is-mirroring-collector 标志已设置。

点击检查我的进度以验证是否完成了以下目标:

创建内部负载均衡器

任务 5. 安装开源 IDS - Suricata

注意:在接下来的 2 个部分中,您将通过 SSH 连接到 IDS 虚拟机,并在其 shell 中运行命令。请注意,不要在 Cloud Shell 中运行这些命令。

通过 SSH 连接到 IDS 虚拟机

  1. 在 Cloud 控制台的导航菜单中,依次前往 Compute Engine > 虚拟机实例

  2. 点击 IDS 虚拟机的 SSH 按钮。

IDS 虚拟机的 SSH 按钮

浏览器会打开一个新窗口,让您可以在 IDS 虚拟机内运行命令。

  1. 更新 IDS 虚拟机:
sudo apt-get update -y
  1. 安装 Suricata 依赖项:
sudo apt-get install libpcre3-dbg libpcre3-dev autoconf automake libtool libpcap-dev libnet1-dev libyaml-dev zlib1g-dev libcap-ng-dev libmagic-dev libjansson-dev libjansson4 -y sudo apt-get install libnspr4-dev -y sudo apt-get install libnss3-dev -y sudo apt-get install liblz4-dev -y sudo apt install rustc cargo -y
  1. 安装 Suricata:
sudo add-apt-repository ppa:oisf/suricata-stable -y sudo apt-get update -y sudo apt-get install suricata -y 注意:如果您在安装过程中收到错误消息,请继续执行以下验证步骤。

验证安装

  • 使用以下命令验证安装并检查已安装的 Suricata 版本:
suricata -V

输出应类似于以下内容:

This is Suricata version 5.0.3 RELEASE

任务 6. 配置和查看 Suricata

以下部分的命令和步骤也应在 IDS/Suricata 虚拟机的 SSH 内执行。

  • 停止 Suricata 服务并备份默认配置文件:
sudo systemctl stop suricata sudo cp /etc/suricata/suricata.yaml /etc/suricata/suricata.backup

下载并替换新的 Suricata 配置文件和简略规则文件

新配置文件更新了收集器接口,并且仅针对 my.rules 文件和 suricata.yaml 文件中配置的极少量流量发出提醒。对于本实验而言,Suricata 规则集和提醒的默认配置过于繁杂且冗余。

  • 运行以下命令,复制文件。
wget https://storage.googleapis.com/tech-academy-enablement/GCP-Packet-Mirroring-with-OpenSource-IDS/suricata.yaml wget https://storage.googleapis.com/tech-academy-enablement/GCP-Packet-Mirroring-with-OpenSource-IDS/my.rules sudo mkdir /etc/suricata/poc-rules sudo cp my.rules /etc/suricata/poc-rules/my.rules sudo cp suricata.yaml /etc/suricata/suricata.yaml

启动 Suricata 服务

有时,需要重启该服务。此步骤中包含 restart 命令,以应对这种可能性:

sudo systemctl start suricata sudo systemctl restart suricata

查看用于测试的简单 Suricata 规则

在本实验中,Suricata 的规则集经过缩减,仅包含 4 条规则。不过,默认的 Suricata 安装具有庞大且繁杂的规则集。

  • 将提醒精简为简洁明了的列表对本实验练习更有利,因为这样可以轻松测试每条规则。
cat /etc/suricata/poc-rules/my.rules

输出应显示总共 4 条规则以及每条规则的说明。

####RULES##### #UDP ALERTS alert udp $HOME_NET any -> 8.8.8.8 53 (msg:"BAD UDP DNS REQUEST"; sid:99996; rev:1;) #HTTP ALERTS alert http any any -> $HOME_NET 80 (msg:"BAD HTTP PHP REQUEST"; http.uri; content:"index.php"; sid:99997; rev:1;) #ICMP ALERTS alert icmp any any -> $HOME_NET any (msg:"BAD ICMP"; sid:99998; rev:1;) #TCP ALERTS alert tcp $HOME_NET any -> any 6667 (msg:"BAD TCP 6667 REQUEST"; sid:99999; rev:1;) 注意:标准规则文件通常位于 /etc/suricata/rules//var/lib/suricata/rules 中。在本实验的第 2 步中,已将其重新配置到了其他位置。

任务 7. 配置数据包镜像政策

对于实验的这一部分,请返回到 Cloud Shell

只需一个简单的命令(或通过 GUI 中的“向导”)即可完成数据包镜像政策的设置。在此命令中,您需要指定“数据包镜像说明”部分提到的全部 5 个属性。

  • 区域
  • VPC 网络
  • 镜像来源
  • 收集器(目标位置)
  • 镜像流量(过滤条件)

您可能会注意到,上文并未提及“镜像流量”。这是因为该政策将配置为镜像“所有”流量,因此不需要任何过滤条件。该政策将同时镜像入站流量和出站流量,并将其转发到 Suricata IDS 设备,此设备是收集器 ILB 的一部分。

  • Cloud Shell 中运行以下命令,配置数据包镜像政策:
gcloud compute packet-mirrorings create mirror-dm-stamford-web \ --collector-ilb=ilb-dm-stamford-suricata-ilb-{{{project_0.default_region | REGION}}} \ --network=dm-stamford \ --mirrored-subnets=dm-stamford-{{{project_0.default_region | REGION}}} \ --region={{{project_0.default_region | REGION}}}

此时,数据包镜像和 Suricata 配置应已完成。以下部分将对这两项进行测试。

点击检查我的进度以验证是否完成了以下目标:

配置数据包镜像政策

任务 8. 测试数据包镜像

在本部分中,您需要访问 IDS 虚拟机 shell。如果 shell 窗口仍处于打开状态,请使用该窗口。如果 shell 窗口已关闭,请重新连接。

您还将使用 Cloud Shell,充当“互联网客户端”。

花几分钟时间找到两个 Web 虚拟机的外部 IP。

在 Cloud 控制台的导航菜单中,依次点击 Compute Engine > 虚拟机实例,然后记下两个 Web 虚拟机的外部 IP。分别将其称为 [PUBLIC_IP_WEB1][PUBLIC_IP_WEB2]

您也可以通过 Cloud Shell 中的 gcloud 命令收集相同的信息:

gcloud compute instances list

返回 IDS 虚拟机 shell

测试数据包镜像

  • 在 IDS/Suricata 虚拟机上运行数据包捕获 (tcpdump) 流程,并使用以下过滤条件:
sudo tcpdump -i ens4 -nn -n "(icmp or port 80) and net 172.21.0.0/24" 注意:172.21.0.0/24 网络是镜像子网;IDS 虚拟机不属于该子网。如果数据包镜像配置正确,IDS 虚拟机应该会收到该子网的镜像流量。

生成流向“镜像”子网的流量

  1. 使用 Cloud Shell 终端,ping 通分配给 WEB1 的公共地址,将 [PUBLIC_IP_WEB1] 替换为“WEB1”的公共 IP 地址(可在 Cloud 控制台中查看):
sudo apt install iputils-ping ping -c 4 [PUBLIC_IP_WEB1]

数据包镜像应复制该流量并将其转发到 IDS 虚拟机,您应该能够在第 1 步的数据包捕获流程中看到它。IDS 虚拟机上的输出应类似于以下内容,其中 X.X.X.X 是 ICMP 请求的来源 IP 地址。在 tcpdump 输出中,您应该会看到 WEBSERVER 的专用 IP。Google Cloud 会在边缘进行网络转换。

00:55:32.980666 IP X.X.X.X > 172.21.0.2: ICMP echo request, id 3399, seq 0, length 64 00:55:32.980801 IP 172.21.0.2 > X.X.X.X: ICMP echo reply, id 3399, seq 0, length 64 00:55:33.968920 IP X.X.X.X > 172.21.0.2: ICMP echo request, id 3399, seq 1, length 64 00:55:33.968965 IP 172.21.0.2 > X.X.X.X: ICMP echo reply, id 3399, seq 1, length 64 00:55:34.980472 IP X.X.X.X > 172.21.0.2: ICMP echo request, id 3399, seq 2, length 64 00:55:34.980521 IP 172.21.0.2 > X.X.X.X: ICMP echo reply, id 3399, seq 2, length 64 00:55:35.986354 IP X.X.X.X > 172.21.0.2: ICMP echo request, id 3399, seq 3, length 64 00:55:35.986445 IP 172.21.0.2 > X.X.X.X: ICMP echo reply, id 3399, seq 3, length 64

如果您 ping 通 WEB2 的公共地址,结果应该相同。

  1. ping 通分配给 WEB2 的公共地址,将 [PUBLIC_IP_WEB2] 替换为“WEB2”的公共 IP 地址。
ping -c 4 [PUBLIC_IP_WEB2]

数据包镜像应将该流量转发到 IDS 虚拟机,您应该能够在第 1 步的数据包捕获流程中看到它。IDS 虚拟机上的输出应类似于以下内容。请注意,在 tcpdump 输出中,您应该会看到 WEBSERVER 的专用 IP。Google Cloud 会在边缘进行网络转换。

00:00:45.309407 IP X.X.X.X > 172.21.0.3: ICMP echo request, id 25159, seq 0, length 64 00:00:45.309736 IP 172.21.0.3 > X.X.X.X: ICMP echo reply, id 25159, seq 0, length 64 00:00:46.309406 IP X.X.X.X > 172.21.0.3: ICMP echo request, id 25159, seq 1, length 64 00:00:46.309602 IP 172.21.0.3 > X.X.X.X: ICMP echo reply, id 25159, seq 1, length 64 00:00:47.306278 IP X.X.X.X > 172.21.0.3: ICMP echo request, id 25159, seq 2, length 64 00:00:47.306406 IP 172.21.0.3 > X.X.X.X: ICMP echo reply, id 25159, seq 2, length 64 00:00:48.314506 IP X.X.X.X > 172.21.0.3: ICMP echo request, id 25159, seq 3, length 64 00:00:48.314698 IP 172.21.0.3 > X.X.X.X: ICMP echo reply, id 25159, seq 3, length 64

为了更好地证明数据包镜像不仅仅显示第 3 层标头,以下测试将展示对其中一个 Web 服务器发起的标准 HTTP GET 请求过程,其中包括初始的 TCP 三次握手。

  1. 在浏览器中打开一个新标签页,然后使用 HTTP 协议打开分配给 WEB1 的公共地址。如果您愿意,也可以使用 Cloud 控制台中的“curl”实用程序。

  2. 将 [PUBLIC_IP_WEB1] 替换为“WEB1”的公共 IP 地址

http://[PUBLIC_IP_WEB1]/

数据包镜像应将该流量转发到 IDS 虚拟机,您应该能够在第 1 步的数据包捕获流程中看到它。

IDS 虚拟机上的输出应类似于以下内容:

00:00:46.761748 IP X.X.X.60835 > 172.21.0.2.80: Flags [S]... 00:00:46.763037 IP 172.21.0.2.80 > X.X.X.60835: Flags [S.], ... ack ... 00:00:46.816407 IP X.X.X.60835 > 172.21.0.2.80: Flags [.], ack ... 00:00:46.823624 IP X.X.X.60835 > 172.21.0.2.80: Flags [P.], ... HTTP: GET / HTTP/1.1 00:00:46.823832 IP 172.21.0.2.80 > X.X.X.60835: Flags [.], ack ... 00:00:46.824549 IP 172.21.0.2.80 > X.X.X.60835: Flags [P.], ... HTTP: HTTP/1.1 200 OK 00:00:46.879214 IP X.X.X.60835 > 172.21.0.2.80: Flags [.], ack ... 00:00:46.888477 IP X.X.X.60835 > 172.21.0.2.80: Flags [F.], ... 00:00:46.888662 IP 172.21.0.2.80 > X.X.X.60835: Flags [F.], ... ack... 00:00:46.943915 IP X.X.X.60835 > 172.21.0.2.80: Flags [.], ack ...
  1. 如果您浏览至 WEB2 的公共地址,结果也应如此。将 [PUBLIC_IP_WEB2] 替换为“WEB2”的公共 IP 地址
http://[PUBLIC_IP_WEB2]/

数据包镜像应将该流量转发到 IDS 虚拟机,您应该能够在第 1 步的数据包捕获流程中看到它。

IDS 虚拟机上的输出应类似于以下内容。

00:00:58.819740 IP X.X.X.X.62335 > 172.21.0.3.80: Flags [S]... 00:00:58.820027 IP 172.21.0.3.80 > X.X.X.X.62335: Flags [S.], ... ack ... 00:00:58.875301 IP X.X.X.X.62335 > 172.21.0.3.80: Flags [.], ack ... 00:00:58.875329 IP X.X.X.X.62335 > 172.21.0.3.80: Flags [P.], ... HTTP: GET / HTTP/1.1 00:00:58.875448 IP 172.21.0.3.80 > X.X.X.X.62335: Flags [.], ack ... 00:00:58.876204 IP 172.21.0.3.80 > X.X.X.X.62335: Flags [P.], ... HTTP: HTTP/1.1 200 OK 00:00:58.929015 IP X.X.X.X.62335 > 172.21.0.3.80: Flags [.], ack ... 00:00:58.929047 IP X.X.X.X.62335 > 172.21.0.3.80: Flags [F.], ... 00:00:58.929244 IP 172.21.0.3.80 > X.X.X.X.62335: Flags [F.], ... ack... 00:00:58.993844 IP X.X.X.X.62335 > 172.21.0.3.80: Flags [.], ack ...

在 IDS 虚拟机内,输入 ctrl+c 以退出 tcpdump。

任务 9. 测试 Suricata IDS 检查和提醒

本实验的最后一部分是测试数据包镜像与开源 IDS Suricata 的集成。花点时间查看在“配置和查看 Suricata”部分的第 4 步中设置为发出提醒的 4 条 Suricata 规则:

####RULES##### #UDP ALERTS alert udp $HOME_NET any -> 8.8.8.8 53 (msg:"BAD UDP DNS REQUEST"; sid:99996; rev:1;) #HTTP ALERTS alert http any any -> $HOME_NET 80 (msg:"BAD HTTP PHP REQUEST"; http.uri; content:"index.php"; sid:99997; rev:1;) #ICMP ALERTS alert icmp any any -> $HOME_NET any (msg:"BAD ICMP"; sid:99998; rev:1;) #TCP ALERTS alert tcp $HOME_NET any -> any 6667 (msg:"BAD TCP 6667 REQUEST"; sid:99999; rev:1;)

以下 4 个步骤将引导您生成能够触发每条规则的网络流量。您应该会在 Suricata 事件日志文件中看到每条规则被触发后的提醒。

注意:请确保您已为 IDS 虚拟机和 Web 服务器虚拟机打开 SSH 窗口。您需要同时查看这两个虚拟机才能完成此部分。

TEST1 和 TEST2 将从 WEBSERVER 启动,并测试出站流量。

TEST3 和 TEST4 将在 Cloud Shell 中启动,并测试入站流量。

测试 1:测试出站流量 UDP 规则/提醒。

  1. 从其中一个 Web 服务器运行以下命令,以生成 DNS 出站流量:
dig @8.8.8.8 example.com
  1. 现在,在 IDS 虚拟机上的 Suricata 事件日志文件中查看提醒。

切换到 IDS 虚拟机的 SSH 窗口

  1. 在 IDS 虚拟机的 SSH 窗口中运行以下命令:
egrep "BAD UDP DNS" /var/log/suricata/eve.json

日志条目应类似于以下内容:

@GCP: {"timestamp":"2020-08-14T01:23:14.903210+0000","flow_id":412864167987242,"in_iface":"ens4","event_type":"alert","src_ip":"172.21.0.2","src_port":47020,"dest_ip":"8.8.8.8","dest_port":53,"proto":"UDP","alert":{"action":"allowed","gid":1,"signature_id":99996,"rev":1,"signature":"BAD UDP DNS REQUEST","category":"","severity":3},"dns":{"query":[{"type":"query","id":17268,"rrname":"EXAMPLE.COM","rrtype":"A","tx_id":0}]},"app_proto":"dns","flow":{"pkts_toserver":1,"pkts_toclient":0,"bytes_toserver":82,"bytes_toclient":0,"start":"2020-08-19T18:23:14.903210+0000"}}

测试 2:测试出站流量“TCP”规则/提醒

  1. 从其中一个 Web 服务器运行以下命令,以生成 TCP 出站流量,将 [PUBLIC_IP_WEB2] 替换为“WEB2”的公共 IP 地址:
telnet [PUBLIC_IP_WEB2] 6667
  1. 输入 ctrl+c 以退出。

  2. 现在,在 IDS 虚拟机上的 Suricata 事件日志文件中查看提醒。

切换到 IDS 虚拟机的 SSH 窗口

  1. 从 IDS 虚拟机的 SSH 窗口运行以下命令:
egrep "BAD TCP" /var/log/suricata/eve.json

日志条目应类似于以下内容:

@GCP: {"timestamp":"2020-08-14T01:27:45.058526+0000","flow_id":479376049300638,"in_iface":"ens4","event_type":"alert","src_ip":"172.21.0.2","src_port":36168,"dest_ip":"100.64.1.1","dest_port":6667,"proto":"TCP","alert":{"action":"allowed","gid":1,"signature_id":99999,"rev":1,"signature":"BAD TCP 6667 REQUEST","category":"","severity":3},"flow":{"pkts_toserver":1,"pkts_toclient":0,"bytes_toserver":74,"bytes_toclient":0,"start":"2020-08-19T18:27:45.058526+0000"}}

测试 3:测试入站流量“ICMP”规则/提醒

  1. Cloud Shell 运行以下命令,以生成 ICMP 入站流量。

  2. 将 [PUBLIC_IP_WEB1] 替换为“WEB1”的公共 IP 地址。

ping -c 3 [PUBLIC_IP_WEB1]
  1. 现在,在 IDS 虚拟机上的 Suricata 事件日志文件中查看提醒:
egrep "BAD ICMP" /var/log/suricata/eve.json

日志条目应类似于以下内容:

@GCP: {"timestamp":"2020-08-14T01:24:46.065250+0000","flow_id":1114966772874978,"in_iface":"ens4","event_type":"alert","src_ip":"X.X.X.X","dest_ip":"172.21.0.2","proto":"ICMP","icmp_type":8,"icmp_code":0,"alert":{"action":"allowed","gid":1,"signature_id":99998,"rev":1,"signature":"BAD ICMP","category":"","severity":3},"flow":{"pkts_toserver":1,"pkts_toclient":0,"bytes_toserver":98,"bytes_toclient":0,"start":"2020-08-19T18:24:46.065250+0000"}}

测试 4:测试入站流量“HTTP”规则/提醒。

使用本地工作站的网络浏览器或 Cloud Shell 中的 curl,通过 HTTP 协议浏览分配给 WEB1 的公共地址,以访问 index.php 页面。

  1. 将 [PUBLIC_IP_WEB1] 替换为“WEB1”的公共 IP 地址。
http://[PUBLIC_IP_WEB1]/index.php
  1. 现在,在 IDS 虚拟机上的 Suricata 事件日志文件中查看提醒:
egrep "BAD HTTP" /var/log/suricata/eve.json

日志条目应类似于以下内容:

@GCP: {"timestamp":"2020-08-14T01:26:36.794124+0000","flow_id":1901424684045611,"in_iface":"ens4","event_type":"alert","src_ip":"X.X.X.X","src_port":61132,"dest_ip":"172.21.0.3","dest_port":80,"proto":"TCP","tx_id":0,"alert":{"action":"allowed","gid":1,"signature_id":99997,"rev":1,"signature":"BAD HTTP PHP REQUEST","category":"","severity":3},"http":{"hostname":"PUBLIC_IP_WEB1","url":"\/index.php","http_user_agent":"curl\/7.64.1","http_content_type":"text\/html","http_method":"GET","protocol":"HTTP\/1.1","status":404,"length":275},"app_proto":"http","flow":{"pkts_toserver":7,"pkts_toclient":6,"bytes_toserver":658,"bytes_toclient":1284,"start":"2020-08-19T18:26:36.660779+0000"}}

恭喜!

至此,关于 Google Cloud 数据包镜像与开源 IDS Suricata 搭配使用的实验已完成。

后续步骤/了解详情

如需详细了解数据包镜像,请参阅以下内容:

如需详细了解 Suricata,请访问 https://suricata-ids.org/

Google Cloud 培训和认证

…可帮助您充分利用 Google Cloud 技术。我们的课程会讲解各项技能与最佳实践,可帮助您迅速上手使用并继续学习更深入的知识。我们提供从基础到高级的全方位培训,并有点播、直播和虚拟三种方式选择,让您可以按照自己的日程安排学习时间。各项认证可以帮助您核实并证明您在 Google Cloud 技术方面的技能与专业知识。

本手册的最后更新时间:2024 年 11 月 18 日

本实验的最后测试时间:2023 年 9 月 6 日

版权所有 2025 Google LLC 保留所有权利。Google 和 Google 徽标是 Google LLC 的商标。其他所有公司名和产品名可能是其各自相关公司的商标。

准备工作

  1. 实验会创建一个 Google Cloud 项目和一些资源,供您使用限定的一段时间
  2. 实验有时间限制,并且没有暂停功能。如果您中途结束实验,则必须重新开始。
  3. 在屏幕左上角,点击开始实验即可开始

使用无痕浏览模式

  1. 复制系统为实验提供的用户名密码
  2. 在无痕浏览模式下,点击打开控制台

登录控制台

  1. 使用您的实验凭证登录。使用其他凭证可能会导致错误或产生费用。
  2. 接受条款,并跳过恢复资源页面
  3. 除非您已完成此实验或想要重新开始,否则请勿点击结束实验,因为点击后系统会清除您的工作并移除该项目

此内容目前不可用

一旦可用,我们会通过电子邮件告知您

太好了!

一旦可用,我们会通过电子邮件告知您

一次一个实验

确认结束所有现有实验并开始此实验

使用无痕浏览模式运行实验

请使用无痕模式或无痕式浏览器窗口运行此实验。这可以避免您的个人账号与学生账号之间发生冲突,这种冲突可能导致您的个人账号产生额外费用。