mihomo DNS 配置详解:fake-ip 与 redir-host
本文目录
很多「代理开着却打不开网站」的疑难杂症,最后都查到 DNS 头上。原因不难理解:浏览器要先把域名换成 IP 才能发起连接,如果这一步拿到的是被污染的错误地址,后面代理做得再好也没用。
所以 mihomo 干脆把域名解析这件事接管了过来——配置里的 dns 段就是干这个的。这篇文章讲清它为什么必要、fake-ip 和 redir-host 两种增强模式各自的原理,以及配置写坏之后的典型症状。
代理为什么必须接管 DNS
把解析交给系统默认 DNS 会带来两个问题。一是污染:解析请求可能被中途干预,返回一个根本连不上的 IP,表现就是网站打不开、图片加载不出来,而节点延迟测试却完全正常。二是泄漏:即使流量走了代理,解析动作若发生在本地,你访问了哪些域名就以明文暴露给了本地网络的 DNS 服务器。
mihomo 接管之后,解析在内核内部完成,可以选择用加密协议向可信服务器查询,也可以按域名分流决定「这个域名找谁解析」。这与规则分流是两套并行的机制,配合关系见 分流规则入门。
enhanced-mode:fake-ip 与 redir-host 的区别
enhanced-mode 决定内核如何回应应用的解析请求,两种取值代表两种完全不同的思路:
| 对比项 | fake-ip | redir-host |
|---|---|---|
| 返回什么 IP | 保留网段里的一个虚拟地址(常见 198.18.0.0/16) | 真实解析得到的 IP |
| 何时真正解析 | 连接建立时才由内核处理,或直接把域名交给节点 | 响应应用请求时立刻解析 |
| 解析开销 | 几乎为零,秒回 | 每个域名都要等真实查询完成 |
| 污染风险 | 基本规避 | 取决于上游 DNS 是否可信 |
| 副作用 | 少数依赖真实 IP 的应用会异常 | 解析慢、有泄漏可能 |
fake-ip 的巧妙之处在于「拖延」:应用问域名对应哪个 IP,内核不急着查,先随手发一个保留网段里的假地址,同时记下「这个假 IP 对应那个域名」。等应用真的向这个假 IP 发起连接时,内核一查映射表就知道目标域名,再按分流规则决定走哪个节点——真正的解析可以交给节点那端完成。整个过程本地没有发生任何对外的域名查询,既快又不泄漏。
redir-host 则老老实实做真实解析,把结果给应用。它的兼容性更好,但速度和抗污染能力都不如 fake-ip。日常使用推荐 fake-ip,只有在遇到明确的兼容性问题时才考虑换回来。
fake-ip 的副作用与 fake-ip-filter
fake-ip 的代价是:有些程序拿到 IP 后要自己做点什么——局域网设备发现、部分游戏的直连匹配、依赖真实 IP 的内网服务——它们收到一个假地址就会出错。
解法是 fake-ip-filter:列在里面的域名不参与 fake-ip,走真实解析。局域网后缀、组播地址、需要直连的服务通常都要加进去:
fake-ip-filter:
- "*.lan"
- "*.local"
- "*.localdomain"
- "+.stun.*.*"
- "time.*.com"
遇到「装上代理后某个软件不正常,关掉就好了」,先把它用到的域名加进这个列表试试——这是排查这类问题的第一手段。
nameserver、fallback 与 default-nameserver
三个字段名字相似,职责完全不同,弄混是配置出错的常见原因:
default-nameserver:只用来解析 DNS 服务器自身的域名。当你把nameserver写成https://doh.example.com/dns-query这种带域名的加密地址时,内核得先知道这个域名的 IP 才能连上去——这就是先有鸡还是先有蛋的问题,所以这里只能填纯 IP 地址。nameserver:主力解析服务器,绝大多数域名由它负责。fallback:备用解析服务器,一般填境外或加密的可信服务器,用于对结果存疑时的二次查询。
一份通用的 dns 配置段
dns:
enable: true
ipv6: false
listen: 0.0.0.0:1053
enhanced-mode: fake-ip
fake-ip-range: 198.18.0.1/16
fake-ip-filter:
- "*.lan"
- "*.local"
- "+.stun.*.*"
default-nameserver:
- 223.5.5.5
- 119.29.29.29
nameserver:
- https://doh.pub/dns-query
- 223.5.5.5
fallback:
- tls://8.8.4.4
- https://1.1.1.1/dns-query
说明几点:listen 是内核自己的 DNS 监听地址,TUN 模式下需要它接收被重定向过来的查询;fake-ip-range 用的是不会与真实公网地址冲突的保留网段;ipv6 在没有 IPv6 需求时关掉可以少一类奇怪问题。如果订阅自带 dns 段,通常不必自己写——改之前先想清楚要解决什么问题。
注意:开启 TUN 模式时,DNS 的影响会被放大——所有流量都经由虚拟网卡,解析一旦不通就是整机断网,而不是某个网站打不开。开 TUN 前后如果连通性差别很大,先怀疑这一段。TUN 的原理与开启方法见 TUN 模式详解。
常见症状对照
| 症状 | 可能原因 | 处理方向 |
|---|---|---|
| 某个应用装了代理就异常,关掉正常 | 它需要真实 IP,被 fake-ip 影响 | 把相关域名加入 fake-ip-filter |
| 网页打开很慢,但节点延迟很低 | 上游 DNS 响应慢或不可达 | 更换 nameserver,减少无效的 fallback |
| 局域网设备、打印机、NAS 访问不了 | 内网域名被 fake-ip 接管 | 加 *.lan、*.local 等过滤项 |
| 部分网站解析到明显错误的地址 | 解析被污染或走了不可信上游 | 确认 enhanced-mode 生效,改用加密 DNS |
| 开 TUN 后完全无法上网 | DNS 段配置有误或未监听 | 检查 enable 与 listen,先关 TUN 对比 |
改完 DNS 段记得重启内核让配置重新加载,必要时清一次系统 DNS 缓存和浏览器缓存——旧的解析结果会让你误判修改没生效。如果调完仍然连不上,问题未必出在 DNS,按 开了代理还是上不了网 的分层顺序从头查一遍更有效率。