# encrypted-dns-traffic-analysis **Repository Path**: lambyte/encrypted-dns-traffic-analysis ## Basic Information - **Project Name**: encrypted-dns-traffic-analysis - **Description**: 加密 DNS 流量分析。根据 DoH 流量推测用户访问的网站。使用 DNS-over-HTTPS(DoH)流量数据集训练机器学习分类器。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 1 - **Created**: 2022-03-01 - **Last Updated**: 2024-06-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 加密 DNS 流量分析 ## 背景 传统的 DNS 报文使用 UDP 或 TCP 明文传送。具有监听用户和 DNS 服务器之间链路能力的对手,可以基于链路上明文传输的 DNS 报文,推测用户正在访问的网页或使用的服务。此外,网络管理组织机构可以对明文传输的 DNS 报文进行审查、截断甚至返回伪造 DNS 响应报文。出于隐私保护等需求,人们提出了许多加密 DNS 协议,DNS-over-HTTPS(DoH)就是其中之一,RFC 8484 对其进行了标准化。 ## 实验目的 本实验目的为尝试对 DoH 流量进行分析,试图从加密的 DoH 流量中推测用户访问的网站。 具体实验分为以下两个场景: - 封闭环境加密 DNS 流量分析:假设对手已知用户将访问的网站集合,根据用户产生的 DoH 流量,推测用户访问的网站。 - 开放环境加密 DNS 流量分析:假设对手已知用户将访问的网站集合的子集,根据用户产生的 DoH 流量,推测用户访问的网站是否在子集中,若是,继续推测用户访问的网站。 ## 实验流程 1. 对数据集进行预处理。提取原始 pcap 文件中的统计特征,并进行相关预处理,特征数据及标签保存至 csv 文件中 2. 训练分类器 3. 评价分类器 ## 实验环境 | 属性 | 属性值 | | -------- | ----------------------------------------------- | | OS | Ubuntu 20.04.1 LTS amd64 | | CPU 型号 | Intel(R) Core(TM)2 Duo CPU T7700 @ 2.40GHz | | CPU 核数 | 12 | | Memory | 24GiB | ## 依赖 ### cicflowmeter [cicflowmeter](https://www.unb.ca/cic/research/applications.html#CICFlowMeter) 是加拿大网络安全研究所开发的一款流量特征提取工具,最初使用 Java 编写,后也有 [Python 版本](https://gitlab.com/hieulw/cicflowmeter/)。 截至 2022.03.01,cicflowmeter Python 版存在未修复的 Bug,但有独立贡献者提供修复 Bug 的[版本](https://gitlab.com/juzai/cicflowmeter/-/tree/juzai-master-patch-32230)(未 merge)。 后续分析需要使用到 pandas (version 1.4.1)库,其依赖的 numpy (version 1.18.5 +)库版本与 cicflowmeter 依赖的 numpy(ver 1.18.0)库版本冲突,建议为 cicflowmeter 建立独立的虚拟环境。 安装 ```bash # 下载 git clone https://gitlab.com/juzai/cicflowmeter.git # 切换分支 git branch -a git checkout remotes/origin/juzai-master-patch-32230 # 新建虚拟环境 python3 -m venv cicflowmeter-venv # 安装 cd cicflowmeter python setup.py install cd .. ``` 卸载 ```bash pip uninstall cicflowmeter scapy scipy ``` ## 数据集 数据集生成基于项目 [Encrypted-DNS-Traffic-Generation](https://gitee.com/lambyte/encrypted-dns-traffic-generation)。实验所用数据集未上传至本项目,但将对其进行描述。 数据集(DoH_traffic_dataset)基于 1000 个域名生成,每个域名生成 100 条 DoH 记录,总计包含 100,000 条 DoH 记录,生成时间为 2022.02.12 至 2022.02.25,服务端为阿里 DNS。 | 数据集属性 | 属性值 | | -------------------------- | ----------------------------------------------------------------- | | 流量记录条数 | 100000 | | 域名数 | 1000 | | 每个域名对应的流量记录条数 | 100 | | 生成日期 | 2022.02.12 - 2022.02.25。 | | DoH 服务端 URL | [https://dns.alidns.com/dns-query](https://dns.alidns.com/dns-query) | | 数据集大小(未压缩) | 约 3.3 GB | 文件组织结构如下所示,数据集根目录下包含 1000 个域名文件 ``` DoH_traffic_dataset ├── domain_1 ├── domain_2 ... └── domain_1000 ``` 其中,每个域名文件包含 100 条流量记录 ``` domian_i ├── 1-domain-time-0.pcap ├── 2-domain-time-0.pcap ... └── 100-domain-time-0.pcap ``` ## 工作流程 ### 加密 DNS 流量特征提取 使用 cicflowmeter 提取每个 pcap 文件的特征。使用 4 个进程,处理 100,000 条记录,耗时约 7 小时。 ``` source cicflowmeter-venv/bin/activate && python extractor.py && deactivate ``` 进行后处理,去除无关流与属性,重新组织数据结构,生成 csv 格式的数据集与标签-域名映射表。处理100,000 条记录,耗时约 7 分钟。 ``` python filter.py -r -i /path/to/directory/generated/by/extractor ``` ### 评价 ``` python run.py ``` ## 文件描述 | 文件名 | 描述 | | ------------ | ---------------------------------------------------------------------------------------------------------------------------- | | extractor.py | cicflowmeter 的简单封装,提取 pcap 文件的特征。 | | filter.py | 在 extractor.py 生成数据的基础上,进行后处理,如去除无关流与属性,重新组织数据结构,生成 csv 格式的数据集与标签-域名映射表。 | | run.py | 评价相关机器学习算法在加密 DNS 流量分析任务上的表现 |