周三下午,我的智能家居突然集体断网。排查后发现是树莓派上的DNS服务挂了——广告倒是屏蔽了,全家也上不了网了。这次事故让我决定:必须做一套真正高可用的DNS系统。
最终方案是三台AdGuard Home实例:本地主服务器、云端备用机、异地虚拟网络节点。任何一台宕机,其他两台都能无缝接管。
本地主力:Docker Compose一键部署
主服务器跑在家里的Homelab上。SSH登录后创建目录,写入docker-compose.yml:
核心配置就几行:53端口接管DNS查询,8080暴露Web管理界面,853端口留给DNS-over-TLS加密查询。数据卷挂载到本地目录,方便备份配置。networks字段接入之前搭好的npm_default网络,和Nginx Proxy Manager统一管理。
docker compose up -d启动后,浏览器访问3000端口走初始化向导。关键两步:管理界面监听所有接口、端口改80;DNS服务器同样监听所有接口,保持53端口不变。设好管理员账号,主DNS正式上线。
最后一步改路由器DHCP设置,把主DNS地址填进去。全家设备自动生效,无需逐个配置。
云端备用:Oracle Cloud的免费羊毛
出门后手机连蜂窝网络,本地DNS就鞭长莫及。需要一台公网备用机。
试过AWS和Linode的免费 tier,最终选了Oracle Cloud Infrastructure。OCI的"Always Free"确实大方:4核ARM处理器、24GB内存、200GB存储,带宽也给得足,7×24小时运行无压力。AWS免费 tier 12个月到期后续费警告烦人,Linode资源抠搜,OCI成了长期白嫖的最优解。
云端实例同样Docker部署,配置和本地几乎一致。区别只在防火墙规则:安全组放行53/UDP、53/TCP、853/TCP,再开个8080用于紧急管理。
第三节点:虚拟网络的本地冗余
双保险还不够。万一家里网络故障,云端延迟又高怎么办?
我在另一台虚拟机上起了第三个实例,跑在独立的VLAN里。这个节点不和主服务器同网段,物理故障隔离。三台DNS的IP分别写入路由器的主、备、第三DNS字段,客户端自动轮询。
实测故障切换:拔掉主服务器网线,ping测试丢包3个包内恢复。手机切飞行模式再打开,云端DNS 200ms内响应。三节点架构下,全年可用性理论上可达99.99%。
广告拦截规则用AdGuard的同步功能统一维护,改一处全局生效。现在无论在家、出门、甚至路由器抽风,我的设备始终有干净的DNS可用。
热门跟贴