Skip to content

DNS — mihomo

mihomo 的 dns: 块庞大而扁平。核心思路:声明 解析器列表 (nameserver)与 回落 列表,并通过 fallback-filter 过滤 哪些查询走回落;按域名覆盖通过 nameserver-policy 实现。可选启用 fake-IP 引擎以配合嗅探感知的路由。

顶层选项

字段类型默认值允许值描述
enableboolfalsetrue | false总开关。为 false 时块内其他字段被忽略,使用操作系统解析器。
prefer-h3boolfalsetrue | false当服务器 URL 同时支持 H2 与 H3 时,优先使用 DNS-over-HTTPS/3(基于 QUIC)。
ipv6boolfalsetrue | false解析 AAAA 记录。为 false 时仅发起 A 查询。
ipv6-timeoutuint100<milliseconds>等待 AAAA 应答的最长时间,超时后回落到仅 IPv4。文档默认 100ms。
use-hostsboolfalsetrue | false在走网络之前先查询顶层 `hosts:` 映射。
use-system-hostsboolfalsetrue | false也查询操作系统 hosts 文件(`/etc/hosts`)。
respect-rulesboolfalsetrue | 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-filterRawFallbackFilter{geoip: true, geoip-code: "CN"}RawFallbackFilter决定何时查询 `fallback`。包含 `geoip`、`geoip-code`、`ipcidr`、`domain`、`geosite`。
listenstring(disabled)<host:port>设置后在该地址上运行本地 DNS 服务器。服务器遵循与内部解析器相同的规则。
enhanced-modeC.DNSModenormalnormal | redir-host | fake-ipDNS 引擎模式。`normal` 返回真实答案;`redir-host` 返回 IP,但把连接标注原始域名(利于嗅探感知的路由);`fake-ip` 从 `fake-ip-range` 返回合成 IP。
fake-ip-rangestring198.18.0.1/16<CIDR>分配伪 IP 的 IPv4 段(仅 `fake-ip` 模式)。
fake-ip-range6string(unset)<CIDR>可选的 IPv6 段。
fake-ip-filter[]string[]<domain pattern>**不** 应分配伪 IP 的域名,会直接走真实解析器。支持通配符。
fake-ip-filter-modeC.FilterModeblacklistblacklist | whitelist`fake-ip-filter` 是黑名单(命中的跳过 fake-ip)还是白名单(仅命中的使用 fake-ip)。
fake-ip-ttlint1<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-algorithmstringlrulru | arc淘汰算法。`arc`(Adaptive Replacement Cache)在突发访问模式下有时更好。
cache-max-sizeint0 (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-policyboolfalsetrue | false把 `nameserver-policy` 也应用到 `direct-nameserver` 查询。

源码: config/config.go:218-244 · 锚定版本 v1.19.27 (5184081)

Nameserver URL scheme

nameserverfallbackdefault-nameserverproxy-server-nameserverdirect-nameserver 列表都接受同一套 URL 语法:

Scheme示例说明
(裸 IP)223.5.5.5UDP/53
udp://udp://8.8.8.8:53显式 UDP,可指定端口
tcp://tcp://8.8.8.8:53DNS-over-TCP
tls://tls://1.1.1.1:853DNS-over-TLS
https://https://doh.pub/dns-queryDNS-over-HTTPS(H2)
quic://quic://dns.adguard-dns.comDNS-over-QUIC
h3://h3://1.1.1.1/dns-queryDoH over HTTP/3
system://system://操作系统解析器
dhcp://dhcp://eth0eth0 上 DHCP 派发的解析器
rcode://rcode://refused返回固定 RCODE

URL 主机部分之后可加 #<proxy> 后缀,把 DNS 流量强制走命名代理:

yaml
nameserver:
  - https://cloudflare-dns.com/dns-query#proxy

nameserver-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-query

nameserver-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)

由 Argsment 出品的 Core Tutorial