GSP474

概览
流量镜像是 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 网络环境,如上图所示
- 使用
gcloud
命令创建 2 个虚拟机,充当 Web 服务器
- 使用
gcloud
命令创建单个虚拟机,以充当 IDS
- 创建内部负载均衡器 (ILB),充当数据包镜像的“收集器”
- 在 IDS 虚拟机上安装并配置开源 IDS (Suricata)
- 查看一些基本的 IDS 提醒规则
- 创建数据包镜像政策
- 通过生成流向“镜像”子网的网络流量来测试数据包镜像
- 生成网络流量来模拟 IDS 事件并查看 IDS 日志记录,从而测试 Suricata IDS
设置和要求
点击“开始实验”按钮前的注意事项
请阅读以下说明。实验是计时的,并且您无法暂停实验。计时器在您点击开始实验后即开始计时,显示 Google Cloud 资源可供您使用多长时间。
此实操实验可让您在真实的云环境中开展实验活动,免受模拟或演示环境的局限。为此,我们会向您提供新的临时凭据,您可以在该实验的规定时间内通过此凭据登录和访问 Google Cloud。
为完成此实验,您需要:
- 能够使用标准的互联网浏览器(建议使用 Chrome 浏览器)。
注意:请使用无痕模式(推荐)或无痕浏览器窗口运行此实验。这可以避免您的个人账号与学生账号之间发生冲突,这种冲突可能导致您的个人账号产生额外费用。
注意:请仅使用学生账号完成本实验。如果您使用其他 Google Cloud 账号,则可能会向该账号收取费用。
如何开始实验并登录 Google Cloud 控制台
-
点击开始实验按钮。如果该实验需要付费,系统会打开一个对话框供您选择支付方式。左侧是“实验详细信息”窗格,其中包含以下各项:
- “打开 Google Cloud 控制台”按钮
- 剩余时间
- 进行该实验时必须使用的临时凭据
- 帮助您逐步完成本实验所需的其他信息(如果需要)
-
点击打开 Google Cloud 控制台(如果您使用的是 Chrome 浏览器,请右键点击并选择在无痕式窗口中打开链接)。
该实验会启动资源并打开另一个标签页,显示“登录”页面。
提示:将这些标签页安排在不同的窗口中,并排显示。
注意:如果您看见选择账号对话框,请点击使用其他账号。
-
如有必要,请复制下方的用户名,然后将其粘贴到登录对话框中。
{{{user_0.username | "<用户名>"}}}
您也可以在“实验详细信息”窗格中找到“用户名”。
-
点击下一步。
-
复制下面的密码,然后将其粘贴到欢迎对话框中。
{{{user_0.password | "<密码>"}}}
您也可以在“实验详细信息”窗格中找到“密码”。
-
点击下一步。
重要提示:您必须使用实验提供的凭据。请勿使用您的 Google Cloud 账号凭据。
注意:在本实验中使用您自己的 Google Cloud 账号可能会产生额外费用。
-
继续在后续页面中点击以完成相应操作:
- 接受条款及条件。
- 由于这是临时账号,请勿添加账号恢复选项或双重验证。
- 请勿注册免费试用。
片刻之后,系统会在此标签页中打开 Google Cloud 控制台。
注意:如需访问 Google Cloud 产品和服务,请点击导航菜单,或在搜索字段中输入服务或产品的名称。
激活 Cloud Shell
Cloud Shell 是一种装有开发者工具的虚拟机。它提供了一个永久性的 5GB 主目录,并且在 Google Cloud 上运行。Cloud Shell 提供可用于访问您的 Google Cloud 资源的命令行工具。
-
点击 Google Cloud 控制台顶部的激活 Cloud Shell
。
-
在弹出的窗口中执行以下操作:
- 继续完成 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 自动补全功能。
- (可选)您可以通过此命令列出活跃账号名称:
gcloud auth list
- 点击授权。
输出:
ACTIVE: *
ACCOUNT: {{{user_0.username | "ACCOUNT"}}}
To set the active account, run:
$ gcloud config set account `ACCOUNT`
- (可选)您可以通过此命令列出项目 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 命令完成。
- 运行以下命令,创建虚拟专用网:
gcloud compute networks create dm-stamford \
--subnet-mode=custom
- 在 中向 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}}}
- 在 中向 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) 将镜像流量转发到一组收集器。在此例中,收集器组包含一个虚拟机。
- 为后端服务创建基本健康检查:
gcloud compute health-checks create tcp hc-tcp-80 --port 80
- 创建将用于 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}}}
- 将创建的 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}}}
- 创建前端转发规则,以充当收集端点:
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 虚拟机
-
在 Cloud 控制台的导航菜单中,依次前往 Compute Engine > 虚拟机实例。
-
点击 IDS 虚拟机的 SSH 按钮。

浏览器会打开一个新窗口,让您可以在 IDS 虚拟机内运行命令。
- 更新 IDS 虚拟机:
sudo apt-get update -y
- 安装 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
- 安装 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 内执行。
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 虚拟机应该会收到该子网的镜像流量。
生成流向“镜像”子网的流量
- 使用 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 的公共地址,结果应该相同。
- 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 三次握手。
-
在浏览器中打开一个新标签页,然后使用 HTTP 协议打开分配给 WEB1 的公共地址。如果您愿意,也可以使用 Cloud 控制台中的“curl”实用程序。
-
将 [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 ...
- 如果您浏览至 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 规则/提醒。
- 从其中一个 Web 服务器运行以下命令,以生成 DNS 出站流量:
dig @8.8.8.8 example.com
- 现在,在 IDS 虚拟机上的 Suricata 事件日志文件中查看提醒。
切换到 IDS 虚拟机的 SSH 窗口
- 在 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”规则/提醒
- 从其中一个 Web 服务器运行以下命令,以生成 TCP 出站流量,将 [PUBLIC_IP_WEB2] 替换为“WEB2”的公共 IP 地址:
telnet [PUBLIC_IP_WEB2] 6667
-
输入 ctrl+c
以退出。
-
现在,在 IDS 虚拟机上的 Suricata 事件日志文件中查看提醒。
切换到 IDS 虚拟机的 SSH 窗口
- 从 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”规则/提醒
-
从 Cloud Shell 运行以下命令,以生成 ICMP 入站流量。
-
将 [PUBLIC_IP_WEB1] 替换为“WEB1”的公共 IP 地址。
ping -c 3 [PUBLIC_IP_WEB1]
- 现在,在 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 页面。
- 将 [PUBLIC_IP_WEB1] 替换为“WEB1”的公共 IP 地址。
http://[PUBLIC_IP_WEB1]/index.php
- 现在,在 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 的商标。其他所有公司名和产品名可能是其各自相关公司的商标。