Blog

用 AdGuard Home 接管全家 DNS

十一月某晚,厨房里传来一句「微信小程序怎么一直转圈」。我还在看 Grafana 的 DNS 查询曲线,心想:大概又是过滤列表把某个统计域名拦了。自建全屋 DNS 的真实难度,从来不只在 YAML 和上游选择——更多时候是人和网络策略能不能长期共处。

先和家里说清楚:拦什么、不拦什么

我把规则讲得很直白。默认拦广告、跟踪、恶意域名,不拦正常业务、不拦银行和支付。出了问题有两个出口:手机临时切到「绕过过滤」的配置文件,或者微信里喊一声我去查 Query Log。不接受「全家解析挂了还没人知道」这种静默故障,也不接受「每次都要我 SSH 进机房」这种随时待命。

查询日志保留周期故意设短,只为排障,不搞长期画像。管理面板只走内网或 VPN,公网不暴露。这两条比任何「隐私声明」都管用:家人知道你在看什么级别的日志,反而更愿意配合。

DNS 该放在哪一台

我最终放在软路由旁的 LXC 里,固定地址 192.168.1.53,不跟主路由抢 CPU,也不跟 NAS 的媒体任务抢磁盘。有人把 AdGuard 直接装在 OpenWrt 上,省一台机器,但路由升级、刷机、插件冲突时 DNS 一起瘫——对全家来说代价太大。另有人跑在 NAS Docker 里,NAS 重启或存储池 scrub 时解析抖动,体感很差。

结论偏保守:DNS 是网络的目录服务,尽量独立、轻、好重启。容器或 LXC 即可,2 核 1G 内存对家庭绰绰有余。主路由 DHCP 的 DNS 选项只填 AdGuard 这一条。有人劝「再写一个运营商 DNS 做备份」,拦截率会立刻被旁路;设备会随机问第二个解析器,广告域名时灵时不灵,排障更痛苦。我选择单点 + 监控:进程守护、磁盘别满、53 端口存活告警,配置定期导出。

上游怎么选,和列表怎么叠

上游用国内可信任的 DoH / DoT,延迟稳定优先于「看起来很酷的全球 Anycast」。DNSSEC 能否开启取决于上游是否完整支持;上游不稳时强开只会制造随机失败。递归解析和过滤列表要分清职责:上游负责把名字变成地址,列表负责说「这个名字不该被回答」。

列表策略是少而精。基础广告列表加一份恶意域名列表就够。每多加一份,误杀面就扩大一圈,而「App 打不开」的投诉成本远高于多拦几个横幅。我的节奏是:加列表 → 观察一周 Query Log 和家人反馈 → 再决定下一批。遇到误杀,优先加白名单域名,而不是整表删除;白名单也记进笔记,避免半年后忘了为什么放行。

硬设备和写死 DNS 的家伙

手机、笔记本走 DHCP,最省心。难的是智能电视、部分 IoT、个别游戏主机——出厂写死 8.8.8.8 或厂商 DNS。可选两条路:防火墙上把去往 53 的流量 DNAT 到 AdGuard,或者单独 VLAN 对它们放行公网 DNS。劫持要谨慎,先在测试 VLAN 验证,确认不会把访客网和打印机一起搞疯。部分设备还走 DoH 绕过本地 53,那就只能在防火墙层拦已知 DoH 端点,或者接受「这块屏拦不住」。

硬件上我没上专用小盒子,LXC 已经够。若你家软路由很弱、同时又想跑重过滤,可以考虑一台常开的低功耗小主机专做 DNS 与 NTP,地址写死,标签贴清楚,别和娱乐机混用。

投诉来了怎么处理

标准流程:看 AdGuard 查询日志里该设备最近的被拒域名 → 判断是广告 SDK 还是业务域名 → 业务就加白并记原因,广告就解释「那是统计或跳转」。统计面板能帮你把话说圆:不是我手贱拦了你的 App,是规则命中了某某列表里的项。临时关闭某个客户端的过滤,比全局关停更安全;全局关停容易忘记再开。

AdGuard 挂了全家解析可能一起瘫,这是单点的代价。进程守护、配置导出、监控告警是底线。有条件再上双实例,DHCP 下发主备两个 DNS;条件不够就保证「挂了能五分钟内起来」。配置导出我放进定期备份任务,恢复时能在半小时内在另一台 LXC 拉起同地址或改 DHCP 指向,这比空谈高可用实际。

和家里人磨合两个月后,投诉从「又是你搞的」变成「帮我看下这个域名该不该放」。DNS 掌握在自己手里之后,很多恶心跳转会安静下来——前提是你也愿意把规则聊明白,并把临时出口留好。技术选型可以一周定完,家庭共识往往要更久;两件事都做完,全屋 DNS 才算真正落地。

← Back to Blog