自建 DNS 与 hosts 去广告
不是所有家庭都需要 AdGuard Home 那么重的方案。设备老旧、闪存紧张,或者只想要干净快速的解析、过滤需求并不复杂,这时候基于 dnsmasq 和 hosts 列表的轻量方案反而更合适。本篇把 dnsmasq 的解析机制、hosts 去广告的搭法和自建 DNS 的完整思路讲清楚。
dnsmasq 的角色
dnsmasq 是 OpenWrt 默认的 DNS 和 DHCP 服务,一个进程身兼两职:给内网设备分配 IP 地址,同时提供 DNS 解析。理解它的工作流程是本篇的基础:客户端发起查询 → dnsmasq 先查自己的 hosts 表和缓存 → 有记录直接返回,没有就向上游转发 → 上游返回后写入缓存再给客户端。hosts 去广告就是在第一个环节插手——把广告域名的解析结果直接固定成空地址,请求根本不会出路由器。
dnsmasq 的配置入口在 Network → DHCP and DNS,对应 /etc/config/dhcp 文件。和去广告相关的关键能力有三个:读 /etc/hosts 目录下的自定义记录、把额外 hosts 文件挂进来解析、以及上游转发。这三个能力都不需要额外装任何软件,装好 OpenWrt 就有。
| 配置项 | 所在位置 | 作用 |
|---|---|---|
| hosts | /etc/hosts | 系统级静态解析 |
| addnhosts | dhcp 段 | 追加额外 hosts 文件 |
| servers | dhcp 段 | 指定上游 DNS |
| domain | lan 段 | 内网域名后缀 |
| cachesize | dhcp 段 | DNS 缓存条数 |
hosts 去广告实战
原理一句话:把广告域名指向 0.0.0.0,设备拿到这个地址后连接立即失败,广告加载不出来。具体步骤分三步。
第一步准备规则文件。hosts 格式是每行一条记录,左边 IP 右边域名:
0.0.0.0 ad.doubleclick.net
0.0.0.0 pagead2.googlesyndication.com
0.0.0.0 analytics.example.com
规则来源可以是社区维护的广告域名列表(网上有大量文本格式订阅,转换成 hosts 格式即可),也可以是自己从观察日志里攒出来的。新手建议从十几个域名的小列表开始,确认机制跑通再逐步扩充。
第二步把文件挂进 dnsmasq:
# 假设规则文件放在 /etc/myhosts
uci add_list dhcp.@dnsmasq[0].addnhosts='/etc/myhosts'
uci commit dhcp
/etc/init.d/dnsmasq restart
第四步验证:在设备上 nslookup 列表里的某个广告域名,返回 0.0.0.0 就说明已生效。内网域名解析的验证同理:nslookup nasbook.lan 应该返回你给 NAS 设的固定地址,而不是去问公网 DNS。之后更新规则只需要改这个文件然后重启 dnsmasq,不需要动其它配置。
规则文件的组织方式有讲究。一个实用的做法是把规则拆两个文件:一个放订阅转换来的自动列表(定期整体覆盖),一个放自己手动添加的域名(只增不减)。这样的好处是自动更新永远覆盖不到你的手工条目,某条自动规则误伤了网站时,往手工文件里加一条白名单风格的例外就能压住它,不用等订阅修复。
订阅转换不用自己一条条改格式,网上有从广告过滤规则(比如 ABP 格式)转 hosts 格式的在线工具与脚本,贴一条链接就转好。转换后务必抽查一遍域名数量是否对得上原列表,转换器偶发漏行,数量差太多说明转换过程有问题。
这个方案的优点是零成本、零学习门槛、dnsmasq 久经考验;缺点也明显:没有统计界面、不知道拦了多少、规则全靠手工维护。如果你发现自己越来越想知道过滤效果,那就是该升级到 AdGuard Home 的信号了,两套方案的对比见《AdGuard Home 广告过滤》。
这个域名一旦定下来就别轻易改:所有设备的访问习惯、浏览器书签、自动化脚本都记着它,改名字的成本远高于一开始想清楚。如果家里有多个 NAS 或多类服务,按设备名而不是服务名起名(nasbook、printer 这类)更经得起功能变迁。

自建 DNS 的构成要素
再进一步,有的玩家想把 DNS 完全握在自己手里。一个家庭自建 DNS 通常包含这几个层次。
上游解析层:选稳定快速的公共 DNS 作为转发目标,加密需求高的上 DoH/DoT,这部分在 dnsmasq 的服务器设置里填。本地缓存层:dnsmasq 自带的缓存提高重复查询速度,把 cachesize 调大一点(比如 1000)效果明显。自定义解析层:hosts 记录管理固定域名,给 NAS、打印机这些内网设备配好记的名字。过滤层:hosts 规则或拦截列表。
一个完整的自建 DNS 应用场景:把 nasbook.lan 指向 NAS 的固定 IP,全家访问 NAS 不用记数字地址;把广告域名批量指向空地址;上游指定两家公共 DNS 做主备。所有这些只靠 dnsmasq 一个进程就全办了,运行占用几乎可以忽略。给内网设备起名字涉及 DHCP 与解析的协同,基础概念见 DNS 与 DHCP 工作原理。
这套独立管理的思路有它的长期价值:hosts 方案的所有积累——域名观察、白名单经验、规则分类——迁到 AdGuard Home 上全部用得上,只是载体从文本文件变成了图形面板。从这个角度说,先玩轻量方案再升级,比一上来直接装 AdGuard Home 的学习路径更扎实。
内网解析的注意事项
自建 DNS 最容易翻车的地方是本地域名与上游的冲突。dnsmasq 的 domain 选项给内网设了 .lan 后缀,所有以这个后缀结尾的查询都在本地处理,不会泄漏到公网。但要注意两点:一是 hosts 文件里的内网记录不要和公网真实域名重名,否则覆盖掉真实解析;二是明确给内网解析开 domain needed 选项,避免单标签主机名(比如裸写 nas)被公网服务器解析。
排障时按链路定位:客户端 nslookup 不对,是 hosts 没挂上还是 dnsmasq 没重启;外网域名解析慢,看缓存是否生效、上游是否通畅;只有某台设备异常,多半是该设备自己配了别的 DNS 绕过了路由器——所有客户端的 DNS 都应该在 局域网管理 讲过的 DHCP 统一下发里固定指向路由器。

节奏与范围控制
hosts 列表的大小要克制。dnsmasq 每次启动都要把整个列表读进内存,十万行级别的巨型列表会让重启变慢、占内存翻倍,对解析性能没一点好处。几万条以内的列表 OpenWrt 轻松应付,超过这个规模就该考虑换 AdGuard Home 那种专业工具了。
过滤范围的取舍同样重要。物联网设备依赖的域名污染最少,先过滤视频类站点最容易看到效果。对于那些全家共享的智能电视、机顶盒,规则的副作用要格外小心——某些品牌的系统服务域名和广告域名混在一起,一刀切会让系统功能异常。操作原则:新加规则后观察一两天,发现异常就从日志里找回被误伤的域名。这些繁琐的运营工作,正是 hosts 方案最终被统计型方案取代的原因,了解两者的差距请看《AdGuard Home 广告过滤》。
性能与缓存调优
自建 DNS 的性能主要来自缓存。dnsmasq 的 cachesize 默认只有 150 条,对目前动辄上百个域名的家庭环境明显不够。把它调到 1000 到 2000,绝大多数重复查询在本地就应答了,第一次打开网页的等待感会明显降低。配合 expand-hosts(给 hosts 记录自动补域名后缀)和 domain-needed(单标签名才查上游)两个选项,本地解析效率和准确性都能再上一个台阶。
另外一个影响解析速度的因素是上游选择。公共 DNS 之间延迟差异可以实测:在路由器上对每个候选地址跑几十次 ping,取平均值最低的两家配主备。dnsmasq 会按顺序尝试上游,主用快了,备份的存在感自然降低。这一切的前提是你按 DNS 加密实践 的方法确认过上游的实际连通质量,不是闭上眼填知名 DNS。
调试过程中一定要善用 log-queries 选项,开启后 dnsmasq 把每次查询都记进系统日志,哪条域名、返回什么结果、命中 hosts 还是缓存,全部有迹可循,相当于一个免费的分析器。

延伸阅读
- 《AdGuard Home 广告过滤》:从轻量方案升级到带统计面板的完整方案。
- 《IPv6 透穿与内网访问》:IPv6 环境下 DNS 配置的特殊处理。
- 《系统日志与监控》:开 log-queries 把解析记录留下来,自建 DNS 也能有日志可查。
