你有没有过这些烦恼?
- 想在本地内网解析自定义域名,却要折腾路由器 hosts?
- 想拦截广告,却找不到轻量的嵌入式 DNS 方案?
- 想学习 DNS 协议,却被复杂的 C 语言实现劝退?
今天给大家分享一个开发者写的microdns库:仅能创建 WiFi 热点、监听标准 53 端口,还支持通配符解析,甚至带了 Web 管理界面!关键是,全靠 MicroPython,新手也能看懂跑通。
项目介绍
这个 0.0.1 版本的小项目,核心功能已经拉满:
- ✅ AP 模式热点 :一键创建名为
ESP32_DNS_Server的 WiFi 网络,密码12345678,设备直连就能用 - ✅ 标准 DNS 服务:监听 UDP 53 端口,完美兼容 A 记录(IPv4)查询,符合 DNS 协议规范
- ✅ 通配符解析 :支持
*.local这类通配符,一键解析所有子域名 - ✅ Web 管理界面:浏览器访问就能看服务器状态,不用敲命令
- ✅ 轻量纯 Python:核心代码仅 300 行,无复杂依赖,ESP32 内存毫无压力
- ✅ MIT 开源协议:随便改、随便用,商用也没问题
快速使用
这里,已经把所有文件都整理好了,跟着步骤走,新手也能一次成功,需要准备:
- 一块 ESP32 开发板(随便哪家的都行,我用的是 ESP32-S3)
- 已经刷好 MicroPython 固件(不会刷的看我之前的教程)
- 安装
mpremote工具(用来传文件到 ESP32)
首先用 mpremote 安装 microdns 包(也可以直接传文件),库的地址就在upypi上:https://upypi.net/
搜索:microdns
点击详情页 ,进入 复制 下载 指令即可:
然后把这些文件传到 ESP32 根目录:
main_with_web.py(带 Web 界面的完整版本)microdns.py(DNS 核心模块)web_server.py(Web 界面)dns_list.py(域名配置文件)
具体使用细节查看 :https://upypi.net/zh/pkgs/microdns
进阶测试:DNS 劫持与 NCSI 欺骗
测试目标
在基础 DNS 解析功能之上,我们完成两个进阶实验:
- DNS 劫持 :将公共 WiFi 下访问的
baidu.com等域名,强制解析到 ESP32 的自定义宣传页面,模拟 "公共 WiFi 钓鱼" 场景。 - NCSI 欺骗:拦截 Windows 系统的网络验证请求,让设备连接 ESP32 热点后,显示「已连接,安全」而非「无 Internet 连接」,提升伪装真实性。
测试 1:DNS 劫持演示 ------ 访问百度却跳转到宣传页
-
设备连接 ESP32 热点
ESP32_DNS_Server,DNS 地址设置为192.168.4.1。 -
浏览器输入
baidu.com,观察页面跳转。
浏览器地址栏仍显示baidu.com,但页面被劫持到 ESP32 的信息安全宣传界面,同时浏览器顶部出现「不安全」提示(符合 HTTP 未加密特征)。
ESP32 的 DNS 服务器将 baidu.com 解析到自身 IP 192.168.4.1,同时 Web 服务器监听 80 端口,返回自定义 HTML 页面 ------ 这就是典型的公共 WiFi DNS 劫持场景,也是我们用来科普网络安全的教育演示。
测试 2:NCSI 欺骗实现 ------ 骗过 Windows 网络验证
Windows 系统会通过访问 dns.msftncsi.com 和 www.msftconnecttest.com/connecttest.txt 来判断网络是否连通,我们需要让 ESP32 "配合" 这个验证流程。
在dns_list.py中添加 NCSI 相关域名解析:
DNS_LIST = {
# ... 其他域名
'dns.msftncsi.com': '192.168.4.1',
'www.msftconnecttest.com': '192.168.4.1',
}
在 web_server.py 中添加对 /connecttest.txt 的响应:
@app.route('/connecttest.txt')
def connecttest():
return 'Microsoft Connect Test', 200, {'Content-Type': 'text/plain'}
从终端日志可以看到,Windows 发起的 NCSI 验证请求被 ESP32 成功拦截并响应:
[dns]收到 DNS 查询: dns.msftncsi.com (类型: 1)
[dns]解析 dns.msftncsi.com -> 192.168.4.1 [dns]收到 DNS 查询: www.msftconnecttest.com (类型: 1)
[dns]解析 www.msftconnecttest.com -> 192.168.4.1
[web]Generated response: [('Content-Type', 'text/plain')]
还能怎么玩?
这个项目现在只是个雏形,还有很多可以折腾的方向:
- 🚀 DNS 转发:把没匹配到的域名转发到 8.8.8.8,实现 "本地解析 + 外网解析" 混合模式
- 📦 缓存机制:给 DNS 查询加缓存,减少重复解析,提升速度
- 🛡️ 广告拦截:把广告域名解析到 0.0.0.0,实现无广告上网
- 📝 更多记录类型:支持 AAAA(IPv6)、CNAME 等记录,更贴近真实 DNS
- 🎨 美化 Web 界面:把 Web 界面改成更现代的样式,加统计图表