1. 简介和概览
DNS Armor 由 Infoblox 提供支持,是一项全托管式服务,可为您的 Google Cloud 工作负载提供 DNS 层安全性。其高级威胁检测器旨在在攻击链的最早阶段(即 DNS 查询)检测恶意活动,而不会增加运维复杂性或性能开销。
此 Codelab 提供了有关如何配置和测试 DNS Armor 服务的分步说明。您将设置必要的网络基础设施,创建威胁检测器,通过模拟 DNS 威胁来测试服务,最后使用 Logs Explorer 分析威胁日志。
构建内容
在此 Codelab 中,您将预配以下资源:
- 两个 VPC 网络:
network-a和network-b network-a将包含us-east4和us-central1区域中的子网和虚拟机。network-b将仅包含us-east4中的子网和虚拟机。- 配置为检查 DNS 查询的 DNS Armor 高级威胁检测器。

学习内容
- 如何预配必要的网络资源,包括 VPC 和虚拟机。
- 如何部署高级威胁检测器并排除特定网络。
- 如何使用威胁模拟脚本验证威胁检测配置。
- 如何在日志浏览器中分析威胁日志。
所需条件
- Google Cloud 项目
- 对
gcloud命令行工具的访问权限。
2. 前提条件
在本部分中,您将执行以下任务:
- 验证您的 Google Cloud 项目是否满足必要的组织政策限制条件。
- 确认您的用户账号具有所需的 IAM 角色和权限。
- 启用此 Codelab 必需的 Google Cloud API。
- 向 Compute Engine 服务账号分配
roles/logging.viewerIAM 角色。
组织政策限制条件
为成功完成此 Codelab,请验证应用于项目的组织政策限制条件。某些政策可能会妨碍必要资源的配置。以下限制可能会影响此 Codelab 的配置:
constraints/gcp.resourceLocations:限制可创建资源的区域;此 Codelab 需要us-east4和us-central1。constraints/compute.vmExternalIpAccess:防止创建具有公共 IP 地址的虚拟机,如果您不按照实验手册使用--no-address标志,这可能会干扰设置。constraints/compute.shieldedVm:强制创建安全强化型虚拟机,而实验的虚拟机创建命令并未指定安全强化型虚拟机,这可能会导致错误。constraints/gcp.restrictServiceUsage:限制可启用的 Google Cloud API,如果不允许compute.googleapis.com、networksecurity.googleapis.com、logging.googleapis.com和monitoring.googleapis.com,可能会导致无法完成实验。
IAM 角色和权限
如需成功完成此 Codelab,请验证授予您用户的 IAM 角色和权限。您需要拥有以下 IAM 角色和权限才能完成此 Codelab。
- Service Usage Admin (
roles/serviceusage.serviceUsageAdmin):用于为 Codelab 启用所需的 Google Cloud API。 - Compute Network Admin (
roles/compute.networkAdmin):用于创建和管理 VPC 网络、子网和 Cloud NAT。 - Compute Security Admin (
roles/compute.securityAdmin):用于配置防火墙规则,以实现对虚拟机的 SSH 访问。 - Compute Instance Admin (v1) (
roles/compute.instanceAdmin.v1):用于创建和管理实验所需的虚拟机。 - IAP-secured Tunnel User (
roles/iap.tunnelResourceAccessor):通过 Identity-Aware Proxy (IAP) 使用 SSH 连接到虚拟机。 - Network Security Admin (
roles/networksecurity.admin):用于创建和管理 DNS Armor 威胁检测器。 - Logs Viewer (
roles/logging.viewer):在 Logs Explorer 中查看和分析威胁日志。
Google Cloud API
请确保已在您的项目中启用所需的 Google Cloud API。
1. 启用必要的 API,在 Cloud Shell 中运行以下 gcloud 命令。
gcloud services enable compute.googleapis.com \
networksecurity.googleapis.com \
logging.googleapis.com \
monitoring.googleapis.com
2. 验证 API 是否已启用,在 Cloud Shell 中运行以下 gcloud 命令。
gcloud services list --enabled
Compute Engine 服务账号
测试脚本需要获得从 Cloud Logging 读取威胁日志的权限。由于脚本将从利用默认 Compute Engine 服务账号的虚拟机执行,因此必须为此服务账号分配 roles/logging.viewer IAM 角色。
1. 设置环境变量,在 Cloud Shell 中运行以下命令。
export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')
2. 向 Compute Engine 服务账号授予日志查看者角色。在 Cloud Shell 中运行以下 gcloud 命令
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:${PROJECT_NUMBER}-compute@developer.gserviceaccount.com" \
--role="roles/logging.viewer"
3. 基本环境设置
在本部分中,您将执行以下任务:
- 创建具有自定义子网的 VPC 网络(
network-a和network-b)。 - 在
network-a和network-b中配置 Cloud Router 和 Cloud NAT 以实现互联网出站流量。 - 创建防火墙规则,以允许通过 SSH 从 IAP 的 IP 范围访问虚拟机(针对
network-a和network-b)。 - 在
network-a和network-b中预配没有公共 IP 地址的 Linux 虚拟机。
创建 VPC 和子网
1. 在 us-east4 和 us-central1 区域中创建 network-a 及其子网。在 Cloud Shell 中运行以下 gcloud 命令。
gcloud compute networks create network-a --subnet-mode=custom
gcloud compute networks subnets create subnet-a-use4 \
--network=network-a \
--range=10.10.0.0/24 \
--region=us-east4
gcloud compute networks subnets create subnet-a-usc1 \
--network=network-a \
--range=10.10.1.0/24 \
--region=us-central1
2. 在 us-east4 区域中创建 network-b 及其子网。在 Cloud Shell 中运行以下 gcloud 命令。
gcloud compute networks create network-b --subnet-mode=custom
gcloud compute networks subnets create subnet-b-use4 \
--network=network-b \
--range=10.20.0.0/24 \
--region=us-east4
配置互联网出站流量
1. 为 network-a 创建 Cloud Router 和 Cloud NAT,以允许没有公共 IP 的虚拟机进行互联网出站。
gcloud compute routers create router-a-use4 \
--network=network-a \
--region=us-east4
gcloud compute routers nats create nat-a-use4 \
--router=router-a-use4 \
--auto-allocate-nat-external-ips \
--nat-all-subnet-ip-ranges \
--region=us-east4
gcloud compute routers create router-a-usc1 \
--network=network-a \
--region=us-central1
gcloud compute routers nats create nat-a-usc1 \
--router=router-a-usc1 \
--auto-allocate-nat-external-ips \
--nat-all-subnet-ip-ranges \
--region=us-central1
2. 为 network-b 创建 Cloud Router 和 Cloud NAT,以允许没有公共 IP 的虚拟机进行互联网出站。
gcloud compute routers create router-b-use4 \
--network=network-b \
--region=us-east4
gcloud compute routers nats create nat-b-use4 \
--router=router-b-use4 \
--auto-allocate-nat-external-ips \
--nat-all-subnet-ip-ranges \
--region=us-east4
配置防火墙规则
1. 为 network-a 创建防火墙规则,以允许通过 IAP 的 IP 范围进行 SSH 访问。在 Cloud Shell 中运行以下 gcloud 命令。
gcloud compute firewall-rules create allow-ssh-iap-a \
--network=network-a \
--allow=tcp:22 \
--source-ranges=35.235.240.0/20
2. 为 network-b 创建防火墙规则,以允许通过 IAP 的 IP 范围进行 SSH 访问。在 Cloud Shell 中运行以下 gcloud 命令。
gcloud compute firewall-rules create allow-ssh-iap-b \
--network=network-b \
--allow=tcp:22 \
--source-ranges=35.235.240.0/20
创建虚拟机
1. 在 network-a 中创建 Linux 虚拟机
gcloud compute instances create vm-a-use4 \
--zone=us-east4-c \
--network=network-a \
--subnet=subnet-a-use4 \
--no-address \
--scopes=cloud-platform
gcloud compute instances create vm-a-usc1 \
--zone=us-central1-a \
--network=network-a \
--subnet=subnet-a-usc1 \
--no-address \
--scopes=cloud-platform
2. 在 network-b 中创建 Linux 虚拟机
gcloud compute instances create vm-b-use4 \
--zone=us-east4-c \
--network=network-b \
--subnet=subnet-b-use4 \
--no-address \
--scopes=cloud-platform
4. 创建 DNS 威胁检测器
在本部分中,您将执行以下任务:
- 创建威胁检测器。
- 列出威胁检测器。
- 描述资源。
现在,VPC、子网和虚拟机已完成配置,下一步是创建 DNS 威胁检测器。
1. 使用 gcloud beta network-security dns-threat-detectors create 命令创建威胁检测器。使用 --excluded-networks 标志可排除 network-b。
gcloud beta network-security dns-threat-detectors create my-dns-threat-detector \
--location=global \
--provider=infoblox \
--excluded-networks=projects/$PROJECT_ID/global/networks/network-b
2. 列出威胁检测器以确认是否已创建。
gcloud beta network-security dns-threat-detectors list --location=global
3. 描述资源,以验证 network-b 是否正确列在 excludedNetworks 下。
gcloud beta network-security dns-threat-detectors describe my-dns-threat-detector --location=global
输出示例:
createTime: '2025-08-06T17:06:30.297586089Z' excludedNetworks: - projects/dns-armor-demo-project/global/networks/network-b name: projects/dns-armor-demo-project/locations/global/dnsThreatDetectors/my-dns-threat-detector provider: INFOBLOX updateTime: '2025-08-27T01:14:09.666357239Z'
5. 测试设置
在本部分中,您将执行以下任务:
- 通过 SSH 连接到虚拟机。
- 在虚拟机上安装 Git。
- 克隆 Infoblox 威胁检测模拟器代码库。
- 运行脚本并分析生成的输出。
通过从虚拟机生成模拟的恶意 DNS 查询来验证设置。您应该会看到源自 network-a 的查询的日志条目,而不会生成源自 network-b. 的日志
1. 通过 SSH 连接到 vm-a-use4。在 Cloud Shell 中运行以下 gcloud 命令。
gcloud compute ssh vm-a-use4 --zone=us-east4-c
2. 在虚拟机上安装 Git。
sudo apt-get install git -y
3. 克隆 Infoblox 威胁检测模拟器代码库。
git clone https://github.com/infobloxopen/ib-threat-detection-simulator
4. 将目录更改为模拟器的目录。
cd ib-threat-detection-simulator/threat_detection_simulator/
5. 运行脚本并分析生成的输出。
让该脚本可执行。
chmod +x run.sh
运行脚本。
./run.sh info basic
6. 输出示例
以下屏幕截图显示了网络 A 中虚拟机的部分脚本输出。输出结果显示,100% 的威胁都被检测到了。

以下屏幕截图显示了网络 b 中虚拟机的部分脚本输出。输出结果显示,检测到的威胁占总威胁的 0%。这是预期行为,因为在创建威胁检测器时,网络 b 已被排除。

7. 退出 SSH 会话,返回到 Cloud Shell。
exit
6. 在 Logs Explorer 中查看威胁日志
运行测试脚本后,您可以在日志浏览器中查看生成的威胁日志,因为这些日志会写入 Cloud Logging。
日志条目示例
本部分提供了一个检测到的 DNS 威胁的示例日志条目,展示了 DNS Armor 捕获的详细信息,包括源 IP、查询的网域和威胁类别。它可作为参考,帮助您了解将要分析的日志的结构和内容。
{
"insertId": "1izjkneb44",
"jsonPayload": {
"partnerId": "Infoblox",
"detectionTime": "2025-08-08T01:49:54.092250101Z",
"dnsQuery": {
"authAnswer": false,
"rdata": "random.malicious-domain.com.\t300\tIN\ta\t196.251.118.39",
"protocol": "UDP",
"projectNumber": "1234567890",
"responseCode": "NOERROR",
"queryType": "A",
"location": "us-east4",
"sourceIp": "10.10.0.2",
"queryName": "random.malicious-domain.com.",
"vmProjectNumber": "1234567890",
"vmInstanceId": "01234567899876543210",
"destinationIp": "",
"queryTime": "2025-08-08T01:49:53.712692495Z"
},
"threatInfo": {
"severity": "HIGH",
"confidence": "HIGH",
"threatDescription": "",
"category": "EmergentDomain",
"threatId": "Suspicious_EmergentDomain",
"type": "Suspicious",
"threatIndicator": "izumisv1.cc",
"threatIndicatorType": "FQDN",
"threat": "Suspicious",
"threatFeed": "suspicious-noed"
}
},
"resource": {
"type": "networksecurity.googleapis.com/DnsThreatDetector",
"labels": {
"resource_container": "projects/1234567890",
"id": "",
"location": "us-east4"
}
},
"timestamp": "2025-08-08T01:49:54.092250101Z",
"severity": "INFO",
"logName": "projects/dns-armor-demo-project/logs/networksecurity.googleapis.com%2Fdns_threat_events",
"receiveTimestamp": "2025-08-08T01:49:55.290965780Z"
}
在 Logs Explorer 中查看日志
1. 前往 Google Cloud 控制台中的 Monitoring 部分,然后选择 Logs explorer。

2. 如需过滤所有 DNS Armor 威胁日志,请使用以下查询。此过滤条件会根据 DNS 威胁检测器的资源类型过滤日志。
resource.type="networksecurity.googleapis.com/DnsThreatDetector"
3. 过滤 us-east4 区域的日志,添加位置过滤条件。此查询将仅显示在 us-east4 区域中检测到的威胁。
resource.type="networksecurity.googleapis.com/DnsThreatDetector"
resource.labels.location="us-east4"
4. 按源网络过滤日志:根据 DNS 查询的源 IP 地址过滤日志,以查看源自特定 VPC 网络的威胁。
如需查看来自 network-a(子网 10.10.0.0/24 和 10.10.1.0/24)的日志,请执行以下操作:
resource.type="networksecurity.googleapis.com/DnsThreatDetector"
(jsonPayload.dnsQuery.sourceIp:"10.10.0." OR jsonPayload.dnsQuery.sourceIp:"10.10.1.")
如需查看来自 network-b(子网 10.20.0.0/24)的日志,请执行以下操作:
resource.type="networksecurity.googleapis.com/DnsThreatDetector"
jsonPayload.dnsQuery.sourceIp:"10.20.0."
7. 清理
为避免日后产生费用,请删除在本 Codelab 中创建的资源。运行清理命令时,请务必退出虚拟机的 shell 并返回到 Cloud Shell。
1. 删除虚拟机。
gcloud compute instances delete vm-a-use4 --zone=us-east4-c --quiet
gcloud compute instances delete vm-a-usc1 --zone=us-central1-a --quiet
gcloud compute instances delete vm-b-use4 --zone=us-east4-c --quiet
2. 删除防火墙规则。
gcloud compute firewall-rules delete allow-ssh-iap-a --quiet
gcloud compute firewall-rules delete allow-ssh-iap-b --quiet
3. 删除 Cloud NAT 网关。
gcloud compute routers nats delete nat-a-use4 --router=router-a-use4 --region=us-east4 --quiet
gcloud compute routers nats delete nat-a-usc1 --router=router-a-usc1 --region=us-central1 --quiet
gcloud compute routers nats delete nat-b-use4 --router=router-b-use4 --region=us-east4 --quiet
4. 删除 Cloud Router
gcloud compute routers delete router-a-use4 --region=us-east4 --quiet
gcloud compute routers delete router-a-usc1 --region=us-central1 --quiet
gcloud compute routers delete router-b-use4 --region=us-east4 --quiet
5. 删除子网。
gcloud compute networks subnets delete subnet-a-use4 --region=us-east4 --quiet
gcloud compute networks subnets delete subnet-a-usc1 --region=us-central1 --quiet
gcloud compute networks subnets delete subnet-b-use4 --region=us-east4 --quiet
6. 删除 DNS 威胁检测器。
gcloud beta network-security dns-threat-detectors delete my-dns-threat-detector --location=global --quiet
7. 删除 VPC。
gcloud compute networks delete network-a --quiet
gcloud compute networks delete network-b --quiet
8. 恭喜
恭喜!您已成功配置、部署并测试了 DNS Armor 威胁检测器。您已获得保护 Google Cloud 环境免遭基于 DNS 的威胁的实践经验。
在此 Codelab 中,您已:
- 预配了具有多个 VPC、子网和虚拟机的网络环境。
- 使用 Cloud NAT 为专用虚拟机配置了互联网出站流量。
- 部署了 DNS Armor 威胁检测器,并了解了如何排除特定网络。
- 模拟 DNS 威胁并验证威胁检测配置。
- 在 Logs Explorer 中分析威胁日志,以识别和了解恶意 DNS 活动。