家庭数据中心系列 从 dnsmasq 到 smartdns:打造一个靠谱的家庭 DNS 国内外查询分流系统

1 前言

之前,我写过一篇关于 dnscrypt-proxy 部署的文章(参见:dnscrypt-proxy(v2.1.8) 多场景配置指南:从上游部署到下游集成)。当时的架构是:利用Racknerd 的芝加哥 VPS 部署 dnscrypt-proxy,作为加密的 DNS 上游服务器(以DoH方式发布),而家庭数据中心的 AdGuard Home(因为AdGuard Home支持上游节点是DoH) 作为DNS 下游节点为内网设备服务 ,从而为家庭网络提供一个纯净、无污染、且支持加密传输的 DNS 服务。

不过,这种方案在实际使用中也存在一个局限:无法实现国内和国外 DNS 查询的分流解析。当然,这并不是因为 dnscrypt-proxy 本身不支持,而是它的分流机制更偏向于”基于服务器策略的转发”(例如通过不同的 server-names 配置),而不像 dnsmasq 或 smartdns 那样,能够简单的根据查询的域名是否为国内域(比如 geosite:cn)来智能选择上游服务器

因此,在日常使用中,这套架构更适合作为纯外部 DNS 出口使用,对于需要国内优先、智能分流的场景,就显得不够实用:很多国内网站根本不会响应来自国外地址的查询~。

目前,我的 DNS 查询分流主要依赖于 AC86U 路由器上 Merlin Clash 所提供的 DNS 劫持和规则分流功能。这种方式虽然部署简单、效果直观,但它也存在一个天然的隐患:过度依赖单一节点的稳定性。无论是 Merlin Clash 本身,还是所配置的科学上网服务提供商,一旦其中任何一方出现故障(例如科学节点失效、规则加载异常,或者遇到一些特殊时期的网络波动),整个 DNS 分流链条就会断裂,最直接的后果就是内网设备无法正确解析部分域名,甚至出现全面解析失败的情况。

这些问题我已经遇到过不止一次,因此也让我逐渐不敢将爱快主路由的上游 DNS 直接指向 AC86U 的 DNS 服务。毕竟一旦 AC86U 出现问题,整个网络环境就会受到牵连。

所以这次,我决定彻底解决这个问题:构建一个稳定、自主、不依赖 Merlin Clash 和 AdGuard Home 的,且同时具备”国内国外 DNS 查询智能分流”能力的本地 DNS 服务系统。它的核心目标包括:

  1. 高度稳定性:不再依赖路由器固件或第三方插件,即使科学上网服务失效,DNS分流服务依然可用;
  2. 智能分流能力:借助 geosite、china-list 等规则,实现对国内外域名的精准分流,国内域名走本地上游,国外域名走加密链路;
  3. 模块化组件设计:各部分职责清晰,例如 dnsmasq 专注分流和缓存,sing-box 或 dnscrypt-proxy 提供加密解析服务;
  4. 对主路由友好:让爱快可以放心地将 DNS 请求送到这套系统,而不会担心单点故障导致整个网络失能;
  5. 具备透明代理兼容性:未来若与 sing-box 的 tproxy 模式联动,还可以实现 DNS 与流量转发的深度融合。

这是一次从”靠插件勉强可用”,走向”模块清晰、稳定可靠”的彻底重构,目标是打造一套面向家庭数据中心场景的、真正值得信赖的 DNS 基础设施。

2 分流软件的选择

2.1 概述

要实现国内、国外 DNS 请求的分流,需要一个”基点”软件——它必须具备足够的策略灵活性,能够根据域名、IP 地址、甚至响应延迟等因素判断请求的归属,然后结合我们手头已有的国内和国外 DNS 上游服务器,将查询请求智能地转发到合适的目标。这类软件既充当 DNS 转发器,又扮演”DNS 路由调度器”的角色,是构建分流 DNS 系统的核心,常见的基点方案包括 dnsmasq 与 SmartDNS。

2.2 dnsmasq介绍:老牌稳健的 DNS 分流基础工具

在构建分流 DNS 的场景中,dnsmasq 是一款历史悠久、被广泛使用的轻量级 DNS 缓存与转发工具,许多嵌入式系统(例如 OpenWrt)都默认集成了它。尽管它设计得非常简洁,但只要通过适当的配置文件辅助,依然可以胜任按域名分流、缓存加速、屏蔽恶意域名等任务,是很多用户早期部署科学 DNS 分流时的”入门首选”。

2.2.1 优势

优势一:稳定、轻量、依赖广泛

dnsmasq 最大的特点就是”稳”——它体积小巧、资源占用极低,即使在低性能路由器或嵌入式设备上也能运行得非常流畅。在 OpenWrt、LEDE、Padavan 等定制固件中,它几乎是标配;在 Debian/Ubuntu 等主流 Linux 系统中也随处可见,配置与维护门槛低。

优势二:配套生态成熟,可依赖外部规则文件灵活扩展

尽管 dnsmasq 本身的策略能力相对有限,但配合社区维护的规则项目(如:https://github.com/felixonmars/dnsmasq-china-list)即可实现按域名的基本分流。这类规则项目通常会提供:

  • accelerated-domains.china.conf:将国内域名通过国内上游解析;
  • google.china.conf / apple.china.conf:精细化处理特定厂商域名;
  • bogus-nxdomain.conf:屏蔽运营商返回的假 IP;
  • ipset.conf:结合防火墙规则,实现出口 NAT 分流。

通过这些 .conf 文件,dnsmasq 能够完成大部分”根据域名归属决定 DNS 上游”的任务。

优势三:兼容性极好,适配各种主流场景

dnsmasq 支持 DNS 缓存、PXE 启动、DHCP 服务等功能,适合部署在内网网关设备中,既可以提供通用的本地 DNS 功能,又可以作为科学网络策略的辅助组件。在一些对系统依赖和兼容性要求较高的场景中,dnsmasq 是一个稳妥的选择。

2.2.2 劣势

劣势一:策略表达能力有限,分流依赖规则文件拼凑

dnsmasq 自身并不具备”按线路优选”、”上游测速”、”fallback 切换”等能力,它的分流完全依赖人工维护的规则文件,且不能动态调整。当你遇到境外域名 CDN 分布变化、国内域名被污染等问题时,dnsmasq 无法根据实际网络情况做出智能调整。

劣势二:缺乏原生 DoH/DoT 支持,需要借助外部转发器

dnsmasq 不支持直接连接 DoH(DNS over HTTPS)或 DoT(DNS over TLS)上游服务器,要使用这些协议,需要搭配 dnscrypt-proxy、smartdns、adguard home或 https-dns-proxy 等额外组件作为前置转发层,这增加了部署和调试的复杂度。

劣势三:对现代 DNS 架构不够友好,配置冗长且不够灵活

在配置大量分流规则时,dnsmasq 需要手动引入多个 .conf 文件,规则之间难以组织和组合;同时,它不支持像标签(tag)、组(group)那样的上游分组机制,也无法实现如”返回多个上游结果后自动选择最快”的行为。这让它在复杂网络环境下显得有些力不从心。

2.2.3 小结

作为一款经典的 DNS 工具,dnsmasq 以其稳定、轻量和广泛的社区支持,成为了家庭网络 DNS 分流的”老兵”。它适合资源受限的设备,以及对 DNS 架构有清晰预设、愿意手动维护规则文件的用户。但在面向现代网络需求时,它的扩展性和智能化能力逐渐暴露出瓶颈。因此,在某些更复杂的应用场景中,可能需要考虑引入更现代的工具,例如下一节将介绍的 SmartDNS。

2.3 SmartDNS 简介:功能强大的新一代 DNS 分流器

相较于 dnsmasq,SmartDNS 是近年来兴起的一款现代 DNS 分流解决方案,它在”智能选择最快上游”、”延迟测速排序”、”多协议支持(包括 DoH、DoT)”等方面具备天然优势。尽管最初只是为”加速”而生,但在不断的社区推动下,SmartDNS 已逐步演进为功能完善的分流 DNS 中枢,尤其适合对速度、策略和灵活性有较高要求的用户。

2.3.1 优势

优势一:原生支持 DoH / DoT,上游测速优选能力强

SmartDNS 支持通过 server-tls、server-https 等参数接入 DoH/DoT 上游,无需额外组件即可完成加密解析请求。同时,SmartDNS 会对所有上游定期测速,根据响应延迟排序,优先使用最快的服务器,有效提升国内外访问速度。

这也使得它非常适合用于公网出口较复杂、带宽变化频繁的环境,例如家庭多 WAN、旁路由、境外中转等场景。

优势二:灵活的策略分组与筛选机制,支持复杂分流逻辑

SmartDNS 支持为上游服务器打标签(tag),并通过规则进行有条件地筛选,比如:

server-tls 1.1.1.1 -group foreign -exclude-default-group
server 223.5.5.5 -group domestic
server 127.0.0.1:5335 -group custom

# 分流规则
server-rule domain-suffix cn domestic
server-rule domain full netflix.com foreign

这意味着你可以根据 TLD(顶级域名)、域名关键字、客户端 IP 段等条件,灵活地将不同请求路由到不同上游,并且分组、规则之间可以组合使用,完全支持”多出口 DNS 分流”或”定向解析”需求。

优势三:支持缓存加速、并发查询、DNS 答案过滤等高级特性

SmartDNS 默认支持并发查询(向多个上游同时发起请求,只采用最快响应),支持 TTL 控制、缓存投毒防护、过滤无效 IP 地址(如 0.0.0.0、运营商劫持 IP)、拦截指定域名等功能,极大提升了 DNS 系统的安全性和响应速度。

此外,它还可以监听多个端口,作为 DoH/DoT 服务端,允许其他设备通过加密协议请求它,适合搭建本地私有 DNS 服务。

2.3.2 劣势

劣势一:资源占用稍高,对内存敏感设备不太友好

SmartDNS 启动时会缓存上游配置、测速数据与规则列表,在多个并发请求与延迟分析的过程中,相比 dnsmasq 会占用更多内存与 CPU,对极低配置的小设备(如 64MB 路由器)并不友好。不过,对于具备 128MB+ 内存或运行于 LXC/PVE 虚拟机中的设备,这种占用是完全可以接受的。

劣势二:配置语法复杂度略高,上手有一定门槛

虽然 SmartDNS 的功能很强,但其配置语法不够直观,对初学者来说可能稍显繁琐。尤其是涉及分组、标签、多规则结合时,需要用户仔细理解其解析逻辑,稍有配置不当就可能导致请求全部 fallback 或命中默认组。

此外,SmartDNS 并不直接提供 ipset 功能(即将域名解析后的 IP 放入指定 ipset),这意味着如果你需要基于 IP 分流流量,还得依赖前置工具如 dnsmasq 负责生成 ipset 或用 nftables set 替代。

劣势三:缺少成熟规则生态,部分分流策略需自行整理

与 dnsmasq 社区已有大量 .conf 文件不同,SmartDNS 的规则体系更多是用户自定义,虽然它兼容一些基础的 geosite.dat/domain-list 文件,但官方未直接维护类似 felixonmars 这样的分流规则仓库。因此部署者往往需要结合 GFWList、CNList、GeoIP 等自行整理规则文件,更适合有一定动手能力的用户。

2.3.3 小结

SmartDNS 是一款定位现代、功能强大的 DNS 分流工具,尤其在 DoH/DoT 支持、多上游测速优选、灵活策略调度等方面展现出压倒性优势。对于追求高性能、复杂 DNS 策略的场景,它是极具竞争力的选择。但与此同时,它也对设备性能和配置水平提出了更高要求,更适合运行在资源较充裕的服务器、LXC 容器或旁路由上。

与 dnsmasq 相比,SmartDNS 是面向”未来”的 DNS 工具,它所带来的复杂度和灵活性,正是现代家庭网络、高性能旁路由架构所亟需的。

3 “基点”软件部署与配置

3.1 dnsmasq

3.1.1 dnsmasq的DNS 请求处理逻辑(实用简明版)

对大多数用户而言,dnsmasq 的实际处理流程可以简单理解为三步:

第一步:先查 hosts文件

dnsmasq 会优先查找静态解析规则,默认读取 /etc/hosts文件的内容。

作用: 适合用来绑定某些特定域名(比如广告屏蔽、局域网服务):

192.168.10.100 nas.local
0.0.0.0 ads.example.com

第二步:看”/etc/dnsmasq.d/*.conf“是否匹配分流规则

这是最核心的分流机制,文件中类似如下的内容:

server=/baidu.com/114.114.114.114
server=/bilibili.com/114.114.114.114
server=/google.com/8.8.8.8
server=/github.com/8.8.8.8

或使用顶级域名规则:

server=/cn/114.114.114.114

这些规则告诉 dnsmasq:对于特定的域名请求,把它们发给指定的上游 DNS


对于一般的分流需求而言,”/etc/dnsmasq.d/“目录下有2个conf就足够了,dnsmasq-china-list项目中的:accelerated-domains.china.confapple.china.conf,大家自行下载即可,也可以做个定时脚本定期下载更新这2个文件,不过一般没啥必要,这2个更新那么频繁意义不大。


第三步:兜底用默认上游 DNS(一般是国外)

如果某个域名既不在 hosts 文件里,也不命中任何”/etc/dnsmasq.d/*.conf“中的规则,就会交给”dnsmasq.conf”配置文件中使用”server=”字段指定的上游DNS服务器:

server=1.1.1.1
server=8.8.8.8

作用: 用于解析所有没特别指定的域名,通常是国外 DNS。

总结:

dnsmasq 实际处理 DNS 请求的顺序是:

  1. 先查 hosts 文件(默认 /etc/hosts 或自定义 addn-hosts)
  2. 再查 “/etc/dnsmasq.d/*.conf” 是否有指定分流规则
  3. 最后,没命中的请求走”dnsmasq.conf”配置文件中”server=”语句指定的上游解析

注:dnsmasq 2.89及之后的版本,不再推荐使用 “resolv-file=/etc/dnsmasq.upstream.conf” 这种方式指定上游 DNS,而是建议直接在dnsmasq.conf配置文件中使用更具可控性的 server= 方式来配置全局或分流 DNS,尤其适合对国内/国外 DNS 查询分流有需求的用户。

3.1.2 安装dnsmasq

3.1.2.1 源码安装

如果是debian或者ubuntu下,直接使用apt命令安装即可:

apt-get install -y dnsmasq

目前apt安装的版本是2.90,而官方最新版是2.91,差不多,没必要一定要最新版:

image.png

至于其他平台,安装方法类似,我这里就不多说了,偷点懒。

3.1.2.2 docker方式安装

docker run格式安装:

docker run --name=dnsmasq -d --restart=always \
-p 1053:53/udp \
-p 1053:53/tcp \
-v /docker/dnsmasq/dnsmasq.conf:/etc/dnsmasq.conf:ro \
-v /docker/dnsmasq/dnsmasq.d:/etc/dnsmasq.d:ro \
-e "DNS1=8.8.8.8" -e "DNS2=1.1.1.1" \
--cap-add=NET_ADMIN \
dockurr/dnsmasq

注1:使用docker方式部署dnsmasq,后续在配置”dnsmasq.conf”时,其中的”listen-address=”后面就不能填写宿主机上的地址,因为docker又看不到宿主机的IP,所以可以填写127.0.0.1,或者干脆注释或者删除”listen-address=”这一行,那么默认就是监听所有地址。

注2:DNS1和DNS2相当于直接指定了国外上游DNS服务器IP,可以不用在”dnsmasq.conf”配置文件中用”server=”的方式指定了。

3.1.3 配置分流规则

mkdir -p /etc/dnsmasq.d/
cd /etc/dnsmasq.d/
wget https://github.com/felixonmars/dnsmasq-china-list/blob/master/accelerated-domains.china.conf
wget https://github.com/felixonmars/dnsmasq-china-list/blob/master/apple.china.conf

3.1.4 创建dnsmasq.conf配置文件

对于 dnsmasq 而言,配置文件 /etc/dnsmasq.conf 的内容决定了整个服务的核心行为和运行方式:它不仅控制了监听地址、缓存大小、日志输出、是否启用 DHCP、是否读取 /etc/hosts 文件等基础设置,还定义了是否启用分流、是否屏蔽 IPv6、是否读取额外配置目录(如 /etc/dnsmasq.d/)等高级选项。

此外,dnsmasq 允许通过 conf-dir= 或 conf-file= 指令加载额外的配置文件,使其具备极高的灵活性和可维护性。例如,我们通常会将各类 server= 分流规则、地址重定向、广告屏蔽规则等拆分成多个配置文件,集中放在 /etc/dnsmasq.d/ 目录下,便于分模块管理。

可以说,/etc/dnsmasq.conf 是 dnsmasq 行为的”总控台”,而其包含的或引入的配置则共同组成了 dnsmasq 的”工作大脑”。一套科学、合理的配置,能够让 dnsmasq 成为高效、稳定、可分流的家庭 DNS 服务核心组件。

以下是我在用的dnsmasq的dnsmasq.conf配置文件内容,供大家参考:

# 监听本地回环接口和主网卡 eth0(确保 DNS 请求能被容器或主机访问到)
interface=lo
interface=eth0

# 设置监听的端口为 53(DNS 默认端口)
port=53

# 启用所有上游 DNS 查询同时发出,谁先返回就用谁的结果,提升响应速度
all-servers

# 指定上游 DNS 服务器(支持分流或兜底)
server=1.1.1.1         # Cloudflare 公共 DNS(国外)
server=8.8.8.8         # Google 公共 DNS(国外)

# 设置 DNS 缓存容量,单位为条(可根据内存适当调大)
cache-size=1000

# 不读取 /etc/hosts(通常是防止意外污染或使用统一 hosts 文件)
no-hosts

# 指定额外的 hosts 文件路径,用于本地解析定制
addn-hosts=/etc/dnsmasq.hosts

# 忽略系统默认的 /etc/resolv.conf(避免干扰上游配置)
no-resolv

# 加载 /etc/dnsmasq.d/ 目录下所有 .conf 文件(常用于域名分流配置)
conf-dir=/etc/dnsmasq.d

# 最大并发转发查询数(防止高并发时丢包或延迟)
dns-forward-max=150

# 开启兼容 Windows 的行为,过滤无效 IPv6 请求(如 WPAD 相关)
filterwin2k

# (可选)禁用 IPv6 解析
#no-ipv6

# 启用查询日志(调试或分析用,线上长期开启建议配合 logrotate)
log-queries
log-facility=/var/log/dnsmasq.log

# 不启用 DHCP 功能(dnsmasq 默认支持 DHCP,这里关闭以避免冲突)
no-dhcp-interface=eth0

创建dnsmasq.conf配置文件:

vim /etc/dnsmasq.conf

将上面的配置示范粘贴进去并保存,随后重启dnsmasq的service即可:

systemctl restart dnsmasq.service

如果不想使用默认的配置文件路径及配置文件名称,需要自行用”–conf-file”参数自定义,比如想使用”/opt/my.conf”作为dnsmasq的配置文件,需要先将”/lib/systemd/system/dnsmasq.service”(apt方式安装dnsmasq时,dnsmasq.service文件的默认路径)拷贝到”/etc/systemd/system”路径下并进行编辑:

cp /lib/systemd/system/dnsmasq.service /etc/systemd/system/dnsmasq.service
vim /etc/systemd/system/dnsmasq.service

将其中的”ExecStart”字段改成:

ExecStart=/usr/sbin/dnsmasq -x /run/dnsmasq/dnsmasq.pid -u dnsmasq --conf-file=/opt/my.conf

然后重启service即可:

systemctl daemon-reexec
systemctl daemon-reload
systemctl restart dnsmasq.service

其实也可以用官方推荐的”systemctl edit”方式直接覆盖”/lib/systemd/system/dnsmasq.service”中的ExecStart字段,这会在”/etc/systemd/system/dnsmasq.service.d/”目录中生成一个覆盖文件”override.conf”,里面只包含对ExecStart字段的覆盖。但是我不喜欢这样的方式,感觉东一块西一块的,所以干脆直接cp到”/etc/systemd/system/dnsmasq.service”直接修改了,等价于命令”systemctl edit –full dnsmasq.service”。


3.2 smartdns

3.2.1 安装smartdns

3.2.1.1 源码安装

由于apt里提供的smartdns的版本太老,才40:

image.png

而目前github上官方页面最新releash版本是46.1,相差实在是太大:
image.png

所以安装就不使用apt了,而是直接下载github上最新的版本使用。

1、下载对应环境的安装包

我因为是debian 12,所以下载:

image.png

cd ~
wget https://github.com/pymumu/smartdns/releases/download/Release46.1/smartdns.1.2025.03.02-1533.x86_64-linux-all.tar.gz

2、解压缩

tar zxf smartdns.1.2025.03.02-1533.x86_64-linux-all.tar.gz

3、执行安装脚本

cd smartdns
chmod +x install
./install -i

安装完成:

image.png

上图中显示了SmartDNS 官方发布包中自解压式安装脚本(./install -i)的执行内容:主要完成”复制二进制 + 注册服务”的过程。

3.2.1.2 docker方式安装

1、创建目录

mkdir -p /etc/smartdns

2、docker run格式命令创建容器

docker run -d --name smartdns --restart=always -p 53:53/udp -v /etc/smartdns:/etc/smartdns pymumu/smartdns:latest

3.2.2 geosite文件的获取

geosite文件主要来源于github上的项目:Loyalsoldier/v2ray-rules-dat,里面提供了不少的选择:

image.png


具体选择哪些要看大家的分流要求和场景,对于我而言需求很简单:”指定的域名”走国内DNS,其他的都走国外DNS,简单粗暴,也实用。而”指定的域名”则由上图中的direct-list.txt和apple-cn.txt组成,其实和之前我在dnsmasq配置中的”/etc/dnsmasq.d/”路径下的2个conf文件是一致的:
accelerated-domains.china.conf和apple.china.conf。


将”direct-list.txt”和”apple-cn.txt”的内容都合并到文件”/etc/smartdns/china.conf”:

curl "https://raw.githubusercontent.com/Loyalsoldier/v2ray-rules-dat/release/direct-list.txt" >> /etc/smartdns/china.conf
curl "https://raw.githubusercontent.com/Loyalsoldier/v2ray-rules-dat/release/apple-cn.txt" >> /etc/smartdns/china.conf

格式转换为 SmartDNS 可识别的 rules,去除”full:”,指定这些域名为cn组:

sed "s/^full://g;/^regexp:.*/d;s/^/nameserver \//g;s//\/cn/g" -i /etc/smartdns/china.conf

3.2.3 创建配置文件smartdns.conf

创建配置文件:

vim /etc/smartdns/smartdns.conf

将以下内容粘贴进去并保存:

# 禁用 IPv6
force-AAAA-SOA yes
disable-ipv6 yes

# 监听本地 53 端口
bind :53

# 缓存大小与性能设置
cache-size 2048
dualstack-ip-selection no
prefetch-domain yes
speed-check-mode ping

# 包括定制国内域名规则 (direct-list + apple-cn)
conf-file /etc/smartdns/china.conf

# 国内 DNS,标准 UDP
server 119.29.29.29 -group cn
server 114.114.114.114 -group cn

# 境外 DNS,标准 UDP + DoH
server 1.1.1.1 -group foreign
server 8.8.8.8 -group foreign

# 启用并发解析,使用最快响应
server-policy fastest-response

# 默认策略为:根据域名规则使用分组
nameserver-policy /cn/ cn
nameserver-policy /china/ cn
# 其他走 foreign(注意:如果没有匹配到 cn 则默认用 foreign)

在配置文件smartdns.conf中指定上游DNS的时候,SmartDNS提供了多种查询方式,目前支持的有,UDP、TCP、DOT、DOH、DOQ、DOH3,这些查询协议在性能,安全性上各有优缺点,可按需配置使用, 下表是几个协议的说明:

image.png


重启smartdns的service:

systemctl restart smartdns

注:本节的内容是将smartdns作为下游DNS客户端,而smartdns也支持作为上游DNS服务端,和dnscrypt-proxy比起来,除了不支持dnscrypt之外,其他功能都没问题,大家可以按需选择。

3.2.4 定时更新china.conf

mkdir /root/script
vim /root/script/update-smartdns-china.sh

将以下内容粘贴进去并保存:

#!/bin/bash

# 更新 SmartDNS 的国内域名列表
TMP_FILE="/tmp/smartdns-china.conf.new"
> "TMP_FILE"

# 下载最新规则
curl -sSL "https://raw.githubusercontent.com/Loyalsoldier/v2ray-rules-dat/release/direct-list.txt" >> "TMP_FILE"
curl -sSL "https://raw.githubusercontent.com/Loyalsoldier/v2ray-rules-dat/release/apple-cn.txt" >> "TMP_FILE"

# 转换为 SmartDNS 可识别格式
sed -i 's/^full://g;/^regexp:.*/d;s/^/nameserver \//g;s//\/cn/g' "TMP_FILE"

# 覆盖原 china.conf
mv "$TMP_FILE" /etc/smartdns/china.conf

# 重启 SmartDNS 服务
systemctl restart smartdns

赋予执行权限:

chmod +x /root/script/update-smartdns-china.sh

然后通过 crontab -e 添加自动任务,比如每天凌晨 3 点更新:

0 3 * * * /root/script/update-smartdns-china.sh

4 总结

其实对于绝大部分个人家庭网络的国内外 DNS 分流需求而言,常规的分流逻辑 —— “指定的国内域名查询走国内 DNS 服务器,其他都走国外 DNS” —— 已经足够了。从”实现分流”这个角度来说,无论是 dnsmasq 还是 smartdns,都可以胜任,尤其在搭配规则文件(如 direct-list.txt 和 apple-cn.txt)使用时,配置也非常清晰直接。

但文章前面也提到过smartdns 相比 dnsmasq 有一个很显著的优势:它对上游 DNS 服务器类型的支持更加丰富灵活:除了标准的 UDP 53 查询,它还原生支持 DoT(DNS over TLS)、DoH(DNS over HTTPS)等加密协议,可以更方便地接入 Cloudflare、Google、NextDNS、甚至自建的DOH服务器等现代 DNS 服务,提升隐私性与抗干扰能力。

更重要的是,smartdns 还支持并发向多个上游发送请求,并自动选取响应最快的结果返回,在网络质量波动时能显著提升 DNS 解析体验(dnsmasq本质上是串行查询)。此外,它内置了缓存、预取、测速、域名自动测速优选等一系列增强功能,让它在实际使用中不仅”能分流”,还”跑得快、查得准、抗干扰”。

最终的结论:smartdns在实现国内外分流功能时,更胜dnsmasq一筹。

之所以要强调分流软件支持的上游 DNS 服务器类型,是因为这将直接影响境外 DNS 查询的灵活性与容错性:如果分流软件仅支持传统的 UDP 53 查询方式,那么能用的上游 DNS 服务器就非常有限,往往只能依赖如 1.1.1.1、8.8.8.8 等公共 DNS 服务。这种方案虽然简单,但在实际使用中容易遇到两个问题:一是这些公共 DNS 服务本身容易被干扰,二是当家庭科学上网环境发生波动或中断时,境外 DNS 查询可能也会一并失效。

而如果分流软件支持 DoH(DNS over HTTPS)、DoT(DNS over TLS)等加密 DNS 协议,就可以把这类协议作为补充或兜底的 DNS 查询通道。更进一步,可以搭配在家庭网络内部部署的,直接使用宽带国内出口的下游DNS 客户端,通过 Cloudflare中转、Tailscale 、甚至公网IP等访问远端境外VPS 上自建的 DoH,DoT加密DNS服务,实现即便科学服务出故障,也仍能通过宽带原生路径访问自建的境外 DoH 服务,从而保障境外域名解析能力不受影响。

这种设计下,境外 DNS 查询方式拥有了多种通路的冗余结构:

  • 科学服务通道 → 使用标准公共 DNS,如 1.1.1.1、8.8.8.8,延迟低,速度快,是优先选择。
  • 非科学通道 + 自建 DoH/DoT → 使用家庭宽带原生出口配合 境外VPS 上部署的加密 DNS 服务,在科学服务失效时继续保障境外域名解析。

如下图:

image.png

由于 smartdns 支持并发查询并自动选取最快响应的机制,即便配置了多个上游 DNS,只要科学服务通道正常,那么基于科学服务通道的DNS通路响应更快,它就会优先使用,无需人为干预,最大程度兼顾性能可用性;而当科学服务通道出现问题时,非科学通道的响应就会作为国外查询的兜底。也正因此,具备现代协议支持能力的 DNS 分流软件,不仅是”能分流”,更是”能兜底”,在不稳定网络环境下显得尤为重要,而要实现这个效果,仅仅是配置文件中境外上游DNS服务器同时填写不同通道下境外DNS服务的地址即可,以smartdns配置文件为例:

image.png

从这个角度来说,dnsmasq就差了一筹(因为不直接支持DoT/DoH),如果我要使用dnsmasq实现相同的容错性,还需要搭配之前部署的Adguard home来实现(Adgurad home支持DoH、DoT等加密协议),就多了一个功能节点。

注1、写完文章才看到还有一个Mosdns,比smartdns更复杂,支持的功能也更多,大概瞟了一眼,多支持的那些功能我也用不上,算了,懒得折腾了,家庭内网环境下smartdns已经足够了。

注2、为了写这篇文章,又折腾了dnsmasq,又搞了smartdns,如果不都用起来感觉亏了,所以最终在爱快上DHCP服务端这样设置:

image.png

这样所有内网设备的dns服务器地址都是以smartdns为首选、dnsmasq为备选,这下除非部署smartdns和dnsmasq的lxc都死了,否则内网DNS请求的国内外分流效果就稳如老狗~。

分享这篇文章
博客内容均系原创,转载请注明出处!更多博客文章,可以移步至网站地图了解。博客的RSS地址为:https://blog.tangwudi.com/feed,欢迎订阅;如有需要,可以加入Telegram群一起讨论问题。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇
       
zh_CN