SmartDNS 配置教程:3 步跑通智能 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 服务器,并返回访问速度最快的 IP。如果域名经常解析到远端 CDN 节点导致首帧慢、线路绕远,这里用三步带你把 SmartDNS 配置跑通。
场景与痛点
- 视频站点一次返回 5 个 IP,运营商 DNS 只给到其中一个,恰好是几百公里外的节点,首屏等了 3 秒才出画面。
- 局域网里手机、电脑各连各的 DNS,想换一套上游得逐台改设置,改不动。
- 明文 UDP 查询在公网里一览无余,想换加密解析,结果内网把 853 端口封了。
这几种情况 SmartDNS 都能接住:它部署在本地(比如网关或一台常开机器),代理所有设备的查询,自动挑选最快、最稳的结果。
工作原理速览
SmartDNS 收到查询后不会等单一上游:同一个请求并发发给所有配置的上游,谁先返回就先用谁(response-mode fastest-response)。拿到完整 IP 列表后,再从本地网络用 ping 或 TCP 握手实测,挑出真正可达且最快的那个(speed-check-mode)。测速结果进入缓存,后续同样的查询直接返回,不再重复请求。这就是 SmartDNS 多上游解析的完整链路。
🚀 从零跑通:SmartDNS 配置教程之安装与最小配置
获取源码
git clone https://gitcode.com/GitHub_Trending/smar/smartdns cd smartdns编译与启动
make sudo make install sudo systemctl start smartdnsmake install会把二进制装到/usr/sbin/smartdns,把默认配置放到/etc/smartdns/smartdns.conf,并注册 systemd 服务,之后用 systemctl 管理即可。
最小可用配置
打开/etc/smartdns/smartdns.conf,保证这几行生效:
bind 127.0.0.1:53 server 223.5.5.5 server 119.29.29.29 speed-check-mode ping,tcp:443bind:监听地址,127.0.0.1:53表示只接受本机查询;给整网用就绑定网关 IP。server:上游 UDP DNS 服务器,可写多行,会并发查询。speed-check-mode:测速方式组合,先 TCP 443 握手再退回 ping。
保存后执行sudo systemctl restart smartdns,用dig @127.0.0.1 www.example.com验证即可。
SmartDNS 配置教程:逐项拆解常用字段
| 字段 | 作用 | 示例值 |
|---|---|---|
server | 上游 UDP DNS,多写几行即多上游并发 | 223.5.5.5 |
server-tls | DoT 加密上游,默认 853 端口 | 8.8.8.8 |
server-https | DoH 加密上游,走 HTTPS 443 | https://dns.google/dns-query |
cache-size | 缓存条目数,-1自动 | 32768 |
rr-ttl-min/rr-ttl-max | 缓存记录 TTL 的下限/上限 | 60/86400 |
response-mode | 应答策略,fastest-ip返回测速最快 IP | fastest-ip |
max-reply-ip-num | 返回给客户端的最大 IP 数 | 1 |
speed-check-mode | 测速方式组合 | ping,tcp:443 |
协议与安全:SmartDNS DoT 配置
DoT(DNS over TLS)在独立 TLS 连接上发查询,通常走 853 端口:
server-tls 8.8.8.8DoH(DNS over HTTPS)把查询包成普通 HTTPS 请求,复用 443 端口:
server-https https://dns.google/dns-query区别一句话:DoT 依赖 853 端口开放,DoH 复用既有 HTTPS 通道。公司内网若封了 853,不妨优先 DoH;追求更低开销则用 DoT。给加密上游配一个普通 UDPserver并加-bootstrap-dns,可避免加密上游无法引导解析时死循环。
SmartDNS 性能调优:4 个值得动的参数
cache-size:默认自动;家里设备多可设32768提高命中率,路由器内存紧张则调小。rr-ttl-max:给缓存寿命封顶;上游 CDN IP 变化频繁时别用86400这类大值,降到1800左右更及时。max-reply-ip-num:设1只返回最快 IP,适合视频这类单连接场景;需要多线路冗余时给 2~3。speed-check-mode:ICMP 被内网拦截时改用tcp:443或tcp-syn:443,否则测速全失败,选 IP 会退化。
🔍 排错手册
现象一:服务起不来或反复退出
systemctl status smartdns看失败原因。- 前台跑
sudo smartdns -f -x,配置解析错误会直接打在终端,多为拼写或未知关键字。 - 提示端口占用时,用
ss -ulnp | grep :53确认 dnsmasq 等是否占着 53,二选一:改 bind 端口或停掉另一个服务。
现象二:能启动但查询无结果
dig @127.0.0.1 www.example.com确认请求确实打到 SmartDNS。- 开
log-level info加log-file看日志,定位是哪家上游超时。 - 若只是 DoT/DoH 上游不通,临时加一条普通
server对比;确认是引导问题就给加密上游加-bootstrap-dns。
现象三:防火墙拦截 DNS 流量
- 放行出方向 UDP/TCP 53,这是基础端口。
- 用了 DoT 再放行出方向 853。
- 用了 DoH 放行出方向 443;走 QUIC/DoH3 时注意 NAT 网关的 UDP 会话超时设置。
进阶玩法
自定义域名集合:把一批域名放进文件,一行即可整组指定上游或固定 IP:
domain-set -name stream -type list -file /etc/smartdns/stream.list nameserver /domain-set:stream/查询审计:audit-enable yes一行开启,记录所有查询,排查"哪台设备在查什么"很方便。实现分别见 src/dns_conf/domain_set.c 与 src/dns_server/audit.c,想深入可以从这里入手。
项目还自带 Web UI 仪表盘,加载 smartdns-ui 插件后可查看查询统计:
效果参考
在典型家庭宽带上可以观察到:同一个域名的查询延迟与直接走公共 DNS 相差不大,但返回 IP 的实测 ping 通常明显更低。项目 README 中的示例里,查询www.baidu.com直接经阿里 DNS 拿到的 IP ping 约 24ms,SmartDNS 选出的 IP 是 5.9ms。提升幅度因运营商和位置而异,但规律一致:上游配置得越多,挑选空间越大。
延伸阅读
- 全部默认配置项及注释说明:etc/smartdns/smartdns.conf
- 上游查询与测速核心代码:src/dns_client/
- 测试用例(含多上游解析场景):test/cases/
把上游换成你所在地区的两个公共 DNS,重启服务,再用dig对比同一域名解析前后 IP 的 ping——五分钟后就能看到返回结果的变化。
【免费下载链接】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),仅供参考