
简介这份资源面向网络安全初学者与进阶研究者聚焦利用DNS流量分析识别僵尸网络这一实战课题提供从数据采集、特征提取到模型训练与评估的完整方案。压缩包共27个文件约3.06MB以15个Python脚本为核心覆盖DNS解析、流量抓取、白名单过滤与异常检测等模块另含6个pyc编译文件、2个txt与2个md说明文档、1个readme及1个Jupyter Notebook便于直接运行与二次开发。内容围绕查询频率、查询类型、源IP分布、响应延迟等特征结合SVM、随机森林、K-means、Isolation Forest等机器学习方法并引入CNN、RNN与Transformer处理时序与全局关联配套环境搭建教程与可视化展示。目前已有313人学习适合希望掌握异常检测流程、复现实验并理解DNS安全分析思路的读者参考。1. 从一份 DNS 流量异常检测包说起它到底能跑出什么结果很多人第一次拿到「基于DNS 流量分析异常的僵尸网络检测.zip」这类资源第一反应是翻代码找模型结果被目录里一堆.pyc、ML、Src、Outfile.txt绕晕。我拆过不少同类包这份东西的定位其实很明确它是一套围绕 DNS 查询/响应流量做异常识别的小型实验框架核心不是某个 SOTA 模型而是把「抓包解析 → 特征提取 → 白名单过滤 → 阈值/模型判定 → 结果输出」这条链路完整串起来。你拿到手能直接跑通一条从 pcap 到可疑域名清单的流水线而不是从零搭环境。它适合两类人一类是做安全运营、想快速验证「DNS 侧能不能发现僵尸网络回连」的工程师另一类是想拿一个真实可跑的小项目练手机器学习异常检测的学生或转行者。包里同时给了Anomaly.py、DnsAnalyser.py、PcapParser.py这些脚本还有ML/BotDAD.ipynb这样的 notebook说明作者既想让你用规则阈值跑也想让你上模型。下面我按「先跑通、再调参、最后避坑」的顺序把这份资源拆开讲清楚。2. 目录结构与运行链路先搞清楚每个文件在干什么2.1 源码、字节码与数据文件的对应关系这个包最容易被吐槽的一点就是同一份逻辑既有.py又有.pyc。.pyc是 Python 编译后的字节码直接运行不需要源码但你想改逻辑就必须找到对应的.py。我整理了一份关键文件对照避免你改错文件文件/目录作用是否建议直接改main.py主入口串联解析、分析、输出是先看它PcapParser.py读取 pcap抽取 DNS 报文是抓包字段在这DnsAnalyser.pyDNS 流量统计与特征计算是核心分析逻辑Anomaly.py异常判定阈值/规则是调参主战场whitelist.py白名单过滤压误报是必须维护IPInfo.pyIP 归属/情报补充视数据源而定find_flux.pyc疑似 flux 域名发现无源码则只能调用ML/BotDAD.ipynb机器学习/深度学习实验是模型在这Outfile.txt/filename.txt输出与输入清单否运行产物从命名看find_flux对应 fast-flux 这类通过频繁更换解析记录来隐藏回连地址的手法BotSummary.py负责汇总结果dnsgraph.pyc可能做域名关系图。你不需要一次全懂但要知道主链路是main.py → PcapParser → DnsAnalyser → Anomaly → Outfile.txt。2.2 环境搭建与最小可运行步骤这类包通常对 Python 版本敏感.pyc的 magic number 和解释器版本绑定版本不对会直接报bad magic number。常见做法是用 Python 3.83.10 建虚拟环境依赖一般包括scapy、pandas、numpynotebook 里还会用到scikit-learn、tensorflow或torch。先别急着装全家桶按下面步骤走# 1. 建虚拟环境版本尽量贴近 pyc 编译版本 python3.9 -m venv venv source venv/bin/activate # Windows 用 venv\Scripts\activate # 2. 装基础依赖先跑通解析链路 pip install scapy pandas numpy scikit-learn # 3. 看主入口怎么调用确认输入参数 python main.py --help如果--help没输出说明main.py没写 argparse那就直接打开看它读的是哪个文件。很多同类脚本会把输入写死在filename.txt里一行一个 pcap 路径。参数上重点确认三处pcap 路径、输出文件路径、阈值配置。阈值通常写在Threshold.py或Anomaly.py顶部常量里比如查询频率上限、单位时间请求数、域名熵值下限。改之前先备份跑通默认值再动。提示.pyc文件不要删也不要反编译后覆盖原文件先保留原始包改动只在.py上做出问题能回退。3. 特征提取与异常判定DNS 侧到底看哪些指标3.1 从 pcap 到特征向量的关键字段DNS 异常检测的功夫八成在特征上。PcapParser.py一般用 scapy 的DNS层解析能拿到查询名qname、查询类型qtype、源 IP、目的 IP、时间戳、响应码rcode、响应 IP 列表。DnsAnalyser.py再把这些原始记录聚合成统计量。我按经验列一下这类项目最常用、也最该关注的指标查询频率同一源 IP 单位时间内的 DNS 请求数僵尸网络回连前常有周期性查询。查询类型分布A、AAAA、TXT、MX 的比例TXT 和异常子域常被用于隧道或指令下发。域名多样性同一源 IP 访问的不同二级域名数量DGA 域名会显著拉高。子域长度与熵随机生成的子域字符分布更均匀熵值偏高。响应延迟与 rcodeNXDOMAIN 比例过高可能是 DGA 探测失败。目标 IP 集中度大量域名解析到少数 IP可能是 fast-flux 或 C2 前置。这些指标不是越多越好维度太高在小样本上必然过拟合。我一般先选 58 个跑一版基线看误报再逐步加。3.2 阈值规则与机器学习两条路线怎么选包里Anomaly.py走的是规则/阈值路线ML/BotDAD.ipynb走的是模型路线。两者不是替代关系而是互补。规则适合已知模式、可解释、上线快模型适合捕捉组合异常但需要标注或干净的负样本。实操建议是先用规则压掉明显噪声再把剩余流量喂给模型。# 阈值判定示意逻辑参考 Anomaly.py 的常见写法 import numpy as np def is_suspicious(features, thr): # features: dict包含 qps、entropy、nx_ratio、uniq_domain if features[qps] thr[qps_max]: return True, query_rate if features[entropy] thr[entropy_max] and features[uniq_domain] thr[uniq_max]: return True, dga_like if features[nx_ratio] thr[nx_max]: return True, nxdomain_flood return False, normal thr {qps_max: 50, entropy_max: 3.8, uniq_max: 30, nx_max: 0.6}这段逻辑说明qps_max控制查询频率entropy_max配合uniq_max抓 DGAnx_max抓解析失败洪泛。参数没有万能值得用你自己的正常流量跑一遍取 P95 或 P99 作为初值再根据误报微调。模型侧在 notebook 里通常先做标准化再上 Isolation Forest 或简单神经网络注意训练集里别混入已知恶意样本否则评估会虚高。注意白名单whitelist.py不是可选项。运营商 DNS、内部域、常见 CDN 域名不加白误报能把你淹没。4. 避坑与排查这几处翻车我见得太多了4.1 现象运行直接报 bad magic number原因.pyc由特定 Python 版本编译当前解释器版本不匹配。 解决用python -c import sys; print(sys.version)确认版本换到 3.83.10 重建虚拟环境实在不行只跑有.py源码的模块.pyc仅作参考。4.2 现象解析出的 DNS 记录数为 0原因pcap 里 DNS 走的是非 53 端口或抓包时只抓了 TCP 没抓 UDP也可能是链路层封装导致 scapy 没识别。 解决在PcapParser.py里放宽过滤条件别写死port 53用rdpcap先打印前几条包看层级确认DNS in pkt是否成立。4.3 现象误报爆炸正常办公网也被标成僵尸网络原因白名单缺失或阈值过严尤其是内网 DNS 和 CDN 域名。 解决先把whitelist.py补全把内网域、常用公共解析域加进去再把qps_max和uniq_max放宽 23 倍观察一天再收紧。4.4 现象notebook 里模型准确率 99%上线就废原因训练数据里正常样本和异常样本来自不同时间段或不同网段存在数据泄漏。 解决按时间切分训练/测试集别随机切确认特征计算不依赖未来信息比如别用整段流量的统计值去判定其中某一条。4.5 现象Outfile.txt有结果但没法溯源原因输出只写了域名没带源 IP、时间戳、命中规则。 解决改BotSummary.py或输出逻辑至少保留src_ip, qname, timestamp, rule四列后面做处置和取证都靠它。5. 进阶用法把检测结果接进日常运营跑通只是起点真正有价值的是让这份资源产出可处置的清单。我一般会做三件事。第一把Outfile.txt按源 IP 聚合输出「高风险主机 TOP N」而不是一堆散域名运营同学看得懂。第二给命中规则打标签比如dga_like、nxdomain_flood、fast_flux不同标签对应不同处置动作DGA 优先隔离主机fast-flux 优先封域名。第三做时间序列对比把每天的异常数量画出来突增往往比单点异常更有意义。验证检测效果别只看准确率用下面这张表更实在验证维度做法关注点召回注入已知恶意样本重放能不能抓到误报跑一周正常流量运营能不能扛可解释每条告警带规则名能不能溯源稳定性连续跑 7 天内存/耗时是否漂移如果要用ML/BotDAD.ipynb做进阶建议先把它当特征工程参考而不是直接上深度模型。DNS 流量维度有限树模型和孤立森林往往性价比更高。真要上序列模型先把查询按源 IP 和时间窗切成序列注意窗口大小别拍脑袋用正常流量的查询间隔分布来定。从那以后我每次拿到这类检测包都强制先跑一遍正常流量看误报再谈模型效果。希望帮到你。本文还有配套的精品资源点击获取