前言

当我想学习AdGuard Home
资料收集的时候
我发现一个很好的文章
就是来自什么值得买纵笔浮生大佬

1
https://post.smzdm.com/p/axz6z7w9/

因为懒,所以可能会借用大佬的拓扑图

带定头盔

  • 本文仅作学习自用记录
  • 如若侵权,联系必删

家庭网络环境

除了网段和设备细节相关
其实我和大佬的拓扑差不多
所以我直接借用大佬的拓扑图

拟实现 DNS 转发流程

设置最核心的部分就是DNS转发端口的衔接,而我们要做的就是把DNSMASQAdGuard HomeSmartDNS三个插件里的DNS服务器功能分成三个层级,实现层层转发。

依次是第一级DNSMASQ,第二级AdGuard Home,第三级SmartDNS

经过设置之后,OpenWrt 的默认DNS服务器为DNSMASQ,本地的DNSOpenWrtSmartDNS负责解析缓存,DNSMASQ作为最底层的DNS服务器,只担任转发功能。

客户端 DNS 请求流程

【客户端(client)】国内请求
–> 192.168.1.1:53
–> 192.168.2.1:53(DNSMASQ)
–> 192.168.2.1:5351(AdGuard Home)
–> 192.168.2.1:6053 (SmartDNS缓存)
–> 上游国内DNS公共服务器
–> 返回最快DNS给客户端

【客户端(client)】国外请求
–> 192.168.1.1:53
–> 192.168.2.1:53(DNSMASQ)
–> 192.168.2.1:5351(AdGuard Home)
–> 192.168.2.1:5335 (SmartDNS缓存)
–> 上游国外DNS公共服务器
–> 返回最快DNS客户端

OpenWrt 基本配置

Lan 基本设置

  1. IPv4地址:为OpenWrtIP地址,也是我们管理OpenWrt的地址。
  2. 子网掩码:和iKuai一致,保证同一个网段。
  3. IPv4网关:指向iKuai的网关。保证OpenWrt的上网数据传输到iKuai再传输到外网。
  4. 使用自定义的DNS服务器:首先设置一个自定义的DNS,这里我们先设置一个能用的DNS即可,保证我们在设置过程中可以上网,后面设置好了,可以将DNS改为由OpenWrt代理。

关闭 DHCP 功能

  1. 关闭 DHCP 服务,统一由iKuai分配。
  1. 因为IPv6技术仍未成熟,内网也没必要用IPv6,果断关掉减少Bug

Lan 高级设置

  • 开启 开启开机自动运行
  • 开启 强制链路
  • 禁用 使用内置的IPv6管理

Turbo ACC 加速

只开启前三个即可,DNS缓存后面由SmartDNS来管理。

防火墙设置

基本设置

  • 可选 SYN-flood 防御
  • 可选 丢弃无效数据包
  • 启用 FullCone-NAT
  • 接受 入站数据
  • 接受 出站数据
  • 接受 转发
  • Lan 开启 IP 动态伪装

自定义规则

  1. 放行 DNS 流量
1
2
3
4
iptables -t nat -A PREROUTING -p udp --dport 53 -j REDIRECT --to-ports 53
iptables -t nat -A PREROUTING -p tcp --dport 53 -j REDIRECT --to-ports 53
[ -n "$(command -v ip6tables)" ] && ip6tables -t nat -A PREROUTING -p udp --dport 53 -j REDIRECT --to-ports 53
[ -n "$(command -v ip6tables)" ] && ip6tables -t nat -A PREROUTING -p tcp --dport 53 -j REDIRECT --to-ports 53
  1. 加入回程旁路由统一转发代码
  • -o 后参数请根据网卡实际名称修改
1
iptables -t nat -I POSTROUTING -o br-lan -j MASQUERADE

需要设置情况:

  1. iKuai主路由开 DHCP(未指向OpenWrt旁路由网关),OpenWrt旁路由关 DHCP,旁路由只有 LAN 口工作,其他设备需设置静态网关为旁路由,需要设置。

  2. iKuai主路由开 DHCP(未指向OpenWrt旁路由网关),OpenWrt旁路由开 DHCP(强制模式开),旁路由只有 LAN 口工作,其他设备通过强制 DHCP 获取旁路由网关,需要设置。

  3. iKuai主路由开 DHCP(指向OpenWrt旁路由网关),OpenWrt旁路由关 DHCP,旁路由只有 LAN 口工作,需要设置。

  4. iKuai主路由关 DHCPOpenWrt旁路由开 DHCPOpenWrt旁路由只有 LAN 口工作,需要设置。

不需要设置的情况:

  1. OpenWrt旁路由 WAN LAN 共用 eth0,不用设置。

  2. iKuai单臂路由情况,OpenWrt作为拨号路由(有拨号就有 WAN 口),不用设置。


iKuai DNS 设置

  1. 网关:设置为 OpenWrtIP地址
  2. DNS: 设置为 OpenWrtIP地址

SmartDNS 设置

基本设置

  • 服务器名称: smartdns
  • 本地端口: 6053
  • 禁用 自动设置Dnsmasq

高级设置

  • 启用 TCP服务器
  • 禁用 IPV6服务器
  • 启用 双栈IP优选
  • 启用 域名预加载
  • 启用 域名过期服务
  • 禁用 停用HTTPS地址解析
  • 缓存大小: 1000000
  • 域名TTL最大值: 3600

配置参考规则

SmartDNS 提供了域名缓存机制:对查询的域名,进行缓存,缓存时间符合 DNS TTL 规范。

  1. 为提高缓存命中率,适当增大 cache 的记录数、通过 cache-size来设置缓存记录数。内存大的情况下,可适当调大。可以提高 cache 效率,加快访问速度

  2. 适当设置最小 TTL 值:通过 rr-ttl-min 将最低 DNS TTL 时间设置为一个合理值,延长缓存时间。建议是超时时间设置在 10~30 分钟,避免服务器域名变化时,查询到失效域名。

  3. 开启域名预获取功能:通过来启用域名预先获取功能,提高查询命中率。
    配合上述 TTL 超时时间,SmartDNS 将在域名 TTL 即将超时使,再次发送查询请求,并缓存查询结果供后续使用。频繁访问的域名将会持续缓存。此功能将在空闲时消耗更多的 CPU

  4. 数量方面:SmartDNS 有测速机制,在配置上游服务器时,建议配置多个上游 DNS 服务器,包含多个不同区域的服务器,但总数建议在 10 个左右。

  5. 隐私方面:默认情况下,SmartDNS 会将请求发送到所有配置的 DNS 服务器,若上游 DNS 服务器使用 DNS,或记录日志,将会导致隐私泄漏。

配置上游服务器

添加国内 DNS 服务器

  • DNS服务器名称: 自己设置
  • 服务器组: China
  • 端口: default (默认端口)
  • 类型: UDP (国内统一设置)

添加国际 DNS 服务器

  • DNS服务器名称: 自己设置
  • 服务器组: Global
  • 端口: default (默认端口)
  • 类型: 查表得
  • 启用 从默认组中排除
  • 服务器参数: -exclude-default-group

查询 DNS

1
https://dns.ip.cn/

国内 DNS 列表

名称 主要 DNS 服务器 备用 DNS 服务器 类型
本地电信 202.96.128.166 202.96.134.133 UDP
本地移动 211.136.192.6 120.196.165.24 UDP
114 DNS 114.114.114.114 114.114.115.115 UDP
阿里 AliDNS 223.5.5.5 223.6.6.6 UDP
百度 BaiduDNS 180.76.76.76 UDP
DNSPod DNS+ 119.29.29.29 UDP
华为云 DNS 122.112.208.1 139.9.23.90 UDP
CNNIC SDNS 1.2.4.8 210.2.4.8 UDP
DNS 派 电信/移动/铁通 101.226.4.6 218.30.118.6 UDP
DNS 派 联通 123.125.81.6 140.207.198.6 UDP

国际 DNS 列表

名称 主要 DNS 服务器 备用 DNS 服务器 类型
Google DNS 8.8.8.8 8.8.4.4 TLS
CloudFlare 1.1.1.1 TLS
IBM Quad9 9.9.9.9 TLS
Norton ConnectSafe 199.85.126.10 199.85.127.10 UDP
威瑞信 64.6.64.6 64.6.65.6 UDP
Comodo 安全 DNS 8.26.56.2 68.20.247.20 UDP
DNS Watch 84.200.69.80 84.200.70.40 UDP
OpenDNS 208.67.222.222 208.67.220.220 TLS
韩国电信DNS 168.126.63.1 168.126.63.2 TLS
V2EX DNS 199.91.73.222 178.79.131.110 TLS

设置第二 DNS 服务器

  • 本地端口: 5335
  • 服务器组: Global
  • 禁用 跳过测速
  • 禁用 跳过address规则
  • 禁用 跳过双栈优选
  • 禁用 跳过cache

然后我们启用保存&应用

自定义设置

SmartDNS自定义中添加下面两项分组信息

1
2
bind:6053 -group China
bind:5335 -group Global

SmartDNS 自定义备份

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# Add custom settings here.

# set log level
# log-level [level], level=fatal, error, warn, notice, info, debug
# log-level error

# log-size k,m,g
# log-size 128k

# log-file /var/log/smartDNS.log
# log-num 2

# List of hosts that supply bogus NX domain results
# bogus-nxdomain [ip/subnet]

bind:6053 -group China
bind:5335 -group Global

AdGuard Home OpenWrt 配置

更新核心

如果你的境界足够正常的话
我们直接更新核心版本就OK

重定向

按照luci-app-adguardhome作者的注释
使用作为 DNSMASQ 的上游服务器是比较稳定的方式

其他配置

  • 开启 详细日志
  • 开启 开机后网络准备好时重启
  • 开启 在关机时备份工作目录文件

AdGuard Home 初始化配置

端口设置

  • 网页管理界面(所有接口)端口: 3000
  • DNS 服务器(所有接口)端口: 5351

设置网页管理界面账号密码

确认 AdGuard Home 配置

AdGuard Home Web 配置

常规设置

  • 开启 使用过滤器和Hosts文件以拦截指定域名

仅开启上述功能就🆗了
剩下的功能玩不动分分钟断网

日志配置

按照大家自己的喜好配置

统计配置

按照大家自己的喜好配置

DNS 设置

上文我们已经把SmartDNS配置好了
这时候我们就要将AdGuard Home的上游DNS服务器设置为SmartDNS
AdGuard Home过滤后的 DNS 请求再转发给 SmartDNS

  • 国内 DNS : 127.0.0.1:6053
  • 国际 DNS : 127.0.0.1:5335

上游 DNS 服务器

  1. 设置上游 DNS 服务器
1
2
127.0.0.1:6053
127.0.0.1:5335
  1. 设置运行模式为并行请求
  1. 设置 Bootstrap DNS 服务器127.0.0.1:6053

DNS 服务配置

速度限制设置为0

DNS 缓存配置

默认空着就🆗
SmartDNS来管理

AdGuard Home 过滤器配置

DNS黑名单设置

过滤器 --> DNS 黑名单

添加官方列表

添加黑名单 --> 从列表中选择

添加第三方黑名单

AdGuard 默认的内置规则里很多选择,规则一定不要搞太多,一两个综合性的规则列表就已足够覆盖大部分情况,如果同时使用,这些规则可能会冲突,出现很多莫名其妙的问题,使用几个自己用的顺手的就可以了。有的规则带有两个或者两个以上的源头,可以留着以后失效之后使用。

添加黑名单 --> 添加一个自定义列表

第三方黑名单推荐

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 【推荐】目前中文区命中率最高的广告过滤列表,实现了精确的广告屏蔽和隐私保护,屏蔽广告域名、电视广告、APP 内置广告,同时屏蔽了一些日志收集、大数据统计等涉及个人隐私信息的站点,能够保护个人隐私不被偷偷上传
anti-AD: https://anti-ad.net/easylist.txt

# 【推荐】合并自乘风视频广告过滤规则、Easylist、EasylistChina、EasyPrivacy、CJX’sAnnoyance,以及补充的一些规则
ad-pc.txt: https://cdn.jsdelivr.net/gh/o0HalfLife0o/list@master/ad-pc.txt

# 【推荐】手机去广告规则
adgk 手机去广告规则: https://raw.githubusercontent.com/banbendalao/ADgk/master/ADgk.txt

# 【推荐】Youtube 去广告
Youtube 去广告: https://sdwz.icu/TQtFq

# 【推荐】大圣净化
大圣净化: https://cdn.jsdelivr.net/gh/jdlingyu/ad-wars@master/hosts

# 去除国际国内网页中大多数广告,包括不需要的框架、图像和对象
EasyList China+EasyList: https://easylist-downloads.adblockplus.org/easylistchina+easylist.txt

恶意广告主机列表: https://raw.githubusercontent.com/Goooler/1024_hosts/master/hosts

# 合并规则,合并自 EasylistChina、EasylistLite、CJX’sAnnoyance
HalfLife: https://cdn.jsdelivr.net/gh/o0HalfLife0o/list@master/ad-pc.txt

# 合并自 Adblock Warning Removal List、ABP filters、anti-adblock-killer-filters
ad-edentw.txt: https://cdn.jsdelivr.net/gh/o0HalfLife0o/list@master/ad-edentw.txt

# 从网络上完全删除所有形式的跟踪,包括 Web 错误、跟踪脚本和信息收集,从而保护您的个人数据
EasyPrivacy 去跟踪: https://easylist-downloads.adblockplus.org/easyprivacy.txt

Adbyby CDN 加速: https://cdn.jsdelivr.net/gh/adbyby/xwhyc-rules@master/lazy.txt

ADH 去广告拦截: https://raw.githubusercontent.com/BlueSkyXN/AdGuardHomeRules/master/all.txt

DNS 白名单

有误杀可尝试使用白名单
添加到 AdGuard Home 的允许清单

添加白名单

过滤器 --> DNS 白名单 --> 添加白名单

白名单推荐

1
https://adrules.top/allow-domains-list.txt

自定义规则

使用Adguard 过滤语法规则
轻轻松松Ban

1
2
3
4
# 拦截 example.org 域名及其所有子域名
||example.org^
# 放行 example.org 及其所有子域名
@@||example.org^

AdGuard Home 重定向

OpenWrt 回到基本设置
就会看到AdGuard Home 运行中已重定向
并且重定向变成了5351重定向

DNSMASQ 设置

基本设置

网络 --> DHCP/DNS --> DNS转发

发现已经自动设置成127.0.0.1#5351
如果没有就直接设置为127.0.0.1#5351
这步操作主要是解除 DNSMASQDNS 功能
只保留 DNSMASQ 的转发功能
DNSMASQ 作为 AdGuard Home 的下级服务生效

HOSTS 和解析文件

这里忽略掉解析文件,不用DNSMASQ的解析。

选项解释

1
2
3
4
/etc/hosts: 记录本地配置的域名和 IP 的映射的文件,是域名解析(如 ping,http 访问)时域名的第一解析方式。DNSMASQ可以选择加载 /etc/hosts到本地缓存,也可以选择不加载。
如果选择加载: 当客户端(client)设备的 DNS 请求的域名正好在 /etc/hosts 中的情况下,DNSMASQ 直接回复 /etc/hosts 域名对应的 IP 地址。
如果选择不加载: DNSMASQ 则会将请求转发到公共的 DNS 服务器去解析,而不是使用 /etc/hosts 中的记录,通过 —no-hosts 选项可以选择是否加载 /etc/hosts 内容作为 DNSMASQ DNS 的本地缓存。
/etc/resolv.conf: 该文件主要记录 DNS Name Server,对于没在 /etc/hosts 记录的域名,系统向 Name Server 发起 DNS 请求,从而解析域名。

高级选项

  • DNS 服务器端口: 53
  • DNS 查询缓存的大小: 0

设置完成

DNSMASQ --> AdGuard Home --> SmartDNS

  1. DNSMASQ 监听本地【53端口】
  2. 将请求转发到 AdGuard Home 监听的【5351端口】
  3. 然后 AdGuard Home 再转发到 SmartDNS 查询最快的 DNS
  4. 然后提交给 DNSMASQ
  5. 然后发送到 iKuai 主路由
  6. 回程数据首先发送到ikuai
  7. 然后经过 SmartDNS 交给 AdGuard Home 进行处理
  8. 返回到 DNSMASQ
  9. 然后发送回设备

知识储备

DNS

域名系统(Domain Name System,缩写:DNS)】是互联网的一项服务。它作为将域名和 IP 地址相互映射的一个分布式数据库,是 Internet 上解决网上机器命名的一种系统,能够使人更方便地访问互联网。就像拜访朋友要先知道别人家怎么走一样,Internet 上当一台主机要访问另外一台主机时,必须首先获知其地址。

域名解析

域名解析就像我们初次拜访朋友一样,首先要知道人家的门牌号,然后按照地址去找。在 Internet 上只知道某台机器的域名还是不够的,还要有办法去找到那台机器。寻找这台机器的任务由网上一种被称为域名服务器的设备来完成的,而完成这一任务的过程就称为域名解析。

可以用 IP 地址标识,并且可以通过 IP 地址被访问,但即使是将 32 位的二进制 IP 地址写成 40-255 的十位数形式,也依然太长、太难记。因此,人们发明了域名 (Domain Name),域名可将一个 IP 地址关联到一组有意义的字符上去。用户访问一个网站的时候,既可以输入该网站的 IP 地址,也可以输入其域名,对访问而言,两者是等价的。

DNS 端口

53 端口是为 Domain Name Server (DNS域名服务器)服务器所开放的端口,主要用于域名解析,DNS 服务在 NT 系统中使用的最为广泛。通过 DNS 服务器可以实现域名与 IP 地址之间的转换,只要记住域名就可以快速访问网站。

DNSMASQ DNS

OpenWrt 默认使用的是 DNSMASQ 来管理 DNS 默认监管的 53 端口。我们这些上网的设备发出的 DNS 请求都是先到这里,然后再通过 DNS 转发(在常规设置中可以更改)送到网关,最后到运营商等 DNS 服务器进行查询。

DNSMASQ 是一个轻量级的 DNSDHCP 服务器,大约 200KB 左右,并且完整的包含了 DNS 服务器和 DHCP 服务器功能,非常适合 flash 空间有限的嵌入式系统。DNSMASQ 作为 OpenWrt 默认的 DNS 服务器和转发器,接收 Client 的 DNS 查询请求,并回复 DNS 查询结果。查询的结果可以来自本地缓存和公共 DNS 服务器,如果本地缓存没有记录,DNSMASQ 会将请求转发到公共的 DNS 服务器,并将公共的 DNS 解析的结果回复到请求的设备。

SmartDNS

SMARTDNS 在设计上并不是替换 DNSMASQ 的,SMARTDNS 主要功能集中在 DNS 解析增强上,增强部分有:

  • 多上游服务器并发请求,对结果进行测速后,返回最佳结果;
  • addressipset 域名匹配采用高效算法,查询匹配更加快速高效,路由器设备依然高效。
  • 域名匹配支持忽略特定域名,可单独匹配 IPv4IPV6,支持多样化定制。
  • 针对广告屏蔽功能做增强,返回 SOA,屏蔽广告效果更佳;
  • IPV4IPV6 双栈 IP 优选机制,在双网情况下,选择最快的网络通讯。
  • 支持最新的 TLS, HTTPS 协议,提供安全的 DNS 查询能力。
  • ECS 支持,是查询结果更佳准确。
  • 域名 TTL 可指定,使访问更快速。
  • 高速缓存机制,使访问更快速。
  • 第二 DNS 支持自定义更多行为。

参考 & 引用

https://post.smzdm.com/p/axz6z7w9/