适合已能连接节点、但遇到部分域名打不开或解析结果异常的用户。先确认应用是否把域名交给核心,再分别设置解析器、DNS 请求出站和网站流量路由。本文提供一组面向 Xray 内核的配置片段,说明境内 DNS、代理 DoH、geosite 与 FakeDNS 各自负责哪一步,并给出逐项验证方法。
先区分解析器选择、DNS 出站与网站出站
“DNS 分流”至少包含两个独立判断:某个域名交给哪个解析器,以及发往解析器的请求走哪个出站。网站连接还有第三次判断。把境外 DNS 地址填进设置,不代表查询已经通过代理;把网站路由设成代理,也不代表浏览器此前的本地解析会自动改走核心。
V2Ray/Xray 的 dns 对象配置内置解析器;routing 决定连接走哪个出站。geosite:cn 是域名规则集合,geoip:cn 是 IP 地址规则集合,两者不能互换。域名未被应用交给核心时,只有 IP 的连接无法直接按域名集合匹配;流量嗅探有时能恢复域名信息,但不应把它视为所有协议都适用的补救措施。
境内 DNS 与远程 DoH:先确定各自职责
下面以 223.5.5.5 处理境内域名、https://1.1.1.1/dns-query 处理其余查询。它们是可替换的公共解析器示例,不是适用于所有网络的固定最优值。前者通常使用 UDP 53,后者使用 HTTPS 443;加密保护的是客户端到解析器之间的查询传输,解析器仍能看到它处理的域名。
境内域名解析
- address
223.5.5.5- domains
geosite:cn- skipFallback
true- 查询出站
direct
优先处理匹配的境内域名,不加入无关域名的通用回退队列。
其余域名解析
- address
https://1.1.1.1/dns-query- 传输端口
443- 查询出站
proxy- queryStrategy
UseIPv4
作为默认解析器,并让 HTTPS 查询连接经代理节点发送。
UseIPv4 用于把首轮排查限制在 IPv4,避免同时处理 IPv6 路由问题;它不是长期禁用 IPv6 的通用建议。网络和节点都支持 IPv6 时,可在基线通过后改为 UseIP,再分别检查 A 与 AAAA 记录。DNS 查询类型策略也不会替代系统层面的 IPv6 路由设置。
dns.servers 示例:域名匹配与回退行为
以下是核心配置片段,不是可单独导入的完整节点配置。示例面向 v2rayNG 使用的 Xray 内核,v2rayN 也应先确认当前选择的内核。修改前备份配置;使用客户端生成配置时,应在对应 DNS 设置或自定义配置入口中修改,而不是编辑下次启动就会被覆盖的临时运行文件。
{
"dns": {
"tag": "dns-internal",
"queryStrategy": "UseIPv4",
"servers": [
{
"address": "223.5.5.5",
"domains": [
"geosite:cn"
],
"skipFallback": true
},
"https://1.1.1.1/dns-query"
]
}
}
domains为匹配域名指定优先使用的解析器,不是“该解析器只能知道这些域名”的访问控制规则。skipFallback: true表示该服务器不参与通用回退,并不表示“这个服务器失败时禁止尝试其他服务器”。- 没有
domains限制的 DoH 服务器承担默认解析。按上述配置,境内解析失败后仍可能回退到它,因此这是带回退的分流方案,不是严格隔离方案。 tag为内置 DNS 发出的查询提供路由识别依据;它不是一个监听在本机 53 端口的 DNS 服务。
需要严格限制匹配域名只使用其指定服务器时,可以评估 Xray 的 disableFallbackIfMatch。启用前先确认当前核心支持该字段,并接受“指定解析器故障就解析失败”的结果。不要同时大量改动回退、缓存和 IPv6 策略,否则一次失败会对应多个候选原因。
routing 示例:让远程 DNS 确实走代理
下面片段假设现有配置已经包含标签为 proxy 的可用代理出站,以及标签为 direct 的直连出站。标签必须与实际 outbounds[].tag 完全一致。此示例没有末尾全匹配规则,未命中的连接使用第一个出站,因此还要求第一个出站为 proxy。如果现有配置采用其他默认策略,应按原结构调整,不能原样覆盖。
{
"routing": {
"domainStrategy": "IPIfNonMatch",
"rules": [
{
"type": "field",
"inboundTag": [
"dns-internal"
],
"ip": [
"223.5.5.5"
],
"port": "53",
"outboundTag": "direct"
},
{
"type": "field",
"inboundTag": [
"dns-internal"
],
"ip": [
"1.1.1.1"
],
"port": "443",
"outboundTag": "proxy"
},
{
"type": "field",
"domain": [
"geosite:cn"
],
"outboundTag": "direct"
},
{
"type": "field",
"ip": [
"geoip:private",
"geoip:cn"
],
"outboundTag": "direct"
}
]
}
}
前两条只识别内置 DNS 查询,避免把用户直接访问相同 IP 的其他连接也当成解析请求处理。后两条处理网站连接。IPIfNonMatch 的含义是:域名连接未匹配现有规则时,再尝试解析 IP 并进行 IP 规则匹配;它不决定使用哪台 DNS,也不会自动把 DNS 请求送入代理。
| 设置位置 | 示例值 | 实际控制的对象 |
|---|---|---|
dns.servers[].domains | geosite:cn | 域名优先交给哪个解析器 |
dns.queryStrategy | UseIPv4 | 内置 DNS 的地址查询策略 |
routing.domainStrategy | IPIfNonMatch | 路由匹配时何时解析域名 |
routing.rules[].outboundTag | proxy | 命中连接使用哪个出站 |
结论:先验证解析连接,再调整网站规则
重启核心后先确认发往 1.1.1.1:443 的内置 DNS 请求命中 proxy。如果这一步没有成立,继续添加境外网站域名规则并不能保证解析链路避开本地网络干扰。
DoH 与 FakeDNS:加密查询和虚拟地址不是同一件事
DoH 将 DNS 消息放在 HTTPS 连接中传输,主要解决查询传输保护问题。FakeDNS 则向应用返回虚拟 IP,并维护域名与虚拟地址的映射,让后续连接仍能按域名处理。FakeDNS 不会把真实网站部署到虚拟地址,也不等于“已经完成了远程真实解析”。
| 方案 | 返回内容 | 需要重点检查 | 适用起点 |
|---|---|---|---|
| 普通 DNS | 真实 A 或 AAAA 记录 | UDP/TCP 53 的出站和可达性 | 境内解析基线 |
| DoH | 真实 A 或 AAAA 记录 | HTTPS 443、证书与路由 | 远程加密解析 |
| FakeDNS | 虚拟地址池中的 IP | 映射恢复、入站捕获与嗅探 | 基础分流稳定后再评估 |
例如使用 198.18.0.0/15 作为 FakeDNS IPv4 地址池时,系统必须把访问该地址池的连接送回核心,并让核心恢复对应域名。如果连接绕过 VPN 或 TUN 路径,虚拟 IP 无法像真实公网地址一样访问。启用后只有部分应用失败,应先检查分应用代理、捕获范围及映射处理,而不是直接换节点。
- 普通 DNS 分流尚未验证通过:先不启用 FakeDNS,保留真实地址作为排查基线。
- 应用只交出目标 IP、导致域名规则难以生效:再评估 FakeDNS 与当前入站、嗅探配置的配合。
- 关闭 FakeDNS 后仍出现虚拟地址:清理相关应用与系统缓存,并重建连接,防止继续使用旧映射。
在 v2rayN 与 v2rayNG 中逐项验证
客户端界面与核心配置分属两层。同一个“远程 DNS”输入框,在不同客户端版本中可能生成不同结构;应以最终加载的核心配置为准。在 v2rayN 中可从「设置」→「参数设置」检查日志相关设置,再到主窗口日志区域观察启动结果。DNS 编辑入口的名称会随版本调整,不要把普通单行地址框当成完整 JSON 编辑器。
- 记录基线。保存节点、当前路由模式、DNS 地址及系统代理或 VPN 状态。v2rayNG 从「设置」检查 DNS 相关项,修改后停止并重新启动服务,确认日志没有配置解析错误。
- 检查启动错误。先处理未知字段、找不到出站标签、读取 geosite 数据失败等错误。核心没有正常启动时,测试网页只能得到误导性的结果。
- 检查应用是否提交域名。桌面测试可使用支持远程解析的 SOCKS 请求。下方命令假设本机 SOCKS 端口为
10808;若运行配置不同,必须改成实际端口。 - 核对路由命中。短时启用较详细日志,分别访问境内与境外域名,确认 DNS 查询与网站连接的出站。验证后恢复常用日志级别,避免长期记录不必要的访问细节。
- 隔离缓存影响。重启核心并关闭旧连接后再试。Windows 可执行
ipconfig /flushdns清理系统缓存,但浏览器或应用自己的缓存可能仍需单独清理。
curl --proxy socks5h://127.0.0.1:10808 --head --max-time 15 https://www.example.com/
socks5h 让 curl 把域名交给 SOCKS 代理;改成 socks5 时通常由本机先解析,两种测试路径并不相同。这条命令只用于确认域名进入代理路径,不足以单独证明全部 DNS 都已按预期分流。另一个常见误区是只运行 nslookup www.example.com 223.5.5.5:它直接询问指定解析器,可以验证该解析器是否可达,却不能证明内置 DNS 的规则已经生效。
常见问题:解析超时、地址异常与设置不生效
换成 DoH 后所有网页都超时,先检查哪里?
先看核心是否成功启动,再核对 1.1.1.1:443 是否命中可用的 proxy 出站。检查设备时间是否正确,日志是否出现 TLS 证书或握手错误。暂时恢复原 DNS 能定位变化范围,但不要通过关闭证书验证来掩盖问题。
境内网站打开变慢,是不是都被远程 DNS 解析了?
先确认 geosite:cn 数据加载成功,并检查具体域名是否属于集合。对明确需要境内解析的域名,可在境内解析器的 domains 中加入 domain:example.cn 一类明确规则,同时核对网站连接是否走直连。网站主域与其图片、视频域名可能分属不同规则。
两个 DNS 返回不同 IP,就能判断有污染吗?
不能。CDN 调度、缓存期限、解析器位置和 IPv4/IPv6 差异都可能产生不同答案。应结合异常地址、证书不匹配、持续连接失败和多个可信解析路径对比判断。只比较两次返回值不同,不能直接得出污染结论。
修改 DNS 后浏览器没变化,但其他应用正常?
先检查浏览器是否启用了自己的安全 DNS,再确认它是否遵循系统代理。排查时临时统一解析路径、清理浏览器 DNS 缓存并关闭旧连接,然后重新测试。若使用分应用代理,也要确认浏览器没有被排除在 VPN 捕获范围外。
最终应保留一份能解释清楚的配置:哪些域名使用境内解析、默认查询交给谁、解析连接走哪个出站、未命中规则的网站如何处理。每次只改一个变量,并用启动日志与连接结果复核,比同时堆叠多个公共 DNS 更容易定位问题。
客户端安装与 DNS 配置入口
按操作系统选择 v2rayNG 或 v2rayN,先完成节点导入与基础连接,再调整 DNS 分流。首次配置可先阅读入门指南。