SmartDNS快速上手:5分钟搭建一台会挑选最快IP的家庭DNS服务器
【免费下载链接】smartdnsA local DNS server to obtain the fastest website IP for the best Internet experience, support DoT, DoH, DoQ. 一个本地DNS服务器,获取最快的网站IP,获得最佳上网体验,支持DoH,DoT,DoQ。项目地址: https://gitcode.com/GitHub_Trending/smar/smartdns
SmartDNS 是一个可以直接放在家里跑的本地 DNS 服务器(DNS 可以理解为"网址翻译官",把 www.baidu.com 这类域名翻译成 IP 地址)。它的工作方式和普通转发不同:家里每台设备把查询丢给它,它同时问多个上游 DNS 服务器,测一遍每个返回 IP 的访问速度,再把最快的那个交还给你。项目同时支持 DoT、DoH、DoQ 这类加密查询协议,还能按设备分组、按域名屏蔽,实现家长控制和广告过滤。
这篇文章按"先跑通、再调优"的顺序带练:先花 5 分钟让服务跑起来,然后依次解决"上游怎么选、缓存怎么调、设备怎么分组、出问题怎么查"四个具体问题,最后附一张配置速查表收尾。
🚀 三步跑通 SmartDNS:克隆、编译、安装
先说结论:SmartDNS 是 C 语言写的,从源码到可用只需要三条命令。
git clone https://gitcode.com/GitHub_Trending/smar/smartdns cd smartdns make && sudo make installmake会编译出src/smartdns主程序;sudo make install则按 Makefile 的定义把二进制装到/usr/sbin,把默认配置写到/etc/smartdns/smartdns.conf,并注册 systemd 服务(见 systemd/smartdns.service.in),所以之后可以用systemctl管理。
安装后打开/etc/smartdns/smartdns.conf,默认其实已经启用了bind [::]:53(同时监听 IPv4 和 IPv6 的 53 端口)和log-level info。你唯一需要补的就是上游服务器,先加一行明文的:
# 配置一个普通 UDP 上游,兼容性最好,适合先验证链路 server 223.5.5.5然后启动并验证:
systemctl start smartdns nslookup www.example.com # 能返回 IP 说明链路已通如果第二条命令能查到地址,恭喜你,SmartDNS 已经在替你"代问"上游了。
🔍 上游服务器怎么配:明文与加密协议混着用
一个常见疑问:上游到底配几个、要不要加密?建议至少配一个明文 UDP + 一个加密的,这样即使某条链路被干扰,查询也不会整体失败——SmartDNS 对多个上游是并发查询的(相关实现在 src/dns_client/ 目录)。
# 明文 UDP 上游,走默认 53 端口 server 223.5.5.5 # DoT(DNS over TLS)加密上游,默认端口 853,隐私性更好 server-tls 1.1.1.1 # DoH(DNS over HTTPS)上游,走 443 端口,普通防火墙最容易放行 server-https https://dns.google/dns-query三种写法对应三种协议:server是标准 UDP/TCP 明文,server-tls是加密的 DoT,server-https是套在 HTTPS 里的 DoH。另外还支持server-quic(DoQ)和server-http3(DoH3),写法与上面类似。
上游返回的往往是一串 IP,SmartDNS 默认会对这些 IP 做速度检测,测速方式由这一行控制:
# 用 ICMP 回显 + 443 端口 TCP 两种方式测速,选出访问最快的 IP speed-check-mode ping,tcp:443下面的架构图展示了完整流程:本地设备 → SmartDNS → 多个上游并发查询 → 测速选最快 IP → 回包给设备。
⚡ DNS 响应提速:缓存与 TTL 三行配置
上游再快,每次都要问一次也嫌慢。缓存就是让 SmartDNS 记住"最近问过的答案",同一批设备短时间内的重复查询直接本地返回。
# 缓存最多 32768 条记录(-1 表示按内存自动算) cache-size 32768 # 上游卡顿时,允许先返回过期缓存,避免设备白屏等待 serve-expired yes # 把上游给的 TTL 钳制在 60 秒 ~ 1 天内,防止某条记录缓存一整天 rr-ttl-max 86400 rr-ttl-min 60这里容易踩的一个坑:cache-size的单位是缓存条数,不是内存大小。如果你的内存更紧张,另有cache-mem-size控制缓存占用的字节数,两者别混。
可以这样验证缓存是否生效:同一个域名连查两次,第一次慢(去问上游),第二次应该快得多(直接命中缓存)。
🎯 设备分组怎么配:client-rules 两行定规则
想让不同设备用不同策略?比如给孩子的平板屏蔽某些站点,让办公电脑走稳定的线路。SmartDNS 的做法是:用client-rules圈出"谁",再用group-begin/group-end圈出"对谁用什么规则"。
# 匹配 MAC 地址的儿童设备,划入 kids 组 client-rules aa:bb:cc:dd:ee:ff -group kids group-begin kids # # 表示对该域名直接返回 SOA 空应答,等价于屏蔽 address /adult.example.com/# # - 表示忽略本地规则,放行给上游正常解析 address /edu.example.com/- group-endclient-rules的匹配条件支持 IP 网段(如192.168.1.0/24)、MAC 地址和 IP 集合;address规则支持后缀匹配,写一个域名就能覆盖它的所有子域名(高性能匹配逻辑在 src/dns_conf/domain_rule.c),所以过滤几十条站点只需要几行。规则细节和所有可用选项,直接查配置文件里的注释即可:etc/smartdns/smartdns.conf。
🩺 如何保持稳定:查状态、看日志、热重载
服务跑起来之后,日常运维就三件事:看状态、看日志、改配置。
systemctl status smartdns # 看进程和最近日志 tail -f /var/log/smartdns.log # 实时跟踪日志 kill -HUP $(pidof smartdns) # 改完配置不用重启,发个 HUP 信号热加载最后一条是有源码依据的:src/smartdns.c里专门处理了SIGHUP信号用于重新加载配置,所以日常改配置不需要停服务。
想追查"到底谁在查什么域名",可以打开审计日志:
audit-enable yes audit-file /var/log/smartdns/audit.log如果编译时带了 Web 面板(make WITH_UI=1会额外构建 smartdns-ui 插件,配置里加plugin smartdns_ui.so与smartdns-ui.ip http://0.0.0.0:6080),就能在浏览器里直接看仪表盘:
几个新手高频坑,提前避开:53 端口被路由器自带 dnsmasq 占着(先停掉或改bind端口);上游一个都配错导致全站查不到(先用nslookup对比裸查结果);日志级别开到debug后日志暴涨(排查完记得调回info)。
📋 配置速查表:常用项一览
最后把前文出现过的配置项汇总成一张表,方便回头对照:
| 配置项 | 示例 | 一句话说明 |
|---|---|---|
bind | bind [::]:53 | 监听地址与端口,IPv4/IPv6 双栈 |
server | server 223.5.5.5 | 明文 UDP 上游,默认 53 端口 |
server-tls | server-tls 1.1.1.1 | DoT 加密上游,默认 853 端口 |
server-https | server-https https://dns.google/dns-query | DoH 上游,走 443 端口 |
speed-check-mode | speed-check-mode ping,tcp:443 | 测速方式,决定"最快 IP"怎么比 |
cache-size | cache-size 32768 | 缓存条数,-1自动 |
serve-expired | serve-expired yes | 上游慢时允许返回过期结果 |
rr-ttl-max/rr-ttl-min | rr-ttl-max 86400 | 钳制缓存时间上下限 |
client-rules | client-rules 192.168.1.0/24 -group home | 按 IP 段/MAC 圈定设备 |
group-begin/group-end | 见上节示例 | 定义一组设备专属规则 |
address | address /ads.example.com/# | 指定域名固定 IP、放行或屏蔽 |
dns64 | dns64 64:ff9b::/96 | 为纯 IPv4 网络提供 IPv6 地址映射 |
audit-enable | audit-enable yes | 打开查询审计日志 |
现在就可以动手了:先改一行server、用nslookup验证,再把速查表里感兴趣的项逐个加上。想看全部选项的官方注释,打开 默认配置文件 逐行读一遍就够;想深入原理,从 src/dns_server/ 和 src/dns_client/ 两个目录入手。
【免费下载链接】smartdnsA local DNS server to obtain the fastest website IP for the best Internet experience, support DoT, DoH, DoQ. 一个本地DNS服务器,获取最快的网站IP,获得最佳上网体验,支持DoH,DoT,DoQ。项目地址: https://gitcode.com/GitHub_Trending/smar/smartdns
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考