lriigiht 发表于 2020-7-15 18:43

AdGuardHome+SmartDNS上游下游? 教你装两个AdGuardHome配合PW用正确的姿势上网深造

本帖最后由 lriigiht 于 2022-2-10 21:59 编辑

2022年02月10日,新增一篇
来,教你轻松用host网络模式建立两个AdGuardHome,避免bridge或者macvlan网络的各种坑

2021年06月11日,新增一篇
来,教你用超简易的方法实现 SmartDNS 分组,让 DNS 解析内外完全分离,简单易懂

2021年03月12日小更新:
1、系统防火墙的自定义设置,为了避免奇奇怪怪的问题,不要注释掉
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这两行是把局域网内所有客户端对外的53端口查询请求,都劫持指向路由器,能避免很多奇奇怪怪的问题,特别是客户端DNS没有设定指向路由器

2、4-15版本之后的 PW,没有 本地DNS 的设置了,根据我的观察是调用系统 DHCP and DNS 里面的设置,特别是 DNS forwardings
( 以前版本是忽略掉系统dnsmasq 的 DNS Forwardings 的 )。


请务必在 DNS Forwardings 填上解析国内网站的DNS,
用 SmartDNS 或者 AGH 的,就填类似 127.0.0.1#6053 这样的,指向路由器上解析国内的 DNS 端口


10月19日教程更新:简单绘制了拓扑图,便于理解结构和原理

目录:
1、一点点声明
2、本贴目的
3、你需要 AdGuardHome + SmartDNS 是为了什么?把两个 SmartDNS 都填入 AGH 上游不觉得很蠢吗?
4、来吧,教你安装一个 Docker 版 AdGuard Home 并正常运行
5、其他一些需要注意的关键和题外话


前面三节都是“废话”,想直接看教程的直接前往 4
帖子的核心其实很简单,
一句话概括就是——PW 已自带区分网址内外的功能,只需要好好利用 ipk + Docker 版两个 AdGuardHome
(如果你动手能力强,自己搞个共存版ipk也是可以的)

1、一点点声明
个人很是讨厌一些论坛里回帖可见的风气

当然还是感谢你的顶贴,让大家看到真正的教程。

一些关于 AGH、SmartDNS 配合 PW 的帖子,
充满了各种虚假和自以为是,
这样说可能有些许冒犯,
但不少帖子着实令我感受到智商被侮辱的愤怒,
这也是我写作此贴的一大初衷。

这就导致帖子不是因为优质和需要被讨论而顶起来
从而招致大量无意义回复,
没有有效的反馈,帖子不是因为优秀和需要讨论被顶上来,劣币驱逐良币

2、本贴目的

本贴旨在通过讲解一些基本原理,帮助你正确地适配 PW 和 AdGuard Home。
搞清楚原理后,你也能自如地设置 PW + SmartDNS 或者 PW + AdGuard Home + SmartDNS。

3、你需要 AdGuardHome + SmartDNS 是为了什么?把两个 SmartDNS 都填入 AGH 上游不觉得很蠢吗?

先来看看原始的PW使用方式:

/usr/share/pa$$vvall/rules
这个目录下有几张表
把网址和IP区分成 国内、国外、GXXList
配合 dnsmasq 以及 ChinaNG/pdnsd
实现目标地址的解析、分类
并决定直连还是走代理
这是pw最基础的运行方式

另外,PW 在运行时候,是默认劫持局域网 DNS 解析的
(更加具体地说是劫持dnsmasq,你如果启用了 PW,会忽略掉 DHCP and DNS 下的 DNS forwardings,转为 PW 下的 DNS 设置)


简而言之,PW 已经实现了网址的内外分类。



然后我们来看看两种搭配 AdGuard Home 时常见的"错误"使用方法:

你不能说这样不能用或者完全错误,
但我常常看见有人抱怨,一些国外网址解析到国内,或者国内地址解析到国外。
结果你又必须给 SmartDNS 或者 AdGuard Home 添加一些额外的列表和额外的复杂参数,
或者只能国内国外去广告选其一(图上没画出)

本身 PW 已经实现了网址的内外划分,
为了保证 DNS 解析内外正确,又必须在 SmartDNS 或 AdGuardHome 再次添加规则划分内外,
这是一种画蛇添足的行为。

不加规则 (black IP、chnlist、chnroute、GXXlist 之类的)
就直接把单个 AdGuard Home 和两个 SmartDNS 互相作为上下游,
只能用愚蠢来形容,
PW 都帮你分好内外了,你又回到原点再瞎搞一遍,不被抢答不被污染才见鬼咧



下面我们来看看,简单又正确地使用 PW + SmartDNS 的方法:

一个 SmartDNS 上游全部填国内 DNS,专门解析国内
第二 SmartDNS 上游全部填国外 DNS,专门解析国外
然后解析国外的 DNS IP,全部强制出国海淘海淘海淘海淘海淘海淘海淘海淘海淘海淘海淘海淘深造
就是这么简单!
除非不在 PW 分类中的网址,
基本上不会有国内网址解析到国外,或者国外网址解析到国内的现象,
偶有发生,你把相应网址在 PW 里面黑白名单设置下就 OK 了


双 AdGuard Home 也是这个思路:


或者配合 SmartDNS:


结构简单直观,每个组件各司其职,而且容易维护,
上不了的网在 PW 里面强制出国海淘海淘海淘海淘海淘海淘海淘海淘海淘海淘海淘海淘深造即可,
而且怎么可能出现国外网址被国内DNS抢答嘛

上游 DNS 网址贵精不贵多,国内的填几个快速的公共DNS和你本地DNS就好了
国外推荐使用 DNS over TLS 或者 DNS over Https


然而让我不解的是,
我不止一次在帖子或者讨论组里看到
有人在 AdGuardHome 填入两个 SmartDNS 作为上游,每次我脑子里都满是问号。

还有人在 Bootstrap DNS servers 填入十几个 IP,甚至填入网址形地址的,
求求你先搞清楚 Bootstrap DNS servers 是做什么的再填吧。


SmartDNS 第二 DNS 的出现,其中一个初衷也是为了避免做重复的工作,
通过 PW 早就弄好的规则,让内外解析彻底分离。
结果你们有人居然又捏回在一起,简直无语。



搞懂了基本原理,问题就变成如何简单又彻底地实现 AdGuard Home 内外解析分离,
既然 AdGuard Home 没有第二 DNS,那就装两个 AdGuard Home 嘛,
一个用 ipk 版本,一个用 Docker 版本,
然后分别设置上游为国内或国外 DNS 分别作为不可描述的国内外前端,
上不了的网址就简单粗暴填入不可描述黑名单,保存应用,立马自动变成强制用国外 DNS 解析,


结构我前面画出来了,简单高效容易维护。


有人估计会说,哎呀,Docker 版的 AdGuardHome 用不了啊,
我估计是他设置不对。
Docker 的配置有些人都没搞懂参数的意义,就按 hub.docker.com 上的说明乱填了
我建议找一些教程先看看 docker 部署时参数的意义,再进行设置

( 最基础的,部署参数,冒号 : 左边是外部端口或地址,右边是容器内部端口或地址,这个一定要知道 )

4、来吧,教你安装一个 Docker 版 AdGuard Home 并正常运行
下面以官方版AdGuardHome 作为例子

打开你的 SSH 工具,连上路由 ( 之前教程是 ksey 版,我改成官方版了,官方版毕竟版本新功能多,你要用其他版本随意,部署参数略有不同罢了 )docker pull adguard/adguardhome

docker run -d \
      --name adguardhome \
      -v /mnt/sda5/AGH_Docker:/opt/adguardhome/work \
      -v /mnt/sda5/AGH_Docker:/opt/adguardhome/conf \
      -p 3001:3000 \
      --restart always \
      adguard/adguardhome
         以上代码,不要着急复制黏贴直接输入,先看看下面的讲解
第一行的 docker pull adguard/adguardhome 只是为了拉取镜像,也可以不用输入这行,
直接输后面的命令,系统会帮你自动拉取最新的版本

后面的一起复制,然后在 SSH 上右键粘贴或者 shift + insert,回车
( \ 符号只是为了换行,让部署脚本看起来舒服些,你也可以删掉 \ 把这些命令写成一行 )

这里我只映射了一个 3001 端口到容器的 3000 端口,这端口这是为了等会登录网页端做后续设置
3000 端口一般已经给 ipk 版本的 AdGuardHome,所以这里我避开 3000 端口用 3001
( 端口冲突的话会建立容器失败,查询端口占用可以在 SSH 上输入 netstat -ntulp | grep 端口号 )
千万不要不明就里的按照官方版 AdGuardHome 说明把 53 443 853 什么的都映射过去,真的不用
( 你想把 53 443 什么的映射过去,估计也映射不了,会提示端口占用,无法建立容器 )
只需要映射一个登录设置界面的端口就行了

-v /mnt/sda5/AGH_Docker:/opt/adguardhome/work \
-v /mnt/sda5/AGH_Docker:/opt/adguardhome/conf \
这行两参数
/mnt/sda5/AGH_Docker 是外部地址,
根据你的需要和实际情况自己设置,不要一股脑照搬我的
怕出问题的话,
可以先 WinSCP 连上路由器,建立文件夹,并给上高点的权限比如 0755 甚至 0777

根据你的情况进行修改后,
SSH 输入命令,过一会就能创建好 AGH 的容器

然后地址栏输入路由器 IP:3001
这时候会提示你进行初始化设置

上图右边的端口号,全都是容器内部的端口,不用担心和路由器冲突,
点 下一步 设置好密码什么的,
设置完后路由器会跳转,不要管它,地址栏输入 路由器 IP:3001,
就能进入 Docker 版的 AdGuardHome 进行进一步的设置

设置出错的话,
就用命令或者 Docker 管理器停掉这个容器,
并到我们刚才部署设置的 -v 后面你自定义的文件夹,
编辑 AdGuardHome.yaml 里面的 bind_port:变成我们映射的内部端口,再重启容器。
或者直接删掉 AdGuardHome.yaml,
重启容器后,地址栏输入 路由器 IP:3001 会让你重新设置

记得上图我叫你记下的 IP 地址吗
我这里是 172.17.0.3
你的可能和我的不一样,如果不记得了,到 Docker 的管理界面下找找
我用 Portainer 管理 Docker,
在 Network list 下 点 Bridge 进去就能看见 AdGuardHome 容器的 IP

ps. 你要固定这个容器的IP也可以,SSH连上路由,先创建一个docker的subnet,docker network create --subnet=172.18.0.0/16 my_subnet然后部署的时候,就可以用这个新建的子网段,固定IP了
部署时候参数加上这两行
--network my_subnet \
--ip 172.18.0.53 \
创建成功后,这个容器就固定在了 172.18.0.53
(如果你要套娃SmartDNS作为AGH上游,Docker的AGH,上游DNS,要写子网段的网关,比如这里是172.18.0.1:



网页端进一步设置好 AdGuardHome,按设置说明填好
( DNS 设置里面,Bootstrap DNS 服务器 我也见有人瞎填,天哪那种人什么也不懂也可以写教程,
Bootstrap DNS 填入的地址是用来解析一些网址形 DoH / DoT 服务器的,
对,就是 上游 DNS 服务器 里面填入的一些不是 IP 的 DNS 服务器,先把他们把网址转换成 IP,
就这么一个功能,你填七八个有意义吗,
甚至还有人在 Bootstrap DNS 填入网址形的 DNS 服务器,我自己解析我自己?我看到时都惊呆了 )

简单设施好后,你可以 SSH 上路由器,
看看 Docker 版的 AdGuardHome 是否能正常解析网址
( 局域网因为 IP 隔离,无法直接访问 Docker 那个私网 IP,要让局域网的客户端直接访问 Docker 容器,又能写一个长篇 )
用 nslookup 测试域名 docker IP
或者 dig 测试域名 @ docker IP
比如我测试解析下百毒
就是 nslookup baidu.com 172.17.0.3
或者 dig baidu.com @172.17.0.3
( 因为我没改 Docker 版 AdGuardHome DNS 端口,所以默认 53 端口,dig 命令不用加 -p 端口号 )

好啦,加上用 ipk 安装的,
这样子你就已经有了两个 AdGuardHome
一个是 路由 IP : AdGuardHome 端口
一个是 AdGuardHome Docker 的 IP (我这里是 172.17.0.3)
你可以在两个 AdGuardHome 上分别设置国内国外的 DNS 服务器作为上游
一个 AdGuardHome 上游只填国内 DNS,用来专门解析 国内网址
一个 AdGuardHome 上游只填国外 DNS,用来专门解析 国外网址

然后来到 PW 的 DNS 设置,把两个 AGH 填进去就是了。
(不用 AGH 用双 SmartDNS 的类似,原理都是相通的)



就是这么简单
( 什么,都弄成这样了你还要用 china-dns-NG 或者 pdnsd,你点右上角 X 或者 ctrl + w 饶了我好吗?)


这两个 DNS 分别填到不可描述的国内国外 DNS 上,
上不了的国外网址直接填不可描述的黑名单,就会强制用国外 DNS 解析,
这样一般不用担心解析国外网址被国内 DNS 抢答污染什么的了,
都不用再另外给 SmartDNS 或者 AGH 单独设置什么 IP 黑名单 或者域名分组,
具体怎么玩我就不详细说了

我个人建议是 国内 DNS,
填入 三四个 你 ping 最快的 DNS,其中一个可以设置成本地宽带运营商的 DNS
国外 DNS,没必要设置太多,
设置两三个 tls 或者 HTTP DNS 就能有非常好的速度和抗污染能力,
记得在不可描述上把国外 DNS 的 IP 或 网址 强制走代理。
( 你要是不确定某 DNS 是否支持 tls,
可以上 http://coolaf.com/tool/port 查询 DNS 服务器的 853 端口 是否开放,开放的就是有 tls )

另外要注意一点,
Docker 上的 AdGuardHome 如果你想玩一些花要连接主路由,
不是直接填路由 IP,而是填 Docker 私网的路由 IP,
比如我这里就是 172.17.0.1

花样的玩法比如你可能觉得 AdGuardHome 的并行查询和 IP 优选不如 SmartDNS 快,
比如 Docker 上的AdGuardHome 你用来解析国内 DNS,
可以设置上游为解析国内 DNS 的那个 SmartDNS,DNS 地址为 172.17.0.1:SmartDNS 端口号,
IPK 安装的版本,用来解析国外 DNS,上游填入 路由IP: SmartDNS 解析国外网址的端口号,
这样可以实现两个 AdGuardHome 各自设置上游为 SmartDNS 的两组 DNS,
分别用来解析国内国外,如果这样玩,新版 AGH 里面记得把缓存设置成 0
不过讲真我觉得AdGuardHome 已经很高效了,玩不玩花看你自己。

如果不玩花样,AdGuardHome DNS 设置填入多个上游,
记得开启 AdGuardHome 的 Parallel Requests 并行请求,
或者勾上 Fastest IP Address 最快的 IP 地址,效果和 SmartDNS 的优选 IP 差不多

5、其他一些需要注意的关键和题外话
不用 ipk 版本,也可以一个镜像弄两个 AdGuardHome 容器,
一样原理,但 PW 某些版本解析国外网址只能选本地 7913 端口不好自定义。
都用 Dockers 的话,部署前先关掉不可描述的 china-dns-NG 或者 pdnsd 解除 7913 端口占用,
解析国外网址的那个 AdGuardHome 容器,
你得映射 7913 端口 到 容器的 网址解析端口,默认是 53。
———— 这是 Docker 默认网络模式 Bridge 的玩法。

用 Dockers 不用映射端口的也可以,
容器的部署参数去掉端口映射的参数,
直接采用 --network host 模式,
这样玩的话最好先准备一个预设好的 AdGuardHome.yaml,
里面最重要是预设好两个端口号,
把这个文件丢到容器的设置目录,再启动容器,否则连控制台都进不去。
用 host 网络模式,容器 类似直接在宿主机上装 app,
好处是少一层 nat,效率稍高一点点。我没对比过,也不知道能高多少。
有点扯远了,我个人觉得没必要弄这么复杂,感兴趣自己研究。


差点忘了还有几个没说的:

系统防火墙的自定义设置,把
# 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这两行前面的 # 删掉,保存并应用,没有 # 就不用管了
( 这两条的意思是,局域网内所有客户端对外的 53 端口查询请求,都劫持指向路由器 )
( 之前教程我叫你们加 # 注释掉,是我弄错了,万分抱歉 )

如果有 Turbo ACC,里面的 “DNS 加速”,关掉
( 没记错的话,如果点勾选上开启并应用,会自动帮你在系统的 DHCP and DNS 设置里填上 路由 IP:5335 )

系统的 DHCP and DNS 设置里
上游 DNS (DNS Forwardings),填入解析国内网址的DNS,比如我用 SmartDNS 的第一组解析国内网址,就填 路由IP:6053
4-15 版之后的PW没有国内DNS的设置项了,
会调用这里的设置


最后说几句题外话
再重复说次,我个人是挺讨厌回帖可见的
有些写得很差的教程必须要你回复就算了,还收费,感觉不舒服
但论坛又允许这样玩,最终很可能的结果就是招致大量无意义回复,
没有有效的反馈,帖子不是因为优秀和需要讨论被顶上来,劣币驱逐良币


我不是大神,肯定有什么认知浅显甚至错误的地方,
事情也多,不会经常逛论坛
真正的大神也有说,瞎搞 DNS 真没必要
如果私信求助我的话很可能一两个星期才回复
遇到问题最好自己多搜索,触类旁通,重点是搞清楚原理和思路,不要人云亦云










lyvw@qq.com 发表于 2020-7-15 19:04

绑定,不明所以,

zaj6773 发表于 2020-7-15 19:12

看的还是头晕

lriigiht 发表于 2020-7-15 19:20

zaj6773 发表于 2020-7-15 19:12
看的还是头晕

这个是初版教程,过几天有时间的话我估计会重新排版,让观感好点,尽量让人不会因为看见长长一帖子直接劝退。

如果对 Docker 稍有了解,文章的实际核心很简单的

bad_men 发表于 2020-7-15 19:34

高手就是高手,一下子就簡單化了

maoli 发表于 2020-7-15 19:36

看不懂,感觉很厉害https://www.right.com.cn/forum//mobcent//app/data/phiz/default/03.png

xiaohuwan 发表于 2020-7-15 20:19

感谢分享,学习一下

fyi2000 发表于 2020-7-15 20:25

请先理解SmartDNS+AdGuardHome的作用再来谈怪不怪

不谈AdGuardHome最重要的DNS封锁清单,却只谈AdGuardHome的DNS代理,无异舍本逐末

六七五 发表于 2020-7-15 21:20

不明所以燃

lriigiht 发表于 2020-7-15 21:22

fyi2000 发表于 2020-7-15 20:25
请先理解SmartDNS+AdGuardHome的作用再来谈怪不怪

不谈AdGuardHome最重要的DNS封锁清单,却只谈AdGuardH ...

所以 SmartDNS + AdGuardHome 的作用是什么?请指教

每次看到一些人在帖子里给 AdGuardHome 填入两个 SmartDNS 做上游,我脑子里满是问号

熊孩子王 发表于 2020-7-16 08:22

马克,持续关注楼主进展

dfbb9217 发表于 2020-7-16 12:59

本帖最后由 dfbb9217 于 2020-7-16 14:23 编辑

国内我还是用的运营商的DNS,国外用谷歌和OPENDNS的。IBM那个9999,还有1111以及微软的DNS,国内用不咋样。LIST用的一个油管的,还有一个koolproxy的。自定义过滤功能不错

CORE2020 发表于 2020-7-16 13:00

我ad只负责去广告,替换53成为dnsmasq下游,smartdns做解析

fyi2000 发表于 2020-7-19 15:07

serino 发表于 2020-7-15 21:22
所以 SmartDNS + AdGuardHome 的作用是什么?请指教

每次看到一些人在帖子里给 AdGuardHome 填入两个...

顾名思义,一个强在DNS,另一个强在AD,虽然AdGuardHome最新版添加了SmartDNS的Fastest IP,但是最大的问题是虽然你可以弄出两套DNS代理,但是DNS封锁清单却无法明确划分国内国外,所以我实在看不出两套AdGuardHome究竟有何好处

此外AdGuardHome占用内存和处理器时间均比SmartDNS高出很多很多很多,所以我不认为AdGuardHome+AdGuardHome能比SmartDNS+AdGuardHome高明多少,何况你的方法也不适用于多数人所使用的硬路由

如果你可以接受只有一个DNS封锁清单(anti-AD),那麽SmartDNS反而可以取代AdGuardHome,其实Adbyby Plus+也只用了一个DNS封锁清单
广告屏蔽大师 Plus + 可以全面过滤各种横幅、弹窗、视频广告,同时阻止跟踪、隐私窃取及各种恶意网站
Plus + 版本可以和 Hosts 结合方式运行,过滤广告不损失带宽
anti-AD项目地址:https://github.com/privacy-protection-tools/anti-AD以上适用于chongshengB大神的老毛子

fyi2000 发表于 2020-7-19 15:20

每次看到一些人在帖子里给 AdGuardHome 填入两个 SmartDNS 做上游,我脑子里满是问号通常不会这麽做,但也不是不能
bind :6054             -group local
bind :6055             -group china
bind :6056             -group oversea
bind :6057             -group oversea-tls重点是合不合理,我也看了不少SmartDNS + AdGuardHome教程,并没有发现你所说的填入两个 SmartDNS 做上游
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: AdGuardHome+SmartDNS上游下游? 教你装两个AdGuardHome配合PW用正确的姿势上网深造