OpenWrt配置双AdGuard实现DNS国内外分流

从去年改造了家里的网络到现在都很稳定,但是最近自建的出墙偶尔抽风,我一直使用的Hysteria协议,发现有版本升级,于是升级了服务端,最后发现还是不丝滑,发现是我现在用的openwrt中的passwall插件不支持端口跳跃功能, 所以在恩山论坛找了个最新的OpenWrt固件进行安装,前段时间刷到了一个利用双AdguardHome分流国内外DNS解析,说这样可以防DNS污染,反正这次要升级OpenWrt,所以就折腾了一下,为了保持以前服务正常使用,我直接重新启动了一个OpenWrt,等觉得没问题再销毁全部切换过来,本篇记录自己踩的坑,当水篇文章了~。

前提准备

1、 下载合适的Op固件:我使用的是恩山bleach1991的 高大全/精简版 Openwrt x86 6.1内核 软路由固件

2、 转换ESXI虚拟机磁盘软件:StarWind V2V Image Converter

开始配置

关于安装OpenWrt就不在这里列图了,安装好后建议先参考我另外的一篇文章扩容磁盘,OpenWrt 扩容磁盘方案及实操

我采用的是直接docker里面安装双AdguargHome,网上很多方案都是一个使用Op插件自带的AdguargHome,直接接管国内的DNS解析,为了维护方便,我直接全部使用docker启动。

规划如下:

  • 国内组:udp:15335(DNS解析)、tcp:3001(Ad管理端)
  • 国外组:udp:15336(DNS解析)、tcp:3002(Ad管理端)

安装国内组

  1. 进入OP管理端,依次点击:系统 -> TTYD 终端,进入shell窗口,直接运行下面docke命令启动国内组AdguardHome:
代码语言:javascript
复制
docker run --name adguardhome1 \
    --restart unless-stopped\
    -v /opt/adguardhome1/work:/opt/adguardhome/work\
    -v /opt/adguardhome1/conf:/opt/adguardhome/conf\
    -p 15335:53/udp\
    -p 15335:53/tcp\
    -p 3001:3000/tcp\
    -d adguard/adguardhome:latest

启动成功后访问http://{OpenWrt地址}:3001,设置帐号密码,注意安装的时候网页管理端口保持3000、DNS服务保持53,因为容器映射的是这2个端口

安装好登录AdguardHome,依次点击顶部导航设置 -> DNS设置 :

上游DNS服务填下面的:

代码语言:javascript
复制
tls://dns.pub
tls://dns.alidns.com
https://doh.pub/dns-query
https://dns.pub/dns-query
https://dns.alidns.com/dns-query

勾选并行请求

Bootstrap DNS 服务器填下面的:

代码语言:javascript
复制
你本地默认的运营商DNS(比如四川电信是:61.139.2.69)
114.114.114.114

如果没有使用Ipv6,勾选禁用Ipv6地址的解析

DNS缓存配置根据自己分配的空间自行设置,我这里直接保持默认配置是4194304字节

点击保存即可

依次点击顶部导航 过滤器设置 -> DNS黑名单:

添加一些自己网上找的,这里列几个我用的,根据自己需要的选择:

代码语言:javascript
复制
easylistchina:https://easylist-downloads.adblockplus.org/easylistchina.txt
adgk手机去广告:https://raw.githubusercontent.com/banbendalao/ADgk/master/ADgk.txt
anti-ad-easylis:https://anti-ad.net/easylist.txt
1024_hosts:https://raw.githubusercontent.com/Goooler/1024_hosts/master/hosts
easyprivacy:https://easylist-downloads.adblockplus.org/easyprivacy.txt
ad-wars:https://raw.githubusercontent.com/jdlingyu/ad-wars/master/hosts

不建议添加太多,越多误杀越严重!

至此国内组安装完毕。

安装国外组

  1. 进入OP管理端,依次点击:系统 -> TTYD 终端,进入shell窗口,直接运行下面docke命令启动国外组AdguardHome:
代码语言:javascript
复制
docker run --name adguardhome2 \
    --restart unless-stopped\
    -v /opt/adguardhome2/work:/opt/adguardhome/work\
    -v /opt/adguardhome2/conf:/opt/adguardhome/conf\
    -p 15336:53/udp\
    -p 15336:53/tcp\
    -p 3002:3000/tcp\
    -d adguard/adguardhome:latest

启动成功后访问http://{OpenWrt地址}:3002,设置帐号密码,注意安装的时候网页管理端口保持3000、DNS服务保持53,因为容器映射的是这2个端口

安装好登录AdguardHome,依次点击顶部导航设置 -> DNS设置 :

上游DNS服务填下面的:

代码语言:javascript
复制
tls://1.1.1.1/dns-query
tls://dns.google
https://dns.google/dns-query
tls://dns11.quad9.net
https://dns11.quad9.net/dns-query

勾选并行请求

Bootstrap DNS 服务器填下面的,如果上游DNS都是设置的加密DNS,这个可以不填:

代码语言:javascript
复制
9.9.9.10
8.8.8.8

如果没有使用Ipv6,勾选禁用Ipv6地址的解析

DNS缓存配置根据自己分配的空间自行设置,我这里直接保持默认配置是4194304字节

点击保存即可

依次点击顶部导航 过滤器设置 -> DNS黑名单:

  • 国外一般DNS不会污染,所以不需要添加其他的,就开启自带的AdGuard DNS filter即可。

至此国外组安装完毕。

配置 OpenWrt

默认openwrt会使用自带的Dnsmasq进行解析,所以我们要直接把自带的DNS转发到我们的国内组,即127.0.0.1#15335

依次点击openwrt左侧导航栏:网络 -> DHCP/DNS,设置下面说的选项:

  1. 基本设置:DNS转发设置为 127.0.0.1#15335 ,取消仅本地服务的√
  2. HOSTS和解析文件:忽略解析文件打√
  3. 高级设置:没有使用Ipv6就把禁止解析Ipv6 DNS记录打√,DNS查询缓存设置为0

配置 Passwall

我使用的passwall,对接其他出墙插件大致差不多的,大概就是把使用DNS的地方使用 127.0.0.1#15536

依次点击passwall -> 基本设置 -> DNS :

  • 过滤模式:通过UDP请求DNS
  • 远程DNS:127.0.0.1#15336

依次点击passwall -> 规则列表 -> 直连列表 :

  • 将国内组使用到的上游DNS的域名IP都加入到直连里面,以免又跑到国外DNS去解析了。

配置主路由(可选)

如果你的OpenWrt只是作为旁路由运行,并且要想内网所有设置都先经过AdGuardHome进行过滤,那么还需要最后一步在分发DHCP的路由器上配置DNS,

我这里主路由是RouterOS,所以我使用winbox登录到RouterOS,将DNS修改为OpenWrt的IP地址,这样就可以让内网分配IP的设备都经过AdGuardHome。

效果一览

国内组:

国外组:

说到最后

其实AdGuardHome现在已经无法屏蔽了PC端的视频广告了,我找了很多规则都无法实现,但是手机端的广告是可以屏蔽的,不要对这个抱有太大的希望,做为一个DNS缓存器确实能达到很好的效果,这样做了国内外分流解析,真能防止DNS污染了吗???