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