DNS — mihomo
mihomo 的 dns: 块庞大而扁平。核心思路:声明 主 解析器列表 (nameserver)与 回落 列表,并通过 fallback-filter 过滤 哪些查询走回落;按域名覆盖通过 nameserver-policy 实现。可选启用 fake-IP 引擎以配合嗅探感知的路由。
顶层选项
| 字段 | 类型 | 默认值 | 允许值 | 描述 |
|---|---|---|---|---|
enable | bool | false | true | false | 总开关。为 false 时块内其他字段被忽略,使用操作系统解析器。 |
prefer-h3 | bool | false | true | false | 当服务器 URL 同时支持 H2 与 H3 时,优先使用 DNS-over-HTTPS/3(基于 QUIC)。 |
ipv6 | bool | false | true | false | 解析 AAAA 记录。为 false 时仅发起 A 查询。 |
ipv6-timeout | uint | 100 | <milliseconds> | 等待 AAAA 应答的最长时间,超时后回落到仅 IPv4。文档默认 100ms。 |
use-hosts | bool | false | true | false | 在走网络之前先查询顶层 `hosts:` 映射。 |
use-system-hosts | bool | false | true | false | 也查询操作系统 hosts 文件(`/etc/hosts`)。 |
respect-rules | bool | false | true | false | 对 DNS 查询本身运行 **路由规则**。为 true 时查询的出站由 rules 列表决定 —— 可用于把 DNS 流量路由到特定隧道。 |
nameserver | []string | [] | [<URL>] | 主解析器列表。每条目为 URL:`udp://...`、`tcp://...`、`tls://...`、`https://...`、`quic://...`、`system://`、`dhcp://<iface>`、`rcode://...`。 |
fallback | []string | [] | [<URL>] | 回落解析器列表 —— 当主解析器答案被 `fallback-filter` 过滤掉(如对非国内域名返回国内 IP)时使用。 |
fallback-filter | RawFallbackFilter | {geoip: true, geoip-code: "CN"} | RawFallbackFilter | 决定何时查询 `fallback`。包含 `geoip`、`geoip-code`、`ipcidr`、`domain`、`geosite`。 |
listen | string | (disabled) | <host:port> | 设置后在该地址上运行本地 DNS 服务器。服务器遵循与内部解析器相同的规则。 |
enhanced-mode | C.DNSMode | normal | normal | redir-host | fake-ip | DNS 引擎模式。`normal` 返回真实答案;`redir-host` 返回 IP,但把连接标注原始域名(利于嗅探感知的路由);`fake-ip` 从 `fake-ip-range` 返回合成 IP。 |
fake-ip-range | string | 198.18.0.1/16 | <CIDR> | 分配伪 IP 的 IPv4 段(仅 `fake-ip` 模式)。 |
fake-ip-range6 | string | (unset) | <CIDR> | 可选的 IPv6 段。 |
fake-ip-filter | []string | [] | <domain pattern> | **不** 应分配伪 IP 的域名,会直接走真实解析器。支持通配符。 |
fake-ip-filter-mode | C.FilterMode | blacklist | blacklist | whitelist | `fake-ip-filter` 是黑名单(命中的跳过 fake-ip)还是白名单(仅命中的使用 fake-ip)。 |
fake-ip-ttl | int | 1 | <seconds> | fake-IP 答案的 TTL(秒)。值越小客户端越频繁重解析,便于保持映射新鲜。 |
default-nameserver | []string | [114.114.114.114, 223.5.5.5, 8.8.8.8, 1.0.0.1] | [<URL>] | 引导解析器,用于解析 `nameserver` / `fallback` 自身的主机名。**必须** 是纯 IP —— 不允许再次解析。 |
cache-algorithm | string | lru | lru | arc | 淘汰算法。`arc`(Adaptive Replacement Cache)在突发访问模式下有时更好。 |
cache-max-size | int | 0 (unbounded) | <int> | 缓存条目最大数。 |
nameserver-policy | *orderedmap.OrderedMap[string, any] | {} | {<domain or rule>: <URL or [URL]>} | 按域名模式的路由。键为域名模式或 `geosite:` / `rule-set:` / `+./` 形式;值为解析器 URL。优先级高于 `nameserver`。 |
proxy-server-nameserver | []string | [] | [<URL>] | **专门** 用于解析代理服务器主机名的解析器。避免代理主机名经其自身代理路由的鸡生蛋问题。 |
proxy-server-nameserver-policy | *orderedmap.OrderedMap[string, any] | {} | {<pattern>: <URL>} | 按域名模式覆盖 `proxy-server-nameserver`。 |
direct-nameserver | []string | [] | [<URL>] | DIRECT 路由目的地使用的解析器。避免国内 DNS 查询经代理泄露。 |
direct-nameserver-follow-policy | bool | false | true | false | 把 `nameserver-policy` 也应用到 `direct-nameserver` 查询。 |
源码: config/config.go:218-244 · 锚定版本 v1.19.27 (5184081)
Nameserver URL scheme
nameserver、fallback、default-nameserver、 proxy-server-nameserver、direct-nameserver 列表都接受同一套 URL 语法:
| Scheme | 示例 | 说明 |
|---|---|---|
| (裸 IP) | 223.5.5.5 | UDP/53 |
udp:// | udp://8.8.8.8:53 | 显式 UDP,可指定端口 |
tcp:// | tcp://8.8.8.8:53 | DNS-over-TCP |
tls:// | tls://1.1.1.1:853 | DNS-over-TLS |
https:// | https://doh.pub/dns-query | DNS-over-HTTPS(H2) |
quic:// | quic://dns.adguard-dns.com | DNS-over-QUIC |
h3:// | h3://1.1.1.1/dns-query | DoH over HTTP/3 |
system:// | system:// | 操作系统解析器 |
dhcp:// | dhcp://eth0 | eth0 上 DHCP 派发的解析器 |
rcode:// | rcode://refused | 返回固定 RCODE |
URL 主机部分之后可加 #<proxy> 后缀,把 DNS 流量强制走命名代理:
yaml
nameserver:
- https://cloudflare-dns.com/dns-query#proxynameserver-policy
最强大的字段。键是匹配器,值是解析器 URL 或 URL 列表:
yaml
nameserver-policy:
"geosite:cn,private": # GeoSite 类目匹配
- 223.5.5.5
- 114.114.114.114
"+.cn": # 后缀匹配 —— 注意 +. 前缀
- https://doh.pub/dns-query
"rule-set:cn": # rule-set 引用
- 223.5.5.5
"www.example.com": # 精确域名
- https://example-dns.com/dns-querynameserver-policy 在主 nameserver 列表 之前 查询,因此命中的 域名完全绕过标准解析器。
fallback-filter
决定何时认为主答案「可疑」并触发回落查询:
yaml
fallback-filter:
geoip: true # 启用 GeoIP 过滤
geoip-code: CN # 认为该国家的答案对非国内域名而言可疑
ipcidr:
- 240.0.0.0/4 # 命中该 CIDR 则触发回落
geosite:
- gfw # 这些 GeoSite 类目必须走回落
domain:
- +.google.com # 这些域名模式必须走回落当主答案匹配 geoip-code / ipcidr 且 查询域名不匹配 geosite / domain 时,主答案被拒绝并查询 fallback 列表。
示例
经典的 CN 旁路 DNS:
yaml
dns:
enable: true
prefer-h3: true
enhanced-mode: fake-ip
fake-ip-range: 198.18.0.1/16
fake-ip-filter:
- '+.lan'
- '+.local'
- 'localhost.ptlogin2.qq.com'
default-nameserver:
- 223.5.5.5
- 119.29.29.29
nameserver:
- https://doh.pub/dns-query
- https://dns.alidns.com/dns-query
fallback:
- https://1.1.1.1/dns-query
- https://dns.google/dns-query
- tls://8.8.4.4:853
fallback-filter:
geoip: true
geoip-code: CN
geosite:
- gfw
nameserver-policy:
'geosite:cn,private':
- https://doh.pub/dns-query
'geosite:gfw,geolocation-!cn':
- https://1.1.1.1/dns-query
- https://dns.google/dns-query
proxy-server-nameserver:
- https://doh.pub/dns-query
direct-nameserver:
- https://doh.pub/dns-query供下游设备使用的本地 DNS 服务器:
yaml
dns:
enable: true
listen: 0.0.0.0:53
enhanced-mode: redir-host
nameserver:
- https://1.1.1.1/dns-query说明
enhanced-mode: fake-ip是透明代理部署的标准模式。真实 IP 在 代理侧 解析,而非客户端 —— 嗅探感知的路由规则因此能看到原始 域名。default-nameserver中只能写 纯 IP 地址。它们用于解析nameserver/fallback的主机名本身;这里允许主机名会形成 引导期循环。fake-ip-filter接受与路由规则相同的域名模式语法 (+.example.com为后缀,geosite:apple为类目)。proxy-server-nameserver对「代理服务器主机名同时也是路由规则中 的域名」的部署 极其关键。否则解析代理主机名时可能递归地试图 经其自身路由。direct-nameserver避免直连绑定的查询泄露到回落(境外)解析器。 当fallback是唯一未被审查的路径时很有用。
跨内核说明
- Xray-core 使用扁平块,元素为 URL 字符串或对象,并按服务器配置
domains/expectedIPs/unexpectedIPs。参见 DNS — Xray-core。 - sing-box 使用类型化服务器(
type: "https"、type: "fakeip"等)与带显式 action 的结构化 DNS 规则链。参见 DNS — sing-box。
源码: config/config.go:218-244 · v1.19.27 (5184081)
