FakeDNS 原理详解:虚拟 IP 如何加速域名分流

FakeDNS 用保留网段的虚拟 IP 即时应答 DNS 查询,让路由匹配提前到域名层完成。本文讲清它的工作流程、适合开启的场景,以及与嗅探、TUN 模式搭配时的注意事项。

本文速览

本文适合正在使用 v2rayNG、Xray 内核或 TUN 模式,并希望按域名稳定分流的用户。读完可以判断是否需要 FakeDNS,理解虚拟 IP 映射、嗅探与路由的关系,并能按日志和地址段逐项定位网页打不开、应用绕过规则或局域网冲突。

FakeDNS 解决什么问题

普通 DNS 模式下,应用先把域名解析成真实 IP,再向该 IP 建立连接。代理核心接管连接时,看到的目标可能只剩一个地址,例如 203.0.113.20:443。如果同一地址承载多个域名,或者服务端地址经常变化,仅按 IP 编写路由规则就容易出现误判。

FakeDNS 不负责提供真实公网地址。它接到应用的 DNS 查询后,从预设地址池分配一个虚拟 IP,并保存“域名与虚拟 IP”的临时映射。应用随后连接这个虚拟地址,TUN 入站截获连接,代理核心再从映射表取回原始域名。路由模块因此可以直接匹配 domaindomainSuffix 或规则集中记录的域名。

常见 IPv4 地址池是 198.18.0.0/15。该网段用于网络设备基准测试,不应出现在公网路由中,适合充当本机虚拟目标。一个 /15 网段包含 131072 个地址,但 Xray 配置通常会设置更小的映射池,例如 poolSize: 65535,避免创建没有实际用途的超大映射表。

应用查询域名返回虚拟地址TUN 捕获连接恢复原始域名规则匹配分流代理出站
198.18/15
常用 IPv4 地址池
131072
网段地址总量
65535
常见映射池上限
1–3 ms
本机虚拟应答样例

上面的 1–3 毫秒是同一台安卓设备上连续查询未缓存域名时的本机应答范围,只表示 FakeDNS 返回虚拟地址的耗时,不代表网页完整加载速度。真实连接仍要经过节点握手、远端解析、TLS 建连和内容传输。

一次域名请求如何经过虚拟 IP 映射

完整链路可以拆成六步。第一步,应用向系统 DNS 发出 A 或 AAAA 查询。第二步,TUN 模式把 DNS 流量交给代理核心。第三步,FakeDNS 从地址池取出一个未占用地址并写入映射表。第四步,应用收到虚拟地址后发起 TCP 或 UDP 连接。第五步,入站根据目标地址反查域名。第六步,路由模块按域名决定直连、代理或阻断。

  1. 查询进入代理核心:DNS 请求必须被 TUN 或受控的本地 DNS 捕获。若应用自行连接外部 DNS,FakeDNS 不会获得这次查询。
  2. 建立临时映射:例如 news.example 被分配为 198.18.0.12,映射只在本地内存中生效。
  3. 应用连接虚拟地址:应用把 198.18.0.12 当作普通目标地址,不需要理解 FakeDNS。
  4. 入站恢复域名:核心通过映射表得到 news.example,并把域名交给嗅探和路由模块。
  5. 路由规则命中:域名规则可在真实 DNS 查询发生前决定出站,减少“先解析、后判断”造成的信息丢失。
  6. 出站完成解析:直连出站通常在本地解析真实地址;支持域名目标的代理出站可以把域名交给远端处理,具体行为取决于出站协议与 DNS 配置。
处理阶段 核心看到的目标 可用匹配条件 常见问题
DNS 查询前 原始域名 DNS 服务器规则 应用绕过系统 DNS
虚拟应答后 198.18.0.0/15 内地址 FakeDNS 映射 地址池与局域网重叠
TUN 入站 虚拟 IP 与端口 映射、TLS、HTTP、QUIC 嗅探 嗅探目标未包含 fakedns
路由阶段 恢复后的域名 完整域名、后缀、规则集 高优先级规则提前命中
出站阶段 域名或真实 IP 出站协议与 DNS 策略 本地和远端解析结果不同

结论:先确认 DNS 流量是否进入 TUN

FakeDNS 配置存在但查询仍由外部 DNS 直接处理时,虚拟地址池和域名映射都不会生效。排查顺序应从 DNS 捕获开始,而不是先改路由规则。

Xray 配置中的关键字段

Xray 配置通常包含三个相互配合的部分:顶层 fakedns 定义地址池,dns.servers 把查询交给 FakeDNS,入站的 sniffing.destOverride 允许核心从虚拟地址映射中恢复目标域名。只添加其中一个字段,不能组成完整链路。

下面是用于解释字段关系的最小示例。客户端生成配置时可能增加本地 DNS、规则集和多个入站。编辑前应先导出当前配置,并确认所用客户端允许自定义底层 JSON;订阅更新可能覆盖手动修改的节点参数。

{
  "fakedns": [
    {
      "ipPool": "198.18.0.0/15",
      "poolSize": 65535
    }
  ],
  "dns": {
    "servers": [
      "fakedns",
      "1.1.1.1"
    ],
    "queryStrategy": "UseIP"
  },
  "inbounds": [
    {
      "tag": "tun-in",
      "protocol": "tun",
      "settings": {
        "stack": "system"
      },
      "sniffing": {
        "enabled": true,
        "destOverride": [
          "http",
          "tls",
          "quic",
          "fakedns"
        ],
        "metadataOnly": false
      }
    }
  ],
  "routing": {
    "domainStrategy": "IPIfNonMatch"
  }
}

destOverride 中的 fakedns 用于读取映射;httptlsquic 则用于从相应协议元数据补充域名。两种来源并不冲突。映射可直接给出查询过的域名,协议嗅探则能处理部分未经过 FakeDNS、但握手中仍携带主机名的连接。

TUN + FakeDNS

地址池
198.18.0.0/15
池容量
65535
嗅探目标
fakedns、tls、http、quic
适用规则
域名后缀与规则集

适合需要接管整机流量并按域名分流的安卓设备。

系统代理 + 普通 DNS

本地 SOCKS
127.0.0.1:10808
目标来源
应用直接提交域名
地址池
不启用
适用流量
遵循系统代理的应用

应用已向 SOCKS 入站提交域名时,FakeDNS 的收益通常有限。

v2rayNG 使用 Xray 内核时,优先通过客户端界面管理 TUN 与本地 DNS。常见检查路径是「设置」→「VPN 设置」查看流量接管相关选项,再到「设置」→「路由设置」确认规则顺序。不同版本的开关名称可能调整,因此判断是否生效应以导出的运行配置和核心日志为准,而不是只看界面开关状态。

哪些场景适合开启 FakeDNS

FakeDNS 最适合 TUN 已接管整机流量、路由规则主要按域名编写的环境。安卓应用经常先自行解析域名,再把真实 IP 交给网络栈。TUN 只能看到目标 IP 时,域名规则的命中率依赖嗅探结果;加入 FakeDNS 后,DNS 查询与后续连接通过映射关联,路由判断会更直接。

如果只使用 v2rayN 的系统代理模式,浏览器通常会把目标域名直接提交给本地 SOCKS 或 HTTP 入站。此时核心已经拥有域名,启用 FakeDNS 不一定带来明显收益。是否需要开启,应根据入站类型和日志中显示的目标形式判断。

局域网包含特殊路由时也要谨慎。部分实验室、虚拟化平台或企业设备可能使用 198.18.0.0/15 做性能测试或内部模拟。如果系统路由表已经把这个网段指向真实接口,FakeDNS 地址会与现有网络重叠,表现为连接被发往局域网而没有进入 TUN。

使用场景 建议 判断依据
v2rayNG 全局 TUN 优先测试开启 整机应用流量均经虚拟网卡
按应用代理 结合目标应用测试 被排除应用的 DNS 不应强制映射
v2rayN 系统代理 通常保持普通 DNS 浏览器可直接提交域名
仅按 IP 分流 通常不必开启 规则本身不依赖域名
局域网使用 198.18/15 先更换地址池 避免虚拟地址与真实路由冲突

结论:系统代理先看入站目标,TUN 模式先看映射完整性

日志已经显示完整域名时,不要为了追求更低的 DNS 数字强行加入 FakeDNS;日志只显示共享服务 IP 且域名规则漏匹配时,再用虚拟映射补齐目标信息。

FakeDNS、嗅探与 TUN 如何配合

TUN 的职责是截获 IP 数据包,FakeDNS 的职责是保存域名与虚拟地址的关系,嗅探的职责是从 HTTP Host、TLS Server Name 或 QUIC 握手中提取域名。三者解决的问题不同。只有把它们按顺序连接起来,域名规则才能覆盖更多应用流量。

建议先建立最小可用链路,再逐项添加高级设置。一次修改地址池、DNS 服务器、路由规则和 MTU,会让故障来源难以区分。以下顺序适合 v2rayNG 的 Xray 内核配置,也适合检查由订阅生成的运行配置。

  1. 在「设置」→「VPN 设置」确认 TUN 或 VPN 接管已开启,并检查目标应用是否被分应用规则排除。
  2. 启动连接后查看核心日志,确认存在 TUN 入站,且没有地址冲突、权限失败或接口创建失败。
  3. 检查运行配置中的 fakedns 地址池,并确认 DNS 服务器列表包含 FakeDNS 处理项。
  4. 确认入站嗅探已启用,destOverride 至少包含 fakedns;需要识别网页流量时再保留 httptlsquic
  5. 在「设置」→「路由设置」检查规则顺序。阻断规则、私有地址规则和直连规则如果排在前面,可能先于目标域名规则命中。
  6. 使用一个未访问过的测试域名发起连接,查看日志是否依次出现虚拟地址、恢复后的域名和最终出站标签。

MTU 问题与 FakeDNS 属于不同层级。若域名已经正确恢复,但页面只加载少量内容或大文件停住,应检查 TUN MTU。安卓设备可从 1500 调整到 1400 或 1380 做对照测试,每次只改一个值。若所有域名都无法建立连接,再返回 DNS 捕获和地址池路由继续排查。

Mux 也不会替代 FakeDNS。Mux 负责在一条底层连接中承载多个逻辑连接,主要影响连接复用;FakeDNS 负责保留目标域名。开启或关闭 Mux 不应改变虚拟地址映射是否建立,但可能改变连接数量和日志呈现方式。

常见故障与逐项排查

FakeDNS 故障通常表现为三类:应用收到虚拟 IP 后无法连接、域名规则没有命中、关闭客户端后短时间内仍访问失败。第一类优先检查 TUN 是否捕获虚拟网段,第二类检查映射和规则顺序,第三类通常与系统 DNS 缓存中残留的虚拟地址有关。

开启后所有网页都打不开?

先打开核心日志,确认 TUN 入站已成功创建。再检查系统路由表是否把 198.18.0.0/15 指向 TUN。若该网段被局域网占用,更换不冲突的专用地址池并重启连接。

日志只显示虚拟 IP,没有恢复域名?

检查入站的嗅探开关,并确认 destOverride 包含 fakedns。随后确认 DNS 查询与连接由同一个运行实例处理;分离的 DNS 进程无法共享内存映射。

域名已经恢复,路由规则仍不命中?

进入「设置」→「路由设置」检查从上到下的规则顺序。先临时停用范围过大的直连规则,再查看日志中的最终出站标签,确认规则使用的是完整域名、后缀还是规则集。

断开 v2rayNG 后网站短时间打不开?

系统可能仍缓存 198.18.0.0/15 内的虚拟地址。先关闭并重新打开目标应用;仍未恢复时切换一次网络连接,让系统重新发起 DNS 查询。

部分应用正常,另一些应用完全不走规则?

检查「设置」→「VPN 设置」中的分应用代理范围。被排除的应用不会经过 TUN,其 DNS 查询和后续连接也不会进入 FakeDNS 映射链路。

排查时不要只观察浏览器结果。核心日志至少要核对四个事实:DNS 查询是否进入客户端、是否分配虚拟地址、入站是否恢复域名、路由最终选择哪个出站。四项中缺少哪一步,就回到对应模块修改,而不是同时替换节点和协议。

还要区分“解析快”和“连接快”。FakeDNS 的本地应答可以在数毫秒内完成,但代理节点延迟、TCP 丢包、TLS 握手和服务端响应仍决定页面速度。若虚拟映射与路由均正确,速度问题应继续检查节点延迟、丢包率和传输参数。

下载 V2Ray 客户端 按系统选择安装包