本文速览
本文适合已经能导入订阅、但遇到部分网站解析异常、首次连接慢或境内站点绕路的用户。重点是区分 DNS 解析线路与代理流量线路,建立境内域名走本地上游、境外域名走 DoH 的配置,再通过日志、解析结果和路由规则定位问题。
DNS 分流配置与验证要点
本节要点
先看懂 DNS 与路由的两次选择
访问一个域名时,客户端通常先要得到 IP 地址,随后才向该 IP 建立 TCP 或 UDP 连接。DNS 决定“域名解析成什么地址”,路由规则决定“连接从哪个出站发送”。这两次选择互相关联,却不是同一件事。只配置了域名分流规则,并不表示 DNS 查询一定按相同线路发送。
V2Ray 或 Xray 配置中的
dns 对象负责选择上游解析器、缓存结果和限制查询策略;routing 对象负责匹配域名、IP、端口、协议与入站标签。若应用已经在本机完成解析,核心接收到的可能只是目标 IP,此时仅包含域名的规则未必能命中。应用请求域名选择 DNS 上游返回目标 IP匹配路由规则选择出站连接
系统代理与 TUN 模式也会影响链路。浏览器经 SOCKS 或 HTTP 代理提交域名时,核心通常还能看到原始域名;TUN 模式则需要客户端接管系统流量与 DNS 请求。v2rayN、v2rayNG 和 v2flyNG 的界面选项不同,但判断原则相同:先确认查询由谁发起,再确认查询经过哪条线路。
53
传统 DNS 常用端口
443
DoH 常用端口
A / AAAA
主要地址记录类型
2 次
解析与出站分别决策
分流解析收益
本节要点
境内外分流解析为什么有用
境内服务常使用按地区调度的 CDN。同一个域名交给不同地区的解析器,可能返回不同机房地址。境内域名使用距离较近的本地上游,通常更容易获得合适的边缘节点;境外域名交给可稳定访问的 DoH 上游,则能减少错误应答、查询超时和结果被改写带来的连接问题。
合理的目标不是把所有查询都塞进同一个公共解析器,而是让查询线路与访问意图一致。典型做法是用
geosite:cn 匹配境内域名,并用 geoip:cn 校验返回地址;其余域名交给指定的 DoH 上游。规则库需要随客户端或核心更新,否则新域名可能落入兜底规则。境内域名解析
- 域名集合
- geosite:cn
- 上游地址
- 223.5.5.5
- 端口
- 53
- 结果范围
- geoip:cn
优先获得适合境内网络访问的 CDN 地址。
境外域名解析
- 域名集合
- geolocation-!cn
- 上游协议
- DoH
- 服务地址
- 1.1.1.1
- 连接端口
- 443
通过 HTTPS 承载查询,并按现有路由决定连接出站。
expectIPs 是结果过滤条件,不是强制把域名映射到某个地区。境内上游返回不符合 geoip:cn 的地址时,核心可以尝试后续解析器。若某个境内站点本来就使用境外地址,过严的条件反而会造成重复查询,此时应为该域名增加更精确的例外,而不是直接删除全部校验。- 经常访问的局域网名称可写入
hosts,例如把路由器管理域名固定到192.168.1.1。 - 只有 IPv4 网络时可优先使用
UseIPv4,避免拿到 AAAA 记录后等待不可达的 IPv6 连接超时。 - 具备稳定 IPv6 出口时再启用双栈查询,并分别验证直连与代理出站是否都能访问 IPv6。
配置示例
本节要点
一份可读的分流 DNS 配置
下面示例采用 Xray 常见的 DNS 字段写法,适合用于理解结构。不同 V2Ray 或 Xray 内核版本支持的字段可能略有差异,导入前应以当前客户端生成的配置格式为准。v2rayN 可先进入「设置」→「参数设置」确认当前核心类型,再从「服务器」→「添加自定义配置服务器」载入完整 JSON。
{
"dns": {
"hosts": {
"domain:router.local": "192.168.1.1"
},
"queryStrategy": "UseIPv4",
"servers": [
{
"address": "223.5.5.5",
"port": 53,
"domains": [
"geosite:cn"
],
"expectIPs": [
"geoip:cn"
]
},
{
"address": "https://1.1.1.1/dns-query",
"domains": [
"geosite:geolocation-!cn"
]
},
"localhost"
]
}
}
列表顺序与域名条件共同决定解析器选择。第一项服务境内域名,第二项服务明确归类的境外域名,
localhost 作为未命中分类时的兜底。若希望所有未知域名也使用 DoH,应先确认当前核心对 fallback 与域名匹配的处理方式,再调整兜底顺序,避免凭感觉交换数组位置。- 先备份当前可连接的配置,不要直接在唯一配置上反复覆盖。
- 只加入一个境内 DNS 上游,测试常用境内网站是否能正常解析和打开。
- 再加入 DoH 上游,测试此前异常的境外域名,并观察核心日志中的查询错误。
- 最后加入
expectIPs、IPv4 策略与 hosts 规则,每次只改一项。 - 完成后重启核心或重新载入配置,避免旧连接与 DNS 缓存干扰结果。
路由协同
本节要点
DNS 分流还要配合路由规则
DNS 返回正确地址,只解决了“连到哪里”。要让境内连接直连、其余连接走代理,还需要匹配顺序清晰的路由规则。常见结构是先处理局域网和保留地址,再处理境内域名与境内 IP,最后把未命中的流量交给代理出站。
{
"routing": {
"domainStrategy": "IPIfNonMatch",
"rules": [
{
"type": "field",
"ip": [
"geoip:private"
],
"outboundTag": "direct"
},
{
"type": "field",
"domain": [
"geosite:cn"
],
"outboundTag": "direct"
},
{
"type": "field",
"ip": [
"geoip:cn"
],
"outboundTag": "direct"
}
]
}
}
IPIfNonMatch 表示域名规则没有命中时,核心可以解析目标域名,再尝试 IP 规则。它不是“所有域名都提前解析”的开关,也不会自动建立境内外 DNS 上游。若配置使用 AsIs,核心倾向于保留域名匹配流程,只有 IP 目标才能直接命中 IP 规则。结论:DNS 规则与流量规则必须成对检查
境内域名交给本地上游后,还应确认
geosite:cn 与 geoip:cn 最终指向直连出站;境外域名使用 DoH 时,则要确认 DoH 的 HTTPS 连接和目标网站连接都能从预期出站建立。| 现象 | 优先检查 | 判断依据 |
|---|---|---|
| 域名规则偶尔不命中 | 应用是否提前解析 | 日志目标只显示 IP,不显示域名 |
| 境内网站加载变慢 | DNS 返回的 CDN 地址 | 地址地区与当前网络相距较远 |
| DoH 查询持续超时 | 443 端口与出站路由 | 日志出现连接超时或握手失败 |
| 连接先卡数秒再成功 | AAAA 记录与 IPv6 可达性 | IPv6 尝试失败后回落 IPv4 |
DoH 配置要点
本节要点
DoH 配置的重点不是只换一个地址
DoH 把 DNS 消息放进 HTTPS 请求,常用端口是 443。它能降低传统明文 UDP 查询在传输途中被观察或改写的概率,但不能替代路由配置,也不能修复上游自身返回的错误结果。上游可访问性、出口路径和缓存策略仍然决定实际表现。
在 v2rayN 中调整自定义配置后,可通过「设置」→「参数设置」检查日志级别,并在主窗口打开日志区域观察核心启动信息。安卓端使用 v2rayNG 或 v2flyNG 时,应先在当前配置的路由与 DNS 页面核对设置,再重新连接,使 VpnService 会话载入新配置。
- 查询超时:先验证 DoH 地址的 443 端口是否能通过预期出站建立连接,再看是否存在域名引导解析问题。
- 循环依赖:不要让解析 DoH 服务域名所需的 DNS 查询再次依赖同一个尚未建立的 DoH 连接。
- 缓存未更新:修改上游后重启核心,并重新打开测试应用;浏览器和系统可能保留各自的 DNS 缓存。
- IPv6 假可用:系统拿到 IPv6 地址不代表出口可达,可临时使用
UseIPv4对照测试。 - 规则库过旧:更新客户端附带的 geosite 与 geoip 数据后重载核心,再判断域名分类是否错误。
结论:先保证单一 DoH 上游可用,再增加备用项
同时填入多个未知状态的解析器,会让超时、回退与缓存结果交织。先用一个明确可达的 443 上游完成测试,再增加备用解析器,日志会更容易读懂。
测试时应选择三类目标:一个稳定的境内 CDN 域名、一个需要代理访问的境外域名,以及一个局域网名称。连续测试首次访问和第二次访问,可以区分首次解析耗时与缓存后的连接耗时。若首次慢、后续快,重点看 DNS 与握手;若每次都慢,则继续检查路由、节点延迟和丢包。
故障排查顺序
本节要点
解析污染与连接异常的排查顺序
所谓解析污染,常见表现包括返回与目标服务无关的地址、同一域名在不同解析路径得到明显冲突的结果,或解析成功但连接立即被重置。不能仅凭“网页打不开”就断定是 DNS 问题,因为节点失效、系统代理未启用、路由误分流和 IPv6 不可达都会产生相似现象。
排查应从最短链路开始。先确认核心启动成功,再确认域名是否解析,随后确认结果是否合理,最后检查目标连接使用了哪个出站。v2rayN 日志若显示配置字段错误,应先修复 JSON;若显示 DNS timeout,再检查上游;若已经得到 IP 但连接失败,则转向路由与节点。
连接成功,但只有部分域名打不开怎么办?
把异常域名与正常域名分别记录下来,在日志中确认目标是域名还是 IP。若只有 IP,检查应用是否在代理外提前解析;若有域名但命中直连,检查
geosite 分类和规则顺序。换成 DoH 后所有查询都超时怎么办?
先恢复一个可用的传统 DNS 兜底,再确认 DoH 地址的 443 端口能否通过当前出站连接。使用域名形式的 DoH 地址时,还要保留可完成引导解析的上游。
为什么境内网站被分到代理线路?
检查路由规则是否从上到下先命中了更宽泛的代理规则。把局域网、
geosite:cn 与 geoip:cn 规则放在兜底代理规则之前,并重新载入配置。开启 IPv6 后首次打开网站很慢?
临时将
queryStrategy 改为 UseIPv4 做对照。如果等待时间消失,继续检查本地网络、直连出站和代理节点是否都有可用 IPv6 路径。订阅更新后自定义 DNS 消失了?
订阅服务器配置与客户端全局 DNS 设置可能由不同位置管理。更新前记录「设置」→「参数设置」中的核心选项,并确认自定义配置是否被订阅生成的配置覆盖。
还可以做一次最小化对照:暂时只保留一个确认可用的节点、一个 DNS 上游和最基本的直连规则。若最小配置正常,再逐项恢复广告过滤、复杂域名集合、多个上游与自定义 hosts。一次加入一项,比反复清空全部配置更容易找到冲突来源。
收尾检查
本节要点
一套稳定配置的收尾检查
完成 DNS 分流后,不应只看某个网站能否打开。还要检查境内 CDN 是否直连、境外域名是否使用预期解析器、DoH 连接是否发生循环依赖,以及核心重启后配置能否正常加载。订阅更新、客户端升级或规则库更新后,也应重复一次关键域名测试。
桌面端检查
- 客户端
- v2rayN
- 菜单入口
- 设置 → 参数设置
- 系统代理
- 确认已启用
- 日志目标
- DNS 与 routing
修改自定义 JSON 后重新载入核心,再进行首次访问测试。
安卓端检查
- 客户端
- v2rayNG / v2flyNG
- 连接方式
- VpnService
- 省电策略
- 允许后台运行
- 重载方式
- 断开后重新连接
确认系统没有中止后台连接,再判断 DNS 是否持续超时。
- 核心启动日志没有未知字段、格式错误或端口占用提示。
- 境内域名由指定本地上游解析,返回地址符合预期地区。
- 境外域名的 DoH 查询可通过预期出站访问 443 端口。
- 局域网与保留地址优先直连,不落入代理兜底规则。
- 当前网络没有 IPv6 时,不让 AAAA 连接反复等待超时。
- 订阅更新和规则库更新后,自定义 DNS 与路由设置仍然存在。
最终可用的方案通常并不复杂:境内域名交给低延迟本地解析器,境外域名交给稳定 DoH,上游选择与路由出站保持一致,再用日志验证每一步。遇到异常时按照“核心启动、DNS 查询、返回地址、规则命中、出站连接”的顺序检查,能比连续更换节点或解析器更快定位原因。