L04 问题解答 第 04 站 / 共 6 站

代理 DNS 解析失败:从域名错误到分流恢复

排查 no such host、DNS 超时与开启代理后域名打不开,区分系统 DNS、内核 DNS、节点域名和目标域名,提供 nslookup、SOCKS 解析对照、Fake-IP 判断、恢复和验证步骤。

发布
阅读
约 6 分钟
本文目录 9 节

快速回答 代理 DNS 解析失败

DNS 故障先确认失败的是订阅域名、节点域名还是目标域名,再比较系统查询与客户端解析。显式指定不同 DNS、SOCKS5 本地与代理解析对照可帮助缩小范围;Fake-IP 地址不自动代表错误,修复应保留内网解析并以实际访问和日志验证。

日志里的 no such host、Could not resolve host、lookup ... timeout 都指向解析阶段,但失败的域名未必是你正在浏览的网站:它可能是订阅服务器、代理节点,也可能是 DNS 服务器自身。先找到报错中的域名和上下文,再决定改哪一层。解析和路由的完整关系见 DNS 与代理分流。

先判断失败发生在哪里

记录出现错误的操作以及第一条解析报错,避免只截取最后的“连接失败”。

发生时机 常见失败对象 下一步
只有更新订阅失败 订阅域名 先查订阅更新流程
全部请求失败,日志反复出现同一节点域名 节点地址或其启动解析路径 检查节点域名如何解析
只有某些网站失败 目标域名、特定 DNS 策略 对比系统与内核解析
启用 TUN 后所有域名异常 DNS 接管、监听、路由循环 先关闭 TUN 恢复,再逐项核对
只有一个浏览器失败 浏览器安全 DNS 或独立代理 与另一应用及内核日志对比

先保留原 DNS、TUN 和浏览器安全 DNS 设置。不要把完整订阅链接当作域名传给诊断命令,也不要为了排查将内核 DNS 端口开放到公网。

第一步:测试系统查询,不急于改设置

下面的 www.example.com 是占位域名,替换为实际报错域名;优先测试公开域名,不要把内部域名交给公共 DNS。

# Windows;macOS / Linux 有 nslookup 时同样可执行
nslookup www.example.com
# 第二条仅为本次查询指定服务器,不改系统 DNS
nslookup www.example.com 1.1.1.1

macOS / Linux 也可用:

dig www.example.com A
dig @1.1.1.1 www.example.com A

默认查询超时而指定 DNS 成功,提示默认解析路径值得检查;两者都超时,也可能是当前网络不允许访问这些 DNS。NXDOMAIN 表示该查询返回域名不存在,SERVFAIL 表示解析服务无法完成请求,和没有收到响应的超时不同。不同服务器返回不同的有效 IP 并不自动代表异常。Microsoft nslookup 错误说明

系统查询成功也不能证明浏览器和内核使用同一路径。TUN 可能接管查询,浏览器可能使用自己的加密 DNS,客户端还可能单独解析节点域名。保留这些结果,再看实际请求。

直接查询内核已启用的 DNS 监听

如果当前生效配置已明确启用本地 DNS 监听,可以向这个地址和端口单独查询。下面仅假设监听为 127.0.0.1:1053;先替换成实际值,不要把 HTTP/SOCKS 代理端口当成 DNS 端口,也不必为了测试额外开放监听。

# macOS / Linux:已安装 dig 时使用;不会修改系统 DNS
dig @127.0.0.1 -p 1053 example.com A +time=2 +tries=1

Windows 可在终端输入 nslookup 进入交互界面,再逐行执行以下内容;最后一行退出工具,不会更改系统 DNS:

server 127.0.0.1
set port=1053
set type=A
example.com
exit

得到预期记录或 Fake-IP 映射,说明这一监听能回答该次查询;它仍不证明上游 DNS 经指定节点传输。若这里超时,而系统查询成功,检查监听是否启动、端口是否相符及内核的上游日志;若直接查询成功、原应用失败,回查应用 DNS、缓存和接管路径。内核没有独立 DNS 监听时,跳过这项,使用其 DNS 日志与下面的 SOCKS 对照。dig 参数、nslookup 自定义端口

第二步:对比应用本地解析与代理端解析

若客户端提供 SOCKS5 或 mixed 端口,可使用同一个目标做两次对照;7890 必须换成实际支持 SOCKS 的端口:

# macOS / Linux;Windows 把 curl 改成 curl.exe
curl -q --proxy socks5://127.0.0.1:7890 --noproxy localhost --connect-timeout 10 --max-time 20 --head https://example.com/
curl -q --proxy socks5h://127.0.0.1:7890 --noproxy localhost --connect-timeout 10 --max-time 20 --head https://example.com/

socks5:// 让 curl 在本地解析目标名;socks5h:// 把目标域名交给 SOCKS 代理。后者成功、前者解析失败,是本地目标解析路径异常的线索。这里的“交给代理”是交给本机内核,最终由内核或远端完成解析取决于协议和配置,不能保证查询一定发生在境外。curl 的 SOCKS 解析区别

两次都失败时,检查报错是否变成节点域名解析、TLS 或认证错误;如果失败阶段已经改变,就应按新错误继续,而不是继续随机替换 DNS。请求成功后也要在连接列表确认实际出站,规则可能选择直连。

命令把 -q 放在 curl 的第一个参数位置,仅跳过默认 curl 配置文件,不会修改系统代理或 DNS。这样可以避免默认文件里的附加代理、重试或证书选项影响对照;--noproxy localhost 则单独覆盖本次代理绕过名单。其他例子中的 curl 参数可查 官方手册。

第三步:检查内核 DNS 的职责是否配置正确

以 mihomo 为例,先在客户端查看当前生效配置,不要只修改一个尚未启用的订阅文件。以下字段承担不同职责:

字段 要核对的内容
default-nameserver DNS 服务器域名的启动解析是否可用
proxy-server-nameserver 节点域名解析是否能够在节点未建立前完成
nameserver / nameserver-policy 普通目标及特定域名是否交给预期解析器
direct-nameserver 直连流量是否保留需要的解析路径
respect-rules DNS 连接是否按规则发送,是否造成启动依赖

如果“解析节点必须先连代理,而连接代理又必须先解析节点”,就会形成循环。应使用客户端或服务商推荐的、当前网络可达的启动解析方案,而不是把所有 DNS 查询都强制走尚未建立的节点。字段含义及版本要求以 mihomo DNS 官方文档为准;sing-box、Xray 的字段不能直接照搬。

订阅更新会覆盖原文件时,持久修复应使用客户端支持的覆写或扩展配置。一次只调整相关字段,保留前后差异;没有证据时不要把整套陌生 DNS 配置复制进去。

第四步:分辨 Fake-IP、浏览器与 IPv6 的影响

Fake-IP 用映射地址把域名与后续连接关联起来。mihomo 示例范围包含 198.18.0.0/16,所以出现此类地址不自动说明被劫持。需要核对查询与连接是否由同一内核接管;只让 DNS 进入 Fake-IP、流量却绕过内核,或退出后继续使用旧映射,都可能失败。

浏览器安全 DNS 可能使浏览器与系统命令得到不同结果。先记录其原设置,仅在个人设备上做一次受控对照,重开浏览器再测;若没有改善,恢复原值。企业管理的浏览器设置应由管理员确认。

IPv6 方面,可分别查询 A 与 AAAA 记录,结合客户端日志观察是否只有某一地址族的连接失败。AAAA 为空与查询超时不是同一件事。不要只因 IPv6 存在就永久关闭整机 IPv6;应先确认网络和客户端的 IPv6 路由、DNS 与出站配置一致。

成功验证、恢复与求助

修复后按三层验证:相关公开域名能够按预期查询;客户端日志不再出现同一解析错误;原应用通过正确规则与出站完成实际访问。再检查局域网设备、公司或校园内网是否仍能正常解析,并在客户端重启后复测。

关闭排查时临时启用的高详细度日志,恢复无效的 DNS、浏览器和 TUN 改动。若停用客户端后仍无法访问,先恢复原系统 DNS 并重新打开受影响应用,避免残留映射或指向已关闭本地 DNS 的设置;无需先清空全部网络配置。

求助时提供失败的是哪类域名、错误原文、查询结果、客户端/内核版本、系统代理或 TUN 状态、是否启用 Fake-IP、SOCKS 两次对照结果及最近改动。内部域名、订阅令牌、认证内容和可识别个人的访问记录应先脱敏。

常见问题

两个 DNS 返回不同 IP,是否一定有污染?
不一定。CDN、地域、缓存、IPv4/IPv6 和负载均衡都可能带来合法差异。应结合域名是否属于预期服务、实际连通性、客户端解析路径和可重复的错误判断,不能仅凭 IP 不同下结论。
查询结果是 198.18 开头,为什么还能上网?
在使用 Fake-IP 的客户端中,这可能是内核分配的映射地址,而不是网站真实 IP。只要对应 DNS 与流量都经过同一内核,映射可以正常工作;退出客户端后仍沿用旧映射则可能失败,应恢复原 DNS 路径并重新发起连接。
把 DNS 全部换成公共 DNS 能修好吗?
不保证。公共 DNS 在当前网络也可能不可达,且不能代替公司或校园的内部解析。先用单次查询对照,记录原值后才调整对应层;节点域名的启动解析和目标域名的分流解析也可能需要不同配置。

参考资料

  1. Microsoft Learn:nslookup

    Microsoft learn.microsoft.com

  2. mihomo 文档:DNS 配置

    MetaCubeX wiki.metacubex.one

  3. Microsoft Learn:nslookup set port

    Microsoft learn.microsoft.com

回到顶部

下一站阅读

  1. 上一篇知识 L04 系统代理不生效:浏览器与应用分步排查
  2. 当前位置 L04 代理 DNS 解析失败:从域名错误到分流恢复
  3. 推荐下一篇 L04 延迟高与丢包排查:区分 Wi-Fi、线路和目标服务