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 模式原理与开启方法

配置 ← 返回教程列表