SmartDNS 本地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本身没坏,但三种用法差别很大,同一套上游服务不了所有人。SmartDNS 架在局域网里,接管所有设备的查询,同时问多台上游服务器,测出哪个返回的 IP 访问最快就把哪个交回给设备;还可以按人指定“用哪套上游”。
把 SmartDNS 跑起来
4行命令装好 SmartDNS
仓库自带 Makefile,编译和安装一步到位,安装过程会同时放好二进制、示例配置和 systemd 单元文件。
git clone https://gitcode.com/GitHub_Trending/smar/smartdns cd smartdns make sudo make install装完配置文件在/etc/smartdns/smartdns.conf,服务名就是 smartdns,用 systemctl 管理即可。示例配置有两百行注释,大多是进阶选项,起步只需要几行。
最小配置长这样
在配置文件里只启用这几行,其余保持注释:
bind [::]:53 cache-size 32768 log-level info log-file /var/log/smartdns.log server 223.5.5.5 server-tls 1.1.1.1 server-https https://dns.google/dns-querybind [::]:53:双栈监听,家里 IPv4 和 IPv6 设备都能用,53 是 DNS 默认端口,客户端不用改端口。cache-size 32768:缓存三万条左右,全家最常访问的站点第二次起不再走上游。log-level加log-file:把常规日志落到磁盘,没有它,后面排错无据可查。- 三行
server是重点:一条境内明文、一条 DoT 加密、一条 DoH 加密,三条不同品质的上游。上游DNS可以理解为解析的“批发商”,备得越多越保险,SmartDNS 每次查询都会挑最快的那条返回。
怎么确认 SmartDNS 在工作
启动服务后,把查询直接指到本机:
dig www.example.com @127.0.0.1看到 SERVER 一行是 127.0.0.1#53,ANSWER 里给出正常 IP,就说明 SmartDNS 已经在响应了。再把路由器的局域网 DNS 指向这台机器的地址,全家就切过来了。
按家庭角色拆分上游DNS
不按“什么设备”分组,按“家里谁用”分组。设备只是载体,体验差别来自用的人。
先给谁配
优先配两组:写代码的和带娃的。前者最需要境外线路,后者最需要拦截,效果最明显。
每个角色怎么分
把一家人的规则集中放在配置末尾:
client-rules 192.168.1.10 -group coder client-rules 192.168.1.20 -group kids client-rules 192.168.1.30 -group gamer client-rules 192.168.1.50 -group tv group-begin coder server-tls 1.1.1.1 server-https https://dns.google/dns-query group-end group-begin kids address /bad-site.com/# group-end- 写代码的(192.168.1.10):常访问境外仓库和文档,也不想让查询记录被中间环节看到,DoT 加 DoH 两条加密上游互为备份。
- 带娃的(192.168.1.20):看的多是动画和课件,境内上游速度就够,重点是某些站点绝不能解析出来,
address那行直接拦掉。 - 打游戏的(192.168.1.30)和客厅电视(192.168.1.50)写法相同:gamer 组组内只放
server 119.29.29.29,图低延迟;tv 组组内只放server 223.5.5.5,图省心。
| 角色 | 上游策略 | 一句话理由 |
|---|---|---|
| 写代码的 | DoT + DoH 双加密 | 常访问境外站点,查询内容不该被中间环节看到 |
| 带娃的 | 境内上游 + 站点拦截 | 动画速度够用,拦得住比滤得准更重要 |
| 打游戏的 | 单条境内低延迟线路 | 团战体验靠响应时间说话 |
| 客厅电视 | 境内明文上游 | 看剧没有花活需求,可靠就行 |
匹配顺序怎么理解
规则是“先精确后模糊”:请求进来,先查源 IP 或 MAC 有没有命中 client-rules,命中就用那个组的策略;没命中,落到全局默认。上面四行写的都是固定 IP,设备换了新地址规则就会悄悄失效,这是最容易被忽略的点;改成写 MAC 就不会过期。
按需加料:四种家庭场景的条件菜单 🎛️
这部分是菜单,不是教程。每一条都是“如果你的家是这样的 → 可以这样配”,照单取用:
# 老设备 IPv6 支持差,强制降级回 IPv4 client-rules aa:bb:cc:dd:ee:ff -force-aaaa-soa # 加密上游,查询内容不再裸奔 server-tls 8.8.8.8 server-quic 223.5.5.5 # 双 WAN:两个网卡各接一套 bind :53@eth0 bind :53@eth1 # 按域名拦截特定站点 address /bad-site.com/#双栈环境怎么接:家里开了 IPv6,总有老设备“解析出 IPv6 但连不上”时,第一行让指定设备的 AAAA 查询固定返回空结果,等于强制它只走 IPv4,其他设备不受影响。
加密DNS上游怎么开:运营商劫持过广告页,或者你不想让人看见“你在问哪些站点”,用第二、三行。DNS 查询默认是明文,运营商和中间节点都能看到全部访问过的域名;加上之后查询被 TLS 包起来,知道内容的只剩上游。
两条宽带怎么分流:家里拉了两条宽带时,第四、五行把两个网卡各接一套 DNS,各网卡的设备只查各自线路的 DNS,再配两套上游,一条线断了不影响另一条。
怎么按域名拦站点:要拦特定网站(家长控制、广告源),第七行即可,该域名查询直接得到空记录,设备端表现为解析失败。
不想碰配置文件的话,编译时加make WITH_UI=1会带上 Web 仪表盘,默认监听 6080 端口,实时查询量、缓存命中、上游健康状态都能直接看到。
出了问题怎么办:三种最常见的情况
- 配置改了没反应。前台跑
sudo smartdns -f -c /etc/smartdns/smartdns.conf看屏幕输出:立刻退出并报语法错误,就是配置写错了,按提示改完systemctl restart smartdns;能持续运行说明配置没问题,去查服务是否真的重启过。 - 解析变慢或时好时坏。用
dig www.example.com @127.0.0.1 +time=2试探:超时没回包时,再翻日志里最近的报错——上游查询超时是公网或上游的问题,端口绑定失败则是别的程序占了 53。 - 某台设备体验就是不如别人。在日志里找它的请求记录,对照 client-rules:请求走的是默认组,说明规则没命中,多半是设备换了新 IP,把规则里的固定 IP 改成 MAC 即可。
定期体检:每两周跑一次systemctl status smartdns,顺手瞄一眼最近百行日志,半分钟的事。
配置都集中在一个文件里,改完重启就生效,不用动别的服务。建议的节奏:最小配置先跑一阵,发现哪个角色不对劲,再给它补一两条 client-rules,配置很快会收敛。下一步可以做的事:打开 Web 仪表盘,看看三条上游各自的命中率,把长期最慢的那条换掉。
【免费下载链接】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),仅供参考