Surge 本地 DNS 映射和 DNS 相关设置

内容纲要

查看【Surge】专题可浏览更多内容

DNS 服务器

传统 DNS 服务器

[General]
# DNS 服务器设置
dns-server = 119.29.29.29,117.50.10.10,system

[Rule]
FINAL,DIRECT

对于 DNS 服务器的设置位于 [General] 下的 dns-server 配置字段,每个 DNS 服务器地址以英文逗号隔开。Surge 会同时向所有配置的 DNS 上游服务器进行 DNS 查询,并选取最快的返回结果,以提高性能。该特性和 dnsmasq 的实现一致。

此处的 system 表示系统 DNS 服务器,你可以只保留 system 表示只使用系统 DNS 服务器,或者和自定义 DNS 共存混合使用(即上述示例),再或者将 system 删除表示只使用自定义 DNS 服务器。

配置 DNS 服务器的一些要点:

  1. 速度与稳定性:DNS 服务器需要保证稳定性和速度,所以应尽量使用地理位置靠近的 DNS 服务器。
  2. edns-client-subnet 支持:对于巨型网站(如 apple.com),一般在全世界都配置有 CDN 服务器,有 ECS 支持的 DNS 服务器可以根据访问源 IP 地址,返回最合适的服务器 IP 地址。(但这种设计会有隐私泄露的可能,所以 1.1.1.1 并不支持。)
  3. 无需考虑使用代理策略的主机:如果请求使用了代理策略,那么并不会在本地执行 DNS 查询,所以不需要为该类网络考虑 DNS 问题。(且只有代理服务器在远端执行 DNS 查询,才能确保得到一个最适合该代理服务器的 CDN 节点服务器地址。)

但目前海外 DNS 基本在国内没有节点导致 CDN 解析结果没有指向合适的服务器 IP 地址,导致网络使用感受卡顿缓慢。如优酷解析到香港的 CDN 而不是大陆的(包括使用腾讯的 119.28.28.28 因运营商没有对路由进行更新也会导致此问题,119.28.28.28 目前也不再被腾讯公开宣传使用)。

而且,不是使用了海外 DNS 就不会被 DNS 污染了(且在使用 Surge 代理规则后解决了污染问题就更不需要担心此问题),另外部分区域的运营商还对海外 DNS 请求完全进行抢答,所以个人认为使用海外 DNS 没有意义。

总而言之一句话:如果所使用的网络没有 DNS 劫持问题,则配置为使用系统 DNS 并追加公共 DNS,如果所使用的网络存在 DNS 劫持问题,则配置为仅使用公共 DNS。

另外公共 DNS 也不是一点缺点也没有,如果感兴趣可以阅读这两篇文章:

加密 DNS 服务器

从 Surge iOS 4.3 开始 Surge 开始支持 DNS over HTTPS。但在开始使用 DNS over HTTPS 前得大概知道什么是 DNS over HTTPS。

包括 Surge 作者 Yachen Liu 也说过「国内正常情况下没必要用 DoH」。个人也同样建议,除了国内某些地区的运营商对于 DNS 存在抢答行为(简单来说就是即便你设置了使用自定义 DNS 但仍然得到来自运营商 DNS 服务器的结果)只能使用 DoH 外,正常情况下使用传统的运营商 DNS 或公共 DNS 即可。

使用 DoH 的核心作用有两个:

  1. 避免 DNS 劫持:查询过程受 TLS 保护,可以避免 DNS 结果被链路所有者的篡改。
  2. 隐私保护:传统 DNS 使用明文进行查询,链路所有者可以知道用户访问的域名。

如果没有发现自己的网络有出现 DNS 劫持的问题(如被插入网页广告),不需要配置 DoH,DoH 的查询效率低于传统 DNS,且复杂度高更容易出现问题。

如果需要配置 DoH,请尽量避免使用 Cloudflare/1.1.1.1 的 DoH 服务,Cloudflare 处于隐私保护考虑不支持 EDNS-Client-Subnet,会出现严重的 CDN 缓慢问题。同理,避免使用代理进行 DoH 查询。

[General]
# 传统 DNS 服务器设置
dns-server = 119.29.29.29
# 加密 DNS 服务器设置
encrypted-dns-server = https://doh.pub/dns-query
# 使加密 DNS 请求通过代理策略执行
encrypted-dns-follow-outbound-mode = false
# 跳过证书验证
encrypted-dns-skip-cert-verification = false

[Proxy]

[Rule]
FINAL,DIRECT

配置加密 DNS 的一些事项:

  1. encrypted-dns-server 推荐仅配置一个地址;
  2. 配置加密 DNS 后,传统 DNS 仅用作连通性测试和加密 DNS 的域名解析;
  3. 可配置 encrypted-dns-follow-outbound-mode = true 使请求通过代理策略执行。

    DoH 查询的开销远大于传统 DNS,配置过多 DoH 会使得 Surge 消耗更多的内存。且按照官方建议此参数仅给有特殊需求的用户设计,一般用户不应该开启;

  4. encrypted-dns-follow-outbound-mode 支持 DoQ 和 DoH3 协议,PROTOCOL 规则对应关键字为 DOQDOH3,遵循标准的 UDP 策略回退配置 (udp-policy-not-supported-behaviour) ;
  5. IP 层的 DNS relay 使用 encrypted-dns-server 进行转发 (同样影响 always-real-ip 参数行为);

DNS 选项

从 /etc/hosts 中读取 DNS 记录

[General]
read-etc-hosts = true

对使用代理的请求强制使用本地 DNS 映射结果

默认情况下,当使用代理策略时,DNS 解析永远在代理服务器进行。

开启该选项后,对于存在于本地 DNS 映射中的域名,Surge 将使用本地映射结果的 IP 地址进行代理请求,而不再使用原始域名。

仅对使用了 IP 地址的本地映射记录生效。

[General]
use-local-host-item-for-proxy = true

本地 DNS 映射

该功能和 /etc/hosts 文件基本一致。

[General]
# DNS 服务器设置
dns-server = 119.29.29.29,117.50.10.10,system

[Rule]
FINAL,DIRECT

[Host]
localhost = 127.0.0.1

本地 DNS 映射位于 [Host] 字段下,格式为:域名 = IP 地址

除了直接指定主机名所对应的 IP 地址,还支持本地值指定域名、对特定域名自定义特定的 DNS 服务器。

通配符

[Host]
*.example.com = 1.1.1.1
one.one.one.one = 1.1.1.1, 1.0.0.1

通配符支持 * 和 ?

允许为域名配置多个 IP 作为并发使用结果

本地值指定域名

[Host]
example.com = www.example.com

这相当于 CNAME 记录。

使用特定的 DNS 服务器

如域名 example.com 及其子域名指定使用 DNS 服务器 119.29.29.29 来解析:

[Host]
example.com = server:119.29.29.29
*.example.com = server:119.29.29.29

Surge 还支持配置部分域名回退到系统 DNS 解析:

[Host]
example.com = server:syslib

这可用于解决一些兼容性问题,比如一些 VPN 会利用 Split DNS 机制在系统中添加用于处理特定域名的 DNS 服务器,Surge 目前还不能支持这种复杂逻辑,可通过对 VPN 相关域名配置回退解决。

参考