Featured image of post 我的家庭网络域名解析方案

我的家庭网络域名解析方案

想要上网上得痛快,就必须要先解决 DNS 的问题。

人在中国,用起 DNS 会碰到两个问题,一个是 DNS 污染,另一个是 DNS 泄露。想要上网上得痛快,就必须要先解决 DNS 的问题。

什么是 DNS 泄露

如果你现在正在开着代理看这篇文章,可以先打开这个网站检测一下自己的 DNS 请求是否被发送到了国内的 DNS 服务器上。

典型的 DNS 泄露

简单来说,当你在使用 VPN 等代理工具时,你认为你的请求不会被除了你和 VPN 提供商以外的第三方看到,然而主机的 DNS 请求却被发送送给了运营商的 DNS 服务器或者是公共 DNS 服务器(阿里、腾讯等)进行解析,而你的真实 IP 地址和请求的域名都会被记录下来。如果 DNS 请求解析一些敏感网站的域名(比如电报、维基解密等),就会被监管者注意到,从而被警告或者请去喝茶。1

因此,正确地配置代理工具的分流策略来避免 DNS 泄露就显得尤为重要。

SmartDNS 的配置

防止 DNS 泄露

DNS 作为上网的指路人,排在第一位的要求就是必须要快,在这样的要求下本地部署 SmartDNS 充当家庭网络的 DNS 服务器真的再合适不过了。关于 SmartDNS 的作用和配置技巧,以及其如何优选 CDN 加快网络访问速度,Sukka 的「我有特别的 DNS 配置和使用技巧」已经讲的很好,推荐在继续阅读本文之前先去看看这篇文章,其中的内容我在这里便不再赘述,我的叙述重心将会放在如何在 Luci 界面上实现这些配置。

如果你和我一样使用 OpenWRT,SmartDNS 的 Luci App 会在每次启动时根据面板上保存的配置自动生成新的配置文件,所以,不要直接修改/etc/smartdns目录下原有的配置文件,所有的更改都应该在 Luci App 里操作。

基本上,SmartDNS 上游数量越多越好,因为较多的上游并不会影响 SmartDNS 的性能2,并且多个上游可以增加冗余。为了防止 DNS 泄露,在配置上游时,应当在默认分组添加国外 DNS 上游(当然,最好是加密 DNS),并将国内的服务器归入一个单独的分组(例如domestic),并加上-exclude-default-group的额外参数以将它们从默认分组中排除。

国内上游的分组设置 一些可供参考的上游

加速国内域名解析

设置好国外上游,DNS 泄露的问题就解决了,但因为我们在默认分组中排除了国内上游,访问新的域名时需要等待国外上游返回结果,这显然会拖慢国内网站的访问速度,并且还会劣化 CDN。

dnsmasq-china-list 是 Felix Yan 的项目,目前支持通过 Makefile 生成 SmartDNS 格式的配置文件,目前已经有人做好了现成的 Github Action 每天自动更新,直接下载就可以了,注意这些配置文件只会在国内 DNS 上游分组名称为domestic时生效。

1
2
3
4
5
cd /etc/smartdns
wget https://gcore.jsdelivr.net/gh/Olixn/china_list_for_smartdns@main/accelerated-domains.china.domain.smartdns.conf
wget https://gcore.jsdelivr.net/gh/Olixn/china_list_for_smartdns@main/apple.china.domain.smartdns.conf
wget https://gcore.jsdelivr.net/gh/Olixn/china_list_for_smartdns@main/chinalist.domain.smartdns.conf
wget https://gcore.jsdelivr.net/gh/Olixn/china_list_for_smartdns@main/google.china.domain.smartdns.conf

随后在 SmartDNS 中引入这些配置文件,将下面的内容粘贴到「自定义设置」栏的末尾。

1
2
3
4
conf-file /etc/smartdns/accelerated-domains.china.domain.smartdns.conf
conf-file /etc/smartdns/apple.china.domain.smartdns.conf
conf-file /etc/smartdns/chinalist.domain.smartdns.conf
conf-file /etc/smartdns/google.china.domain.smartdns.conf

引入配置文件

这样配置之后,国内域名的访问速度便不再会受到影响,访问国外域名时,也不会再有 DNS 泄露的问题了。

在无代理的情况下防止 DNS 泄露

去广告

DNS 层面的去广告效果有限,重点应该放在防止误杀上,所以不要用那臭名昭著3的号称自己是「致力于成为中文区命中率最高的广告过滤列表」的 Anti AD,而是使用一些别的规则。个人使用的规则是 217heidai/adblockfilters,这是一个已经整理好的聚合规则,直接拉取即可。

1
wget -O /etc/smartdns/adblock.conf https://gcore.jsdelivr.net/gh/217heidai/adblockfilters@main/rules/adblocksmartdns.conf

最后引入配置文件:

1
conf-file /etc/smartdns/adblock.conf

自动更新规则

设置如下 Crontab 即可在每天凌晨三点自动更新所有规则。

1
2
3
4
5
0 0 3 * * ?  wget -O /etc/smartdns/adblock.conf https://gcore.jsdelivr.net/gh/217heidai/adblockfilters@main/rules/adblocksmartdns.conf
0 0 3 * * ? wget -O /etc/smartdns/accelerated-domains.china.domain.smartdns.conf https://gcore.jsdelivr.net/gh/Olixn/china_list_for_smartdns@main/accelerated-domains.china.domain.smartdns.conf
0 0 3 * * ? wget -O /etc/smartdns/apple.china.domain.smartdns.conf https://gcore.jsdelivr.net/gh/Olixn/china_list_for_smartdns@main/apple.china.domain.smartdns.conf
0 0 3 * * ? wget -O /etc/smartdns/chinalist.domain.smartdns.conf https://gcore.jsdelivr.net/gh/Olixn/china_list_for_smartdns@main/chinalist.domain.smartdns.conf
0 0 3 * * ? wget -O /etc/smartdns/google.china.domain.smartdns.conf https://gcore.jsdelivr.net/gh/Olixn/china_list_for_smartdns@main/google.china.domain.smartdns.conf

旁路由可以用吗

除非不使用 IPv6,否则最好还是将 OpenWRT 路由器作为主路由。在作为旁路由的情况下,某些系统(说的就是你,Windows)会不遵守旁路由广播的 IPv4 DNS,而执意使用运营商光猫广播的 IPv6 DNS 进行解析,我尝试修改过一些相关的注册表键值,但毫无作用。无奈只好让运营商上门将光猫改为桥接模式,并将 OpenWRT 用作主路由。

覆写 Clash 规则

这时如果你开着 Clash 去跑 DNS 泄露测试,大概率还是会看到你的 DNS 请求被发到了中国的 DNS 服务器上——几乎所有机场的默认配置都会使用腾讯、阿里等国内大厂的加密 DNS,虽然不至于明文泄露到运营商 DNS 而导致你接到反诈中心的电话,但总让人膈应 (强迫症犯了),更有甚者甚至完全没有相关配置。

好在如果使用的是 Clash Verge Rev,那么可以很方便的覆写机场的配置,这里分享我的覆写配置,将其粘贴到全局扩展配置中即可覆写机场的配置。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
dns:
  enable: true
  ipv6: false
  prefer-h3: true
  use-system-hosts: true
  nameserver:
    - "https://dns.cloudflare.com/dns-query"
    - "https://dns.sb/dns-query"
    - "https://dns.google/dns-query"
    - "https://public.dns.iij.jp/dns-query"
    - "https://jp.tiar.app/dns-query"
    - "https://jp.tiarap.org/dns-query"
  nameserver-policy:
    "geosite:cn":
      - system
  fallback:
    - "tls://8.8.4.4"
    - "tls://1.1.1.1"
  proxy-server-nameserver:
    - "https://doh.pub/dns-query"
    - "https://223.5.5.5/dns-query"
  direct-nameserver:
    - system

如何修改全局扩展配置

配置解析

根据 Mihomo 文档4,其 DNS 请求的流程如下:

flowchart TD
  Start[客户端发起请求] --> rule[匹配规则]
  rule -->  Domain[匹配到基于域名的规则]
  rule --> IP[匹配到基于 IP 的规则]

  Domain --> |域名匹配到直连规则|DNS
  IP --> DNS[通过 Clash DNS 解析域名]


  Domain --> |域名匹配到代理规则|Remote[通过代理服务器解析域名并建立连接]

  Cache --> |Redir-host/FakeIP-Direct 未命中|NS[匹配 nameserver-policy 并查询 ]
  Cache --> |Cache 命中|Get
  Cache --> |FakeIP 未命中,代理域名|Remote

  NS --> |匹配成功| Get[将查询到的 IP 用于匹配 IP 规则]
  NS --> |没匹配到| NF[nameserver/fallback 并发查询]

  NF --> Get[查询得到 IP]
  Get --> |缓存 DNS 结果|Cache[(Cache)]
  Get --> S[通过 IP 直接/通过代理建立连接]

  DNS --> Redir-host/FakeIP
  Redir-host/FakeIP --> |查询 DNS 缓存|Cache

其中nameserver-policy的优先级高于nameserverfallback,指定geosite:cn中的网站以系统 DNS 查询,也就是使用之前配置好的 SmartDNS 查询,可以享受到局域网级别的响应速度和自带测速的 CDN 选择。而不在geosite:cn中的网站则使用nameserver/fallback查询,使用国外加密上游就可以确保解析结果的可信并防止 DNS 泄露。

替换 geoip 和 geosite 数据库

Mihomo 默认使用 V2Ray 官方的 geoip 和 geosite 数据库,这个数据库其实不太全,而且更新的频率也很慢,所以我还是用 Loyalsoldier/v2ray-rules-dat 这个「加强版」数据库替换了原来的数据库,只需下载geoip.datgeosite.dat以后丢进内核目录即可。当然,也可以新增几行覆写配置以实现自动/一键更新:

1
2
3
4
geodata-mode: true
geox-url:
  geoip: "https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geoip.dat"
  geosite: "https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geosite.dat"

Clash Meta For Android

对于手机上的 Clash Meta For Android(以下简称 Clash),覆写设置时需要更加考虑手机的实际情况。

首先手机上的 Clash 覆写设置选项就不如桌面端的 Clash Verge Rev 这么灵活,很多键值都不能覆写。另外,手机不像电脑,需要经常切换网络环境,这就导致系统 DNS 也会换得很频繁,经测试,在这种情况下,每次更换网络环境都需要开关一次 Clash 才能让其更新system所代表的 DNS。于是我们只能退而求其次,固定一个国内加密 DNS 作为国内查询。

进入 Clash ->「设置」->「覆写」以下是所有覆写设置:

  • 「DNS」->「策略」:强制启用
  • 「DNS」->「Prefer h3」:已启用
  • 「DNS」->「Name Server」:添加两个国外加密 DNS
  • 「DNS」->「Name Server 策略」:在「键」一栏中填写geosite:cn,值一栏填写https://doh.pub/dns-query

提前从 Github 上下载geoip.datgeosite.dat,最后进入 Clash ->「设置」->「Meta Features」,分别用「导入 GeoIP 数据库」和「导入 GeoSite 数据库」功能导入它们。

完成

最后再打开一个 DNS 泄露测试,看一看问题是否解决,如果不再出现国内的 DNS,说明配置正确,好好享受 SmartDNS 和 Clash 带来的网络优化和防泄漏吧~

DNS 不再泄露

Licensed under CC BY-NC-SA 4.0