Skip to content

DNS

[dns] 的所有字段都是可选的。完全不写 [dns] 时:

  • DIRECT 的域名由系统解析器解析;
  • 其余需要 Core 自己解析的域名使用 udp://8.8.8.8
  • 经本地 HTTP/SOCKS5 端口走代理的域名以域名形式交给代理,在代理一侧解析;
  • 增强模式对规则要求走代理的域名返回 Fake-IP。

先不写 [dns],有明确理由时再加设置。

什么时候需要关心 DNS

本地 HTTP/SOCKS5 端口。 应用直接发送目标域名(CONNECT github.com:443),域名规则直接匹配, 不需要本地解析。

增强模式。 应用在连接前已经自己解析了域名,所以 Core 必须应答它们的 DNS 查询,才能知道一个 IP 对应哪个域名。在 Linux 上,eBPF 后端会自动把查询交给 Core。[dns.tun] 控制 Core 如何应答。完整 说明见《透明分流下的 DNS》

Fake-IP

toml
[dns.tun]
mode = "fake-ip"
fake-ip-range = "198.18.0.1/16"
fake-ip-filter-mode = "blacklist"
fake-ip-filter = ["+.lan", "+.local"]

对于规则要求走代理的域名,Core 从 Fake-IP 地址池分配一个地址作为应答。应用连接这个地址时,Core 把它映射回域名,再把域名交给代理。走 DIRECT 的域名拿到真实地址;走 REJECT 的域名返回 REFUSED

字段默认值说明
mode"fake-ip"fake-ip,或 redir-host 总是返回真实地址
fake-ip-range"198.18.0.1/16"IPv4 地址池,需位于 198.18.0.0/15
fake-ip-range-v6"fd00::1/18"IPv6 地址池
fake-ip-filter-mode"blacklist"blacklist:列表中的域名返回真实地址;whitelist:只有列表中的域名使用 Fake-IP
fake-ip-filter[]example.com+.example.com(含子域名)、*.example.comgeosite:<分类>
fake-ip-ttl300
fake-ip-capacity65535保留的映射数,超出后淘汰最旧的
store-fake-ipfalse重启后保留映射
fake-ip-store-path""保存映射的文件

把本地域名(+.lan+.local,以及必须在本地解析的公司内部域)放进 fake-ip-filter

上游解析器

toml
[dns.upstream]
default = ["https://1.1.1.1/dns-query", "tls://8.8.8.8"]
direct = ["udp://192.168.1.1"]
fallback = ["tls://9.9.9.9"]
字段默认值用途
default["udp://8.8.8.8"]Core 需要解析、且不走直连的域名
direct系统解析器DIRECT 的域名
bootstrap系统解析器解析 DoT/DoH 解析器自身的域名
proxy-serverbootstrap解析 [[proxy]] 服务器的域名
fallback[]主解析器失败时,或由 [dns.fallback-filter] 决定时使用
direct-follow-policyfalse直连域名也应用 nameserver-policy

解析器格式:

格式协议默认端口
192.168.1.1udp://192.168.1.1UDP53
tcp://192.168.1.1TCP53
tls://dns.example.com(或 dot://DNS over TLS853
https://dns.example.com/dns-queryDNS over HTTPS443

:端口 可覆盖默认端口。使用 eBPF 后端时,走 DIRECT 的域名始终由系统解析器解析,直连流量的 表现与不使用 Specola 时一致。

按域名指定解析器

toml
[dns.nameserver-policy]
"+.corp.example.com" = "udp://10.0.0.53"
"build.internal.example.org" = ["udp://10.1.0.53", "udp://10.1.0.54"]

键可以是完整域名、+. 加后缀(该域名及子域名),或 geosite:<分类>,最长匹配优先。策略作用于 不走直连的域名;direct-follow-policy = true 时也作用于直连域名。

Fallback 过滤

[dns.fallback-filter] 决定主解析器已经返回结果时是否仍改用 fallback。字段:geoip(布尔)、 geoip-code(默认 "CN")、ipcidrdomain(列表)。

Route resolution

要不要为了测试 IP 规则去解析一个域名?由 route-resolution 决定,本地端口([dns.system-proxy]) 和增强模式([dns.tun])分别设置:

取值行为
domain-only(默认)从不;没有命中域名规则的域名直接按 FINAL 处理
unknown-domain仅当没有命中域名规则、且 FINAL 是代理时解析
always解析每个域名,按列表顺序比较域名规则和 IP 规则

unknown-domainalways 至少需要两个 probe-resolver,并行查询;不足两个时 Core 会记录警告 并退回 domain-only

toml
[dns.system-proxy]
route-resolution = "unknown-domain"
probe-resolver = ["udp://1.1.1.1", "udp://8.8.8.8"]
probe-timeout-ms = 1500

能写域名规则时,优先写域名规则,而不是开启解析。

通用字段

字段默认值说明
ipv6false是否应答 AAAA;使用 eBPF 后端(只接管 IPv4)时保持 false
respect-rulestrue域名的 DNS 查询经由其规则选择的代理发出
disable-cachefalse
cache-capacity4096最小 128
cache-min-ttl10
negative-cache-ttl30
query-timeout-ms5000最小 100
use-hoststrue
use-system-hoststrue读取 /etc/hosts

[dns.hosts] enable = true 尚未实现,会被拒绝;请使用系统 hosts 文件。

本地 DNS 监听

Core 也可以在某个端口提供 DNS 服务,供你手动指向它的其他程序使用。默认关闭,增强模式不需要它。

toml
[dns.listener]
enable = true
address = "127.0.0.1:1053"

旧字段名

[dns] 下的扁平字段如 enablelistennameserverdefault-nameserverenhanced-modefake-ip-range 仍会读取,但会给出警告。请迁移到上面的子表:nameserver[dns.upstream] defaultdefault-nameserverbootstraplisten[dns.listener] addressenhanced-mode[dns.tun] mode