FakeDNS 解决的是透明接管连接时“只看得到 IP、看不到原始域名”的问题。它先给应用一个虚拟地址,再在连接进入内核时查表还原域名。本文按解析、映射、接管、还原、出站的顺序说明工作条件,适合正在配置 TUN、域名分流或排查 198.18 网段连接失败的用户;读完可以判断是否需要开启,以及出错时应该检查哪一环。
FakeDNS 与真实 DNS 解析的区别
普通 DNS 的 A、AAAA 查询分别用于获取 IPv4、IPv6 地址。应用拿到结果后,通常直接向这个地址建立连接。到了透明代理入口,原始连接可能只剩“目标 IP + 目标端口”,而域名规则需要的却是应用最初查询的名称。FakeDNS 改变了前半段:不急着返回真实服务器地址,而是分配一个仅在受控链路内有意义的虚拟 IP。
例如,应用查询 www.example.com,FakeDNS 分配 198.18.0.2 并保存两者的对应关系。应用随后连接 198.18.0.2:443,接管连接的内核查到映射,便可以把目标恢复为 www.example.com:443。这里的地址是机制示例,不是可直接访问的测试节点,也不是任何客户端固定分配的首个地址。
| 比较项 | 普通 DNS | FakeDNS |
|---|---|---|
| 返回结果 | 域名对应的真实地址 | 本地地址池分配的虚拟地址 |
| 连接前提 | 真实地址可通过所选网络到达 | 虚拟地址流量必须被正确接管 |
| 域名保留 | 透明入口未必能获得原始域名 | 通过映射表恢复查询时的域名 |
| 最终解析 | 通常在连接前已经完成 | 可能延后到本地直连出站或远端代理处理 |
虚拟 IP 映射的完整链路
这条链路的关键不是“DNS 返回了什么”,而是返回结果和后续连接能否重新汇合。回答 DNS 的映射表,与处理目标连接的内核,必须共享对应状态,或由支持此机制的集成组件衔接。若由一个实例生成虚拟地址,却把连接交给另一个没有映射的实例,后者看到的只是无法直接访问的特殊用途地址。
- 查询进入受控 DNS:应用的 A 或 AAAA 请求需要进入配置好的解析路径。仅接管传统 DNS 的 UDP 53 端口,并不等于覆盖应用自带的加密 DNS。
- 写入映射表:FakeDNS 为域名分配虚拟地址。地址池容量有限,实现可能在容量压力下回收旧映射;地址分配次序不应被当作稳定接口。
- 接管虚拟地址连接:TUN 或透明代理规则将连接送入支持还原的入口。FakeDNS 本身既不创建 TUN 网卡,也不自动安装完整的系统路由。
- 查表并恢复目标:内核从虚拟 IP 找回域名,供域名规则与后续出站使用。具体是否改写连接目标,还受入口嗅探等设置影响。
- 完成实际访问:选择代理出站时,支持域名目标的协议可将域名交给远端处理;选择直连时,通常仍要通过真实 DNS 获得可连接的地址。
因此,FakeDNS 不是“不再需要 DNS”,而是推迟真实解析,并保留域名关联。它也不代替 VMess、VLESS 等代理协议,不修改节点认证资料,更不能修复服务端不可达、传输路径错误或 TLS 配置不匹配。
配置字段:地址池、DNS 与入口还原
“V2Ray FakeDNS”常被用来统称这类机制,但 V2Ray 与 Xray 的具体配置能力、字段和客户端接入方式需要分别核对。下面按支持这些字段的 Xray-core JSON 配置说明,展示显式填写的示例值,不宣称它们是所有版本的默认值。v2rayN、v2rayNG 与 v2flyNG 的界面和生成配置方式不同,不能跨内核照抄。
DNS 与地址池
- 池字段
fakedns- 示例网段
198.18.0.0/15- 示例容量
poolSize: 65535- DNS 服务器项
"fakedns"
这是显式参数示例;地址池条目容量不等于网段的全部地址数量。
接收连接的入口
- 启用嗅探
enabled: true- 还原类型
destOverride: ["fakedns"]- 仅用于路由
routeOnly: false- 前置条件
- 虚拟地址连接确实进入该入口
此处展示需要还原连接目标的组合;不要仅凭选项名称判断已经接管成功。
以下是根对象中的 DNS 与地址池片段,不是可独立运行的完整配置。它没有定义监听入口、出站与系统路由,而且只展示 IPv4 池;不能据此认定 AAAA 查询也会按相同方式处理。实际部署需要结合当前内核文档配置 IPv6 行为和真实 DNS 回退路径。
{
"fakedns": [
{
"ipPool": "198.18.0.0/15",
"poolSize": 65535
}
],
"dns": {
"servers": [
"fakedns"
]
}
}
接收虚拟地址连接的对应入站,还需要配置还原机制。下面仅展示该入站内部的 sniffing 字段;它不会自动补齐其他入站参数。routeOnly 的通常含义是将嗅探结果只用于路由而不改写目标,本例显式设为 false,避免把尚未恢复的虚拟目标继续交给出站。
{
"sniffing": {
"enabled": true,
"destOverride": [
"fakedns"
],
"routeOnly": false
}
}
适用场景与不适用场景
FakeDNS 最有价值的场景,是已经采用 TUN 或透明代理、又需要按域名分流的环境。透明入口从网络层接收连接,不一定能从连接本身得到域名;映射表让域名规则不必完全依赖 HTTP Host 或 TLS 握手信息。它也适用于希望把真实解析留到代理出口侧处理的配置,但是否实现这一目标仍取决于出站、路由与真实 DNS 的组合。
| 使用环境 | 选择建议 | 需要确认 |
|---|---|---|
| TUN 接管并按域名分流 | 可考虑启用 | 查询与连接进入同一套映射链路 |
| 显式代理已传递域名 | 通常不必额外启用 | 应用是否已把域名交给 HTTP 或 SOCKS 代理 |
| 办公内网与本地域名 | 优先安排例外解析 | 内部 DNS、直连路径及网段是否冲突 |
| 应用检查真实解析地址 | 先做兼容性验证 | 应用是否拒绝特殊用途地址或用 IP 判断位置 |
| 应用直接连接固定 IP | 无法由 FakeDNS 补回域名 | 没有 DNS 查询就没有相应域名映射 |
显式代理和透明代理要分开判断:支持域名目标的 SOCKS 请求或 HTTP CONNECT 请求,可以直接携带域名,不一定需要 FakeDNS;而应用先在本地解析、再向代理提交 IP 时,域名仍可能丢失。是否需要启用,应以实际请求形式为准,而不是看到“系统代理”四个字就作判断。
结论:先确认域名是否已经到达入口
在日志中检查一次目标连接:若入口已经收到正确域名,先保留现有解析方案;若只有目标 IP 且需要域名规则,再验证 FakeDNS 的接管与还原链路,避免为并不存在的问题增加状态依赖。
常见副作用:缓存、内网与解析旁路
FakeDNS 引入了一张有生命周期的本地映射表,应用和系统却可能继续缓存旧的 DNS 答案。内核重启后,如果原映射已经消失,应用仍拿旧虚拟 IP 发起连接,就会出现“刚打开能用,切换模式后打不开”的现象。此时不停更换节点通常无效,因为故障发生在出站选择之前。
- 模式切换后失联:关闭 FakeDNS 或退出 TUN 后,缓存中的虚拟地址仍可能被使用。应先恢复一致的接管模式,再清理缓存并重启相关应用。
- 局域网服务异常:内部域名可能需要由办公 DNS 返回内部地址。应让这些域名进入明确的真实解析与直连路径,而不是把所有查询无差别送入虚拟池。
- 应用自行解析:应用内置 DoH、DoT 或自带解析结果时,传统 DNS 接管可能根本看不到查询。此时没有虚拟映射属于预期现象,不代表地址池失效。
- IPv4 与 IPv6 不一致:A 查询走虚拟池、AAAA 查询走另一条路径时,同一应用可能表现不稳定。应分别检查两类记录、IPv6 路由与相应池配置。
- 诊断工具结果变化:解析工具显示 198.18 网段不等于域名真实指向那里。对虚拟 IP 做连通性测试,也不能直接反映远端网站的存活状态。
FakeDNS 也不天然等于“没有 DNS 泄漏”。本地直连出站仍可能触发真实解析,应用也可能绕开受控 DNS。若要检查解析路径,应分别观察查询去了哪里、连接从哪个出站发出,而不是仅凭一次解析返回了虚拟地址就下结论。
按顺序排查虚拟 IP 连接失败
建议先固定一个域名、一个应用和一个节点,记录切换前后的现象。下面以 www.example.com 为查询示例;命令用于观察本机当前解析路径,不保证查询一定进入 FakeDNS。Windows、macOS 与 Linux 的解析工具也可能和浏览器采用不同的解析路径。
nslookup -type=A www.example.com
nslookup -type=AAAA www.example.com
- 先看解析是否进入虚拟池:若 A 结果是配置池内的地址,说明该次查询拿到了虚拟结果;若仍是真实 IP,检查查询是否绕过受控 DNS,以及目标域名是否命中了真实解析例外。
- 再看连接是否进入内核:应用建立连接时查看访问日志。如果解析返回虚拟地址,但内核没有对应连接记录,优先检查 TUN 路由与入口接管,不要先改节点的 VMess 或 VLESS 参数。
- 检查映射能否还原:日志里若始终只有虚拟 IP,核对接收连接的入站是否启用了匹配的还原设置,以及是否发生过内核重启、地址池更换或多实例切换。日志展示格式随版本而异,不能只凭单行内容断言失败。
- 最后检查路由与出站:能够还原域名但仍失败时,再确认域名规则命中的出站。直连需要可用的真实解析路径;代理出站则继续检查节点连通、服务端解析与传输配置。
Windows 可用下面的命令清理系统 DNS 缓存,但它不会清理所有应用内缓存。清理前应先确认当前接管模式正确,否则应用只会再次拿到无法使用的结果。浏览器或长驻后台程序仍有异常时,需要关闭相关进程后再试。
ipconfig /flushdns
解析结果是 198.18 开头,域名是不是被改坏了?
先核对该地址是否属于当前配置的虚拟池。若属于,继续检查应用连接是否被 TUN 接管并还原域名;不要把虚拟地址手动写入 hosts,也不要将它当成网站的长期真实地址。
开启 FakeDNS 后,公司内部网站打不开怎么办?
先记录内部域名在原有网络下的真实解析结果,再把内部域名配置到办公 DNS 与直连规则中。确认办公网络没有与虚拟池重叠,重新解析并重启相关应用后复测。
重启客户端后,只有部分应用连不上怎么办?
优先怀疑旧虚拟地址仍在应用缓存里。恢复原接管模式,清理系统 DNS 缓存并重启受影响的应用;如果仍然失败,再比较查询与连接是否由同一套内核实例处理。
开启以后就一定更快吗?
不一定。它可能减少连接前等待真实解析的环节,但最终访问仍受出站解析、连接建立和网络质量影响。使用同一域名、同一节点和相同接管方式对比,先确认规则正确,再评估是否保留。