DNS
Egern 的 DNS 提供了多种协议支持,如传统的 DNS、DNS over HTTPS、DNS over TLS 和 DNS over QUIC。用户可以通过配置转发规则,将特定的域名请求转发到不同的 DNS 服务器上。
Bootstrap(默认的 DNS 服务器)
Egern 默认使用系统配置的 DNS 服务器,即 Wi-Fi 或蜂窝网络的 DNS 服务器。此服务器仅支持传统的 DNS 协议,用于解析 Upstreams 中配置的 DNS 服务器的域名,以及当 forward 规则未匹配时作为默认 DNS 服务器。Bootstrap 配置的 DNS 服务器不遵循代理规则,流量会直接连接到服务器。
Upstreams(DNS 服务器组)
Upstreams 配置包括传统 DNS 协议、DNS over HTTPS、DNS over TLS 和 DNS over QUIC 的 DNS 服务器。key 为组名,value 为服务器列表。
支持的服务器格式:
- UDP DNS:
1.1.1.1、1.1.1.1:53 - DNS over TLS:
tls://1.1.1.1 - DNS over HTTPS:
https://8.8.8.8/dns-query - DNS over QUIC:
quic://dns.adguard-dns.com - 特殊值
bootstrap:使用 bootstrap DNS 服务器
Forward(DNS 转发规则)
Forward 用于定义 DNS 转发规则,每条规则由域名匹配项和上游 DNS 组组成。支持以下匹配类型:
| 类型 | 说明 |
|---|---|
| domain | 精确域名匹配 |
| domain_keyword | 域名关键词匹配 |
| domain_suffix | 域名后缀匹配 |
| wildcard | 通配符匹配(如 *.google.com) |
| regex | 正则表达式匹配 |
| proxy_rule_set | 使用代理规则集匹配 |
每条规则包含以下字段:
-
match (string), 必填
匹配条件。
-
value (string), 必填
上游 DNS 组名或服务器地址。支持
upstreams中定义的组名、DNS 服务器地址、特殊值reject(拒绝解析)和bootstrap(使用 bootstrap DNS)。 -
disabled (bool), 可选
是否禁用此规则。
-
update_interval (integer), 可选
规则集更新间隔(秒),仅 proxy_rule_set 类型有效,默认 86400 秒。
Hosts(主机映射)
Hosts 用于将主机名映射到 IP 地址或其他主机名。key 为 glob 通配符模式,用于匹配域名或 IP 地址(如 *.google.com、192.168.1.*)。value 可以是 IP 地址或域名,支持单个值或多个值的数组。
hosts:
"*.google.com": 142.250.80.46 # 通配符匹配域名,映射到 IP
"example.com": www.example.com # 域名映射到另一个域名
"192.168.1.100": internal.example.com # IP 匹配,映射到域名
"cdn.example.com": # 映射到多个 IP
- 1.2.3.4
- 5.6.7.8
Block IPs(屏蔽 IP)
用于过滤 DNS 响应中的 IP 地址(防止 DNS 污染)。DNS 响应中匹配这些 IP 的记录会被过滤掉,只有当所有记录都被过滤时才视为解析失败。支持 IPv4、IPv6 地址及 CIDR 格式(如 10.0.0.0/8)。
公网 IP 查询地 址
此地址用于查询设备的公网 IP,并作为 EDNS Client Subnet 的参数,帮助 DNS 服务器提供离设备公网 IP 最近的域名解析结果。响应内容应为纯文本格式的 IP 地址。
配置示例
dns:
bootstrap:
- system # 使用系统默认的 DNS 配置作为引导
upstreams:
google:
- https://8.8.8.8/dns-query
- https://8.8.4.4/dns-query
adguard:
- quic://dns.adguard-dns.com
forward:
- domain:
match: "internal.example.com"
value: "192.168.1.1"
- domain_suffix:
match: "cn"
value: bootstrap
- domain_keyword:
match: "taobao"
value: bootstrap
- wildcard:
match: "*.cn"
value: bootstrap
- proxy_rule_set:
match: "https://example.com/china-domains.list"
value: bootstrap
update_interval: 86400
- regex:
match: "^ad\\..*|^ads\\..*"
value: reject
- wildcard:
match: "*"
value: google
hosts:
example.com: www.example.com
localhost: 127.0.0.1
"*.local": 192.168.1.1
block_ips:
- 1.2.3.4
- 4.3.2.1/32
public_ip_lookup_url: https://ifconfig.me/ip
常见问题
为什么有 Upstreams 还需要 Bootstrap 的 DNS 服务器?
这是因为 Upstreams 中配置的 DNS 服务器的域名解析,可能需要依赖 Bootstrap DNS 服务器来完成初始解析。