DNS 决定了一个域名解析到哪个 IP,而 IP 会直接影响后续的规则匹配结果。 把 DNS 交给内核统一管理,可以避免「规则命中了直连,但拿到的是被污染的地址」这类问题。
为什么需要独立 DNS
- 域名解析在本地完成,不会因为系统 DNS 被劫持而拿到错误结果;
- 可以让需要代理的域名通过代理侧解析,拿到更接近节点的地址;
- 支持 fake-ip,规则匹配只看域名,不必等待真实解析,首包延迟明显降低。
fake-ip 与 redir-host
这是配置 DNS 时第一个要做的选择,两者的差异如下:
| 模式 | 行为 | 优点 | 缺点 |
|---|---|---|---|
fake-ip |
立即返回一个假 IP,真实解析延后到连接建立时 | 首包快,规则按域名匹配更准 | 部分程序不识别假 IP,需要加白名单 |
redir-host |
先完成真实解析再返回 | 兼容性好,任何程序都能正常使用 | 每次请求都要等 DNS,延迟更高 |
日常使用推荐 fake-ip;如果发现某些局域网工具或旧软件异常,再退回 redir-host。
基础配置示例
dns:
enable: true
ipv6: false
listen: 0.0.0.0:1053
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:
- 223.5.5.5
- https://doh.pub/dns-query
fallback:
- https://1.1.1.1/dns-query
- https://dns.google/dns-query
fake-ip-filter 必须配置。局域网设备发现、打印机、智能家居等依赖真实 IP 的场景,需要把对应域名排除在假 IP 之外,否则会直接不可用。
按域名指定解析器
用 nameserver-policy 精确控制某类域名走哪个 DNS,这是减少污染最有效的手段:
dns:
nameserver-policy:
"geosite:cn":
- 223.5.5.5
- 119.29.29.29
"geosite:geolocation-!cn":
- https://1.1.1.1/dns-query
"example.cn": 223.5.5.5
启用 DoH 加密解析
传统的 53 端口 DNS 是明文传输,本地网络可以看到你访问了哪些域名。改用 DoH 后,查询内容被加密在 HTTPS 中:
dns:
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
fallback-filter:
geoip: true
geoip-code: CN
ipcidr:
- 240.0.0.0/4
fallback-filter 的作用是:当主解析器返回的结果包含国内地址,或落在不受信任的网段时,
就采用 fallback 的结果,从而规避污染。
验证是否泄漏
配置完成后应当验证两件事:解析是否生效、是否有查询绕过内核。
# 指定内核监听的 DNS 端口查询
nslookup example.com 127.0.0.1 -port=1053
# 抓包确认是否仍有明文 53 端口查询
sudo tcpdump -i any -n udp port 53
如果抓包能看到持续不断的明文查询,说明有程序绕过了内核自带的 DNS。 此时需要开启 TUN 模式强制接管,并在系统层面把 DNS 指向内核监听地址。
强制接管系统流量需要 TUN 模式,见 TUN 模式原理与开启方法。