vinayak-sriv/DNSGuard
GitHub: vinayak-sriv/DNSGuard
DNSGuard是一个基于Python的DNS隧道检测系统,结合规则引擎和孤立森林机器学习模型,支持离线PCAP分析和实时流量监控,帮助安全团队识别隐藏在DNS查询中的数据泄露和隐蔽通信行为。
Stars: 0 | Forks: 0
# DNSGuard
DNSGuard 是一个基于 Python 的 DNS 隧道检测项目。它可以分析保存的 PCAP 文件,监控实时的 DNS 流量,对可疑查询进行评分,并在本地的 Flask 仪表盘中显示结果。
## 它的功能
DNS 隧道将数据隐藏在 DNS 查询中。DNSGuard 不是寻找单一的固定特征,而是通过以下方式对 DNS 流量进行评分:
- 基于规则的指标,例如长子域名、高熵、频繁查询以及 TXT/NULL/MX 记录的使用
- 在当前捕获/会话上训练的 Isolation Forest 异常模型
- 基于来源的行为特征,使来自单个 IP 的重复可疑活动变得可见
- 一个使结果更容易检查和解释的仪表盘
该项目包含三个主要脚本:
| 文件 | 用途 |
| --- | --- |
| `pcap_detector.py` | 用于离线 PCAP 分析和实时 DNS 捕获的核心检测器 |
| `dashboard.py` | 用于 PCAP 上传、告警、主机摘要和实时事件的本地 Flask 仪表盘 |
| `generate.py` | 用于演示和测试的合成 DNS 流量生成器 |
## 功能特性
- 带有 CSV 输出的离线 PCAP 分析
- 使用 Scapy 进行实时 DNS 数据包捕获
- 通过 `POST /live/push` 进行实时仪表盘更新
- 可搜索的告警表和每台主机的摘要
- 带有样本查询和原因的隧道来源注册表
- 用于正常、混合、仅隧道、突发和升级演示的合成流量模式
## 仓库结构
```
DNSGuard/
├── README.md
├── requirements.txt
├── .gitignore
├── pcap_detector.py
├── dashboard.py
├── generate.py
└── samples/
├── dns_tunneling_demo.pcap
├── dns_tunneling_demo_results.csv
├── dns_test_2600_packets.pcap
└── dns_test_2600_packets_results.csv
```
## 环境要求
- Python 3.10 或更高版本
- `pip`
- 用于实时数据包捕获或数据包生成的管理员/root 权限
安装依赖项:
```
pip install -r requirements.txt
```
本项目使用:
```
flask
numpy
pandas
requests
scapy
scikit-learn
```
桌面通知是可选的。如果您需要此功能,请安装:
```
pip install plyer
```
## 快速开始
分析包含的示例 PCAP:
```
python pcap_detector.py samples/dns_tunneling_demo.pcap --no-dashboard --no-notify
```
启动仪表盘:
```
python dashboard.py
```
打开:
```
http://127.0.0.1:8080
```
您可以从仪表盘上传 PCAP,或者单独运行检测器并将结果推送到其中。
## 使用说明
### 离线 PCAP 分析
当您已经拥有来自 Wireshark、tcpdump 或示例文件夹的 `.pcap` 文件时,请使用此模式。
```
python pcap_detector.py capture.pcap
python pcap_detector.py samples/dns_tunneling_demo.pcap
python pcap_detector.py capture.pcap --no-notify
```
检测器会打印一份控制台报告,并在捕获文件旁边保存一个 CSV 文件:
```
capture_results.csv
```
要将离线结果推送到运行中的仪表盘:
```
python dashboard.py
python pcap_detector.py capture.pcap --dashboard http://127.0.0.1:8080
```
### 实时捕获
实时捕获从网络接口读取数据包,通常需要提升的权限。
```
sudo python pcap_detector.py --live
sudo python pcap_detector.py --live --iface eth0
sudo python pcap_detector.py --live --iface eth0 --window 120
sudo python pcap_detector.py --live --iface eth0 --no-dashboard
sudo python pcap_detector.py --live --iface eth0 --no-notify
```
重要选项:
| 选项 | 默认值 | 描述 |
| --- | --- | --- |
| `--live` | 关 | 启用实时 DNS 捕获 |
| `--iface` | `eth0` | 进行嗅探的网络接口 |
| `--window` | `300` | 滑动窗口大小(以秒为单位) |
| `--dashboard` | `http://127.0.0.1:8080` | 用于事件流的仪表盘 URL |
| `--no-dashboard` | 关 | 禁用仪表盘流式传输 |
| `--no-notify` | 关 | 禁用桌面通知 |
查找您的接口名称:
```
# Linux
ip a
# macOS
ifconfig
# Windows
ipconfig
```
### 仪表盘
运行仪表盘:
```
python dashboard.py
```
然后打开 `http://127.0.0.1:8080`。
仪表盘支持:
- PCAP 上传和自动分析
- 总查询数、隧道数和风险等级的概览卡片
- 可搜索的告警表
- 来源主机摘要
- 实时事件流
- 已确认的隧道注册表
对于实时模式,请在单独的终端中运行仪表盘和检测器:
```
# Terminal 1
python dashboard.py
# Terminal 2
sudo python pcap_detector.py --live --iface eth0
```
### 流量生成器
`generate.py` 创建用于实验室测试的合成 DNS 流量。它使用 Scapy 来构造数据包,因此可能需要管理员/root 权限。
```
sudo python generate.py
sudo python generate.py --mode normal --packets 100
sudo python generate.py --mode tunnel --packets 200
sudo python generate.py --mode burst --packets 100 --delay 0.1
sudo python generate.py --mode escalate
```
流量模式:
| 模式 | 描述 | 使用场景 |
| --- | --- | --- |
| `mixed` | 40% 类隧道和 60% 正常流量 | 常规演示 |
| `normal` | 仅良性 DNS 查询 | 基线测试 |
| `tunnel` | 仅类隧道的高熵查询 | 敏感度测试 |
| `burst` | 来自单个攻击者 IP 的快速查询 | 速率规则测试 |
| `escalate` | 正常、混合,然后是突发流量 | 端到端演示 |
## 端到端演示
使用三个终端:
```
# Terminal 1: dashboard
python dashboard.py
```
```
# Terminal 2: live detector
sudo python pcap_detector.py --live --iface lo --dashboard http://127.0.0.1:8080
```
```
# Terminal 3: traffic generator
sudo python generate.py --mode escalate
```
打开 `http://127.0.0.1:8080` 并观察实时流。如果您的操作系统不支持环回捕获,请将 `lo` 替换为 Scapy 可以嗅探的接口。
## 检测原理
DNSGuard 从每个 DNS 查询中提取词汇和行为特征。
| 特征 | 类型 | 测量内容 |
| --- | --- | --- |
| `query_length` | 词汇 | 完整查询域名的长度 |
| `subdomain_length` | 词汇 | 注册域之前的标签长度 |
| `subdomain_entropy` | 词汇 | 类似有效载荷的子域名的随机性 |
| `hex_ratio` | 词汇 | 子域名中十六进制字符的比例 |
| `digit_ratio` | 词汇 | 完整查询中数字的比例 |
| `dot_count` | 词汇 | 域名中的标签数量 |
| `query_rate_per_min` | 行为 | 来自源 IP 的查询速率 |
| `avg_entropy` | 行为 | 源 IP 的平均熵 |
| `avg_response` | 行为 | 源 IP 的平均响应大小 |
| `special_type_count` | 行为 | TXT、NULL 和 MX 查询的数量 |
最终得分融合了规则和异常检测:
```
risk_score = (rule_hits / TOTAL_RULES) * 50 + ml_score * 50
```
当前规则阈值:
| 规则 | 阈值 |
| --- | --- |
| 子域名长度 | `> 45` 个字符 |
| 子域名熵 | `> 3.8` |
| 查询速率 | `> 5` 次查询/分钟 |
| 特殊记录计数 | `> 10` 次 TXT/NULL/MX 查询 |
风险等级:
| 级别 | 分数范围 | 含义 |
| --- | --- | --- |
| 低 | 0-30 | 弱或无隧道信号 |
| 中 | 30-60 | 值得审查 |
| 高 | 60-100 | 强可疑模式 |
`risk_score >= 50` 的行被标记为 `TUNNEL`。
## 仪表盘 API
默认情况下,仪表盘仅限本地访问。仅当您有意希望远程客户端调用它时,才设置 `DNS_SHIELD_ALLOW_REMOTE=1`。
| 端点 | 方法 | 用途 |
| --- | --- | --- |
| `/` | `GET` | 仪表盘 UI |
| `/analyse` | `POST` | 上传并分析 PCAP 文件 |
| `/results` | `GET` | 读取最新的离线分析结果 |
| `/live/push` | `POST` | 接收实时检测器事件 |
| `/live/status` | `GET` | 读取实时流状态 |
| `/live/reset` | `POST` | 清除实时流状态 |
PCAP 上传示例:
```
curl -X POST http://127.0.0.1:8080/analyse -F "pcap=@capture.pcap"
```
## 示例输出
```
========================================================================
DNS TUNNELING DETECTION REPORT
Generated: 2026-04-24 15:05:46
========================================================================
Traffic Summary
------------------------------------------------------------------------
Total DNS queries analysed : 800
Unique source IPs : 17
Flagged as TUNNEL : 266 (33.2%)
High risk queries : 192
Medium risk queries : 188
Low risk queries : 420
Per-IP Summary
------------------------------------------------------------------------
IP Queries Max Risk Avg Risk Tunnels
----------------- ------- --------- --------- --------
10.0.0.77 150 87.5 68.3 150 *** SUSPECTED TUNNEL SOURCE ***
10.0.0.42 150 86.0 59.1 116 *** SUSPECTED TUNNEL SOURCE ***
```
CSV 输出包含:
```
ts, src_ip, dst_ip, sport, query, record_type, response_size,
subdomain_length, subdomain_entropy, hex_ratio, query_rate_per_min,
risk_score, risk_level, prediction
```
## 局限性
- 除非在上游进行解密,否则 DNS-over-HTTPS 和 DNS-over-TLS 对此解析器是不可见的。
- 原始解析器主要针对 IPv4 UDP DNS 流量。
- 小型捕获为异常评分提供的行为上下文较少。
- 攻击者可以通过用类似字典的标签填充有效载荷来降低熵。
- 合成生成器用于实验室验证,不能替代真实的网络基线。
## 参考文献
1. Farnham, G. and Atlasis, A. - *Detecting DNS Tunneling.* SANS Institute InfoSec Reading Room, 2013.
https://www.sans.org/white-papers/34152/
2. Ellens, W. et al. - *Flow-based Detection of DNS Tunnels.* Lecture Notes in Computer Science, 2013.
https://link.springer.com/chapter/10.1007/978-3-642-40973-7_11
3. Homem, I., Papapetrou, P. and Dosis, S. - *Information-Entropy-Based DNS Tunnel Prediction.* IFIP AICT, 2018.
https://link.springer.com/chapter/10.1007/978-3-319-99277-8_8
4. Liu, F.T., Ting, K.M. and Zhou, Z.-H. - *Isolation Forest.* IEEE ICDM, 2008.
https://ieeexplore.ieee.org/document/4781136/
5. iodine - IP-over-DNS 隧道。
https://github.com/yarrick/iodine
6. DNScat2 - 基于 DNS 的命令和控制框架。
https://github.com/iagox86/dnscat2
7. Zeek 网络安全监控器。
https://zeek.org
## 作者
DNSGuard 由 Vinayak Srivastava 在 UPES Dehradun 的 Dr. Richa Kumari 指导下,作为 B.Tech CSE 毕业设计项目开发。
标签:AI安全, Apex, Chat Copilot, DNSGuard, DNS安全, DNS数据外发检测, DNS枚举, DNS隧道检测, Flask, Isolation Forest, PCAP分析, Python, Scapy, Scikit-learn, 主机行为分析, 人工智能, 威胁情报, 安全仪表盘, 开发者工具, 异常检测, 无后门, 机器学习, 流量可视化, 用户模式Hook绕过, 网络安全, 网络安全工具, 网络安全检测系统, 逆向工具, 隐私保护