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
[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.com、geosite:<分类> |
fake-ip-ttl | 300 | 秒 |
fake-ip-capacity | 65535 | 保留的映射数,超出后淘汰最旧的 |
store-fake-ip | false | 重启后保留映射 |
fake-ip-store-path | "" | 保存映射的文件 |
把本地域名(+.lan、+.local,以及必须在本地解析的公司内部域)放进 fake-ip-filter。
上游解析器
[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-server | bootstrap | 解析 [[proxy]] 服务器的域名 |
fallback | [] | 主解析器失败时,或由 [dns.fallback-filter] 决定时使用 |
direct-follow-policy | false | 直连域名也应用 nameserver-policy |
解析器格式:
| 格式 | 协议 | 默认端口 |
|---|---|---|
192.168.1.1 或 udp://192.168.1.1 | UDP | 53 |
tcp://192.168.1.1 | TCP | 53 |
tls://dns.example.com(或 dot://) | DNS over TLS | 853 |
https://dns.example.com/dns-query | DNS over HTTPS | 443 |
加 :端口 可覆盖默认端口。使用 eBPF 后端时,走 DIRECT 的域名始终由系统解析器解析,直连流量的 表现与不使用 Specola 时一致。
按域名指定解析器
[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")、ipcidr 和 domain(列表)。
Route resolution
要不要为了测试 IP 规则去解析一个域名?由 route-resolution 决定,本地端口([dns.system-proxy]) 和增强模式([dns.tun])分别设置:
| 取值 | 行为 |
|---|---|
domain-only(默认) | 从不;没有命中域名规则的域名直接按 FINAL 处理 |
unknown-domain | 仅当没有命中域名规则、且 FINAL 是代理时解析 |
always | 解析每个域名,按列表顺序比较域名规则和 IP 规则 |
unknown-domain 和 always 至少需要两个 probe-resolver,并行查询;不足两个时 Core 会记录警告 并退回 domain-only。
[dns.system-proxy]
route-resolution = "unknown-domain"
probe-resolver = ["udp://1.1.1.1", "udp://8.8.8.8"]
probe-timeout-ms = 1500能写域名规则时,优先写域名规则,而不是开启解析。
通用字段
| 字段 | 默认值 | 说明 |
|---|---|---|
ipv6 | false | 是否应答 AAAA;使用 eBPF 后端(只接管 IPv4)时保持 false |
respect-rules | true | 域名的 DNS 查询经由其规则选择的代理发出 |
disable-cache | false | |
cache-capacity | 4096 | 最小 128 |
cache-min-ttl | 10 | 秒 |
negative-cache-ttl | 30 | 秒 |
query-timeout-ms | 5000 | 最小 100 |
use-hosts | true | |
use-system-hosts | true | 读取 /etc/hosts |
[dns.hosts] enable = true 尚未实现,会被拒绝;请使用系统 hosts 文件。
本地 DNS 监听
Core 也可以在某个端口提供 DNS 服务,供你手动指向它的其他程序使用。默认关闭,增强模式不需要它。
[dns.listener]
enable = true
address = "127.0.0.1:1053"旧字段名
[dns] 下的扁平字段如 enable、listen、nameserver、default-nameserver、enhanced-mode、 fake-ip-range 仍会读取,但会给出警告。请迁移到上面的子表:nameserver → [dns.upstream] default, default-nameserver → bootstrap,listen → [dns.listener] address,enhanced-mode → [dns.tun] mode。