路由器部署 AdGuard Home:去广告与国内外域名分流

在路由器上运行 AdGuard Home,全屋设备的 DNS 请求都会经过它:广告域名本地掐掉,国内域名走运营商解析,国外域名交给代理程序。下面是从安装、规则配置到国内外分流的完整落地过程。

为什么值得部署

AdGuard Home 是 DNS 级别的拦截服务,典型用途有三类:广告拦截、隐私保护、家长控制,并且跨平台运行。装在路由器上意味着所有接入设备默认生效,不需要逐台配置系统 DNS。

AdGuardHome01
AdGuardHome02

安装与开机自启

把执行文件上传到 /data/AdGuardHome 目录,加执行权限并注册为服务:

# 把执行文件上传到 /data/AdGuardHome 目录下
mkdir -p /data/AdGuardHome/
cd /data/AdGuardHome/

# 添加执行权限
chmod +x AdGuardHome

# 执行安装,安装完成则自动启动
./AdGuardHome -s install

ss -tnlp|grep 3000
AdGuardHome03

管理页面监听 3000 端口,DNS 服务监听 5353。要让原本发往 53 的查询都进来,需要添加端口重定向规则:

iptables -t nat -A PREROUTING -p tcp --dport 53 -j REDIRECT --to-ports 5353
iptables -t nat -A PREROUTING -p udp --dport 53 -j REDIRECT --to-ports 5353
ip6tables -t nat -A PREROUTING -p tcp --dport 53 -j REDIRECT --to-ports 5353
ip6tables -t nat -A PREROUTING -p udp --dport 53 -j REDIRECT --to-ports 5353

# 检查规则是否添加成功
iptables -t nat -C PREROUTING -p tcp --dport 53 -j REDIRECT --to-ports 5353 && echo "规则存在" || echo "规则不存在"
iptables -t nat -C PREROUTING -p udp --dport 53 -j REDIRECT --to-ports 5353 && echo "规则存在" || echo "规则不存在"
ip6tables -t nat -C PREROUTING -p tcp --dport 53 -j REDIRECT --to-ports 5353 && echo "规则存在" || echo "规则不存在"
ip6tables -t nat -C PREROUTING -p udp --dport 53 -j REDIRECT --to-ports 5353 && echo "规则存在" || echo "规则不存在"


# 也可以使用下面的命令检查规则是否存在
iptables -t nat -v --list 和 ip6tables -t nat -v --list
AdGuardHome04
AdGuardHome05

路由器重启后服务和 iptables 规则都会丢失,把它们写进开机脚本 auto_ssh.sh:

~# vi /data/auto_ssh/auto_ssh.sh

/data/AdGuardHome/AdGuardHome -s install
/data/AdGuardHome/AdGuardHome -s start
iptables -t nat -A PREROUTING -p tcp --dport 53 -j REDIRECT --to-ports 5353
iptables -t nat -A PREROUTING -p udp --dport 53 -j REDIRECT --to-ports 5353
ip6tables -t nat -A PREROUTING -p tcp --dport 53 -j REDIRECT --to-ports 5353
ip6tables -t nat -A PREROUTING -p udp --dport 53 -j REDIRECT --to-ports 5353
AdGuardHome06

广告规则选择

过滤规则同时启用 OISD Blocklist Full 和 AdRules 系列规则,前者覆盖广、后者针对中文广告优化,搭配使用兼顾误杀率与覆盖率。命中统计可以在管理界面直接查看。

AdGuardHome07
AdGuardHome08
AdGuardHome09

国内外域名分流

思路是把 dnsmasq-china-list 的国内域名清单用 sed 转换成规则文件 dnsrule.txt,国内域名指定本地解析,其余域名交给代理。转换脚本 china-list.sh:

cd /data/AdGuardHome/

# 编写脚本
vim china-list.sh

#!/bin/sh
# 国内域名走dnsmas
CHINADNS=127.0.0.1
LIST="$(dirname $0)/dnsrule.txt"
# 国外域名走clash进行代理
cat <<EOF > ${LIST}
127.0.0.1:1053
EOF
# 下载国内域名列表并替换配置内容
curl -Os https://ghproxy.com/https://raw.githubusercontent.com/felixonmars/dnsmasq-china-list/master/accelerated-domains.china.conf && 
    sed -i -E "s#server=(/.+/)114.114.114.114#[1]${CHINADNS}#g" accelerated-domains.china.conf && 
    cat accelerated-domains.china.conf >> ${LIST}
rm -f accelerated-domains.china.conf

# 执行脚本
chmod +x china-list.sh
./china-list.sh

然后在 AdGuardHome.yaml 里指定上游规则文件:

vim /data/AdGuardHome/AdGuardHome.yaml

upstream_dns_file: "/data/AdGuardHome/dnsrule.txt"
AdGuardHome010
AdGuardHome011

代理侧同样要感知 DNS。修改 clash 的 mark 脚本,把 dns_port 指向 5353:

root@XiaoQiang:~# vim /data/clash/mark

dns_port=5353

user.yaml 中 dns 段的关键配置:监听 0.0.0.0:1053,上游 nameserver 指向 127.0.0.1:53,fallback 使用 DoH/DoT 列表,default-nameserver 负责引导解析;fake-ip 模式下用 fake-ip-filter 放行局域网与常见域名,fallback-filter 用 geoip CN 判定命中国内结果即丢弃 fallback;redir_host 里包含需要直连的域名:

root@XiaoQiang:~# vim /data/clash/user.yaml

dns:
  # 设置 true 以启用 dns(默认为 false)
  enable: true
  # 默认值为false
  ipv6: false
  # 查找主机并返回 IP 记录
  use-hosts: true
  enhanced-mode: fake-ip
  fake-ip-range: 198.18.0.1/16
  listen: 0.0.0.0:1053
  # 上游 DNS 服务器.DoH或DoT的流量不会通过代理,所有流量都将定向到服务器。
  nameserver:
    - 127.0.0.1:53

  # 上游 DNS 服务器,与nameserver并发请求,GEOIP国家不是CN时使用的DNS
  fallback:
    - https://1.0.0.1/dns-query
    - tls://dns.google
    - https://doh.opendns.com/dns-query
    - tls://1.1.1.1:853
    - tls://8.8.8.8:853
  # 解析dns nameserver主机,填写纯IP(又称为Bootstrap DNS)
  # Bootstrap DNS 服务器用于解析您指定为上游的 DoH / DoT 解析器的 IP 地址
  default-nameserver:
    - 223.6.6.6
    - 119.29.29.29
    - 1.0.0.1
    - 208.67.220.220
    - 8.8.4.4
  # fake-ip 白名单,又名 Always Real IP
  fake-ip-filter:
    - "*.lan"
    - "time.windows.com"
    - "time.nist.gov"
    - "time.apple.com"
    - "time.asia.apple.com"
    - "*.ntp.org.cn"
    - "*.openwrt.pool.ntp.org"
    - "time1.cloud.tencent.com"
    - "time.ustc.edu.cn"
    - "pool.ntp.org"
    - "ntp.ubuntu.com"
    - "ntp.aliyun.com"
    - "ntp1.aliyun.com"
    - "ntp2.aliyun.com"
    - "ntp3.aliyun.com"
    - "ntp4.aliyun.com"
    - "ntp5.aliyun.com"
    - "ntp6.aliyun.com"
    - "ntp7.aliyun.com"
    - "time1.aliyun.com"
    - "time2.aliyun.com"
    - "time3.aliyun.com"
    - "time4.aliyun.com"
    - "time5.aliyun.com"
    - "time6.aliyun.com"
    - "time7.aliyun.com"
    - "*.time.edu.cn"
    - "time1.apple.com"
    - "time2.apple.com"
    - "time3.apple.com"
    - "time4.apple.com"
    - "time5.apple.com"
    - "time6.apple.com"
    - "time7.apple.com"
    - "time1.google.com"
    - "time2.google.com"
    - "time3.google.com"
    - "time4.google.com"
    - "music.163.com"
    - "*.music.163.com"
    - "*.126.net"
    - "musicapi.taihe.com"
    - "music.taihe.com"
    - "songsearch.kugou.com"
    - "trackercdn.kugou.com"
    - "*.kuwo.cn"
    - "api-jooxtt.sanook.com"
    - "api.joox.com"
    - "joox.com"
    - "*.qq.com"
    - "y.qq.com"
    - "*.y.qq.com"
    - "streamoc.music.tc.qq.com"
    - "mobileoc.music.tc.qq.com"
    - "isure.stream.qqmusic.qq.com"
    - "dl.stream.qqmusic.qq.com"
    - "aqqmusic.tc.qq.com"
    - "amobile.music.tc.qq.com"
    - "*.xiami.com"
    - "*.music.migu.cn"
    - "music.migu.cn"
    - "*.msftconnecttest.com"
    - "*.msftncsi.com"
    - "localhost.ptlogin2.qq.com"
    - "*.*.*.srv.nintendo.net"
    - "*.*.stun.playstation.net"
    - "xbox.*.*.microsoft.com"
    - "*.*.xboxlive.com"
    - "proxy.golang.org"
    - "*.sgcc.com.cn"
    - "*.alicdn.com"
    - "*.aliyuncs.com"
    - "*.douyin.com"
  fallback-filter:
    geoip: true
    geoip-code: CN
AdGuardHome012
AdGuardHome013

生效与注意事项

配置修改完成后重启服务:

cd /data/AdGuardHome/

./AdGuardHome -s restart
AdGuardHome014
AdGuardHome015
  • 分流脚本依赖 sed 等基础命令,精简固件缺少工具链时先补齐再执行。
  • 5353 与 1053 分工别搞混:AdGuard Home 对局域网提供 DNS,clash 在 1053 上做二次解析,互相指向时注意上游顺序。
  • iptables 与 ip6tables 的重定向规则务必 TCP/UDP 成对添加,只加 TCP 会导致大量应用绕过拦截。
  • 排障时优先看 AdGuard Home 的查询日志,确认域名走到了哪一层,再动配置文件。
© 版权声明
THE END
喜欢就支持一下吧
点赞11 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容