在家庭网络环境中,广告拦截一直是个让人头疼的问题。传统浏览器插件只能解决单台设备的问题,而路由器层面的广告拦截方案才能真正实现全网络覆盖。OpenWrt作为一款开源路由器操作系统,配合AdGuard Home这款强大的广告拦截工具,能够为整个局域网提供高效的广告过滤服务。
我最早接触这套方案是在2020年,当时家里的智能电视广告多到令人发指,开机广告、贴片广告、暂停广告层出不穷。尝试过各种方案后,最终在OpenWrt路由器上部署AdGuard Home彻底解决了这个问题。现在全家所有设备都能自动享受无广告的清爽体验,连手机上的APP广告也一并消失了。
AdGuard Home本质上是一个DNS服务器,它通过拦截广告域名的DNS查询请求来实现广告过滤。当设备访问某个网站时,会先向DNS服务器查询域名对应的IP地址。AdGuard Home在这个过程中会检查查询的域名是否在广告域名列表中,如果是就直接返回空响应或虚假IP,从而阻止广告加载。
这种方式的优势在于:
在OpenWrt系统中,AdGuard Home通常作为DNS转发器运行。网络流量流向如下:
设备 → OpenWrt DHCP分配的DNS(AdGuard Home) → 上游DNS服务器
OpenWrt的dnsmasq服务会将所有DNS查询转发给AdGuard Home处理,AdGuard Home再根据规则决定是否拦截,最后将合法查询转发给配置的上游DNS服务器(如8.8.8.8或1.1.1.1)。
建议使用以下硬件配置:
我的实际配置是一台树莓派4B(4GB内存)运行OpenWrt,外接128GB U盘作为存储。这样的配置可以轻松处理50+设备的网络流量。
通过SSH登录OpenWrt后执行以下命令:
bash复制# 下载安装包
wget https://static.adguard.com/adguardhome/release/AdGuardHome_linux_armv7.tar.gz
# 解压
tar xzvf AdGuardHome_linux_armv7.tar.gz
# 移动到合适目录
mkdir -p /opt/adguardhome
mv AdGuardHome /opt/adguardhome/
创建启动脚本/etc/init.d/adguardhome:
bash复制#!/bin/sh /etc/rc.common
START=99
USE_PROCD=1
start_service() {
procd_open_instance
procd_set_param command /opt/adguardhome/AdGuardHome -c /opt/adguardhome/AdGuardHome.yaml -w /opt/adguardhome/workdir
procd_set_param respawn
procd_close_instance
}
首次访问http://路由器IP:3000进入配置向导:
code复制tls://dns.google
tls://1.1.1.1
https://dns.alidns.com/dns-query
修改/etc/config/dhcp:
bash复制config dnsmasq
option port '5353'
option noresolv '1'
option localservice '0'
option server '127.0.0.1#53'
配置防火墙规则:
bash复制# 允许局域网访问AdGuard Home
uci add firewall rule
uci set firewall.@rule[-1].name='Allow-AdGuard-Home'
uci set firewall.@rule[-1].src='lan'
uci set firewall.@rule[-1].target='ACCEPT'
uci set firewall.@rule[-1].proto='tcp udp'
uci set firewall.@rule[-1].dest_port='53 3000'
uci commit
/etc/init.d/firewall restart
AdGuard Home支持多种规则格式,我常用的规则组合:
code复制https://adguardteam.github.io/AdGuardSDNSFilter/Filters/filter.txt
https://adaway.org/hosts.txt
code复制https://anti-ad.net/easylist.txt
https://gitee.com/halflife/list/raw/master/ad.txt
code复制https://someonewhocares.org/hosts/zero/hosts
注意:规则不是越多越好,过多的规则会显著增加内存占用和查询延迟。建议先添加基础规则,再根据需要逐步添加。
在客户端页面可以设置不同的访问策略:
配置示例:
yaml复制clients:
- name: "Kids iPad"
ids: ["aa:bb:cc:dd:ee:ff"]
filtering_enabled: true
parental_enabled: true
safesearch_enabled: true
AdGuard Home提供了丰富的统计功能:
这些数据对于优化规则和排查网络问题非常有用。我每周会查看一次统计,移除误拦截的规则,添加新的广告域名。
修改AdGuardHome.yaml:
yaml复制dns:
cache_size: 4194304 # 4MB缓存
cache_ttl_min: 600 # 最小缓存时间(秒)
cache_ttl_max: 86400 # 最大缓存时间(秒)
cache_optimistic: true # 乐观缓存
启用ECS可以提高CDN解析准确性:
yaml复制dns:
edns_client_subnet: true
yaml复制dns:
fastest_timeout: 1s # 最快响应超时
upstream_dns:
- tls://dns.google
- tls://1.1.1.1
- https://dns.alidns.com/dns-query
parallel_requests: 3 # 并行查询数
现象:部分网站无法访问
排查步骤:
现象:网络响应变慢
解决方案:
现象:新设备无法联网
排查步骤:
生成证书:
bash复制openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes
配置AdGuardHome.yaml:
yaml复制tls:
enabled: true
server_name: "router.example.com"
force_https: true
cert_path: "/opt/adguardhome/cert.pem"
key_path: "/opt/adguardhome/key.pem"
创建定时任务:
bash复制0 3 * * * /opt/adguardhome/AdGuardHome -c /opt/adguardhome/AdGuardHome.yaml -w /opt/adguardhome/workdir --update
限制管理界面访问:
yaml复制bind_host: 127.0.0.1
auth_attempts: 5
block_auth_min: 15
经过3个月的运行,我的AdGuard Home实例统计数据显示:
最明显的体验改善:
这套方案最大的优势在于一次配置全家受益,所有设备无需单独设置就能自动获得广告拦截能力。而且由于是在网络层面拦截,连那些浏览器插件处理不了的APP内嵌广告也能有效过滤。