Docker安装双AdGuardHome在OpenWrt分流解析DNS(转自牛牛数码驿站)

教程类 · 2022-10-19

鉴于我们处于这特殊的网络环境下,如果单纯使用国内DNS时,解析得到的结果会有些不准确,可单纯使用国外DNS时,又会导致解析过程太慢,两种方式都存在着其短板。那么有没有办法“鱼和熊掌兼得”呢?也就是说,如果我们能使得国内与国外的域名分流解析,当访问国内网站时用国内的DNS服务器解析;访问国外网站时又用国外的DNS服务器解析。

这样通过不同的DNS服务进行解析,可以使我们的DNS解析变得又快、又准。其实解决这个问题很简单,让我们一起往下看。

Docker安装双AdGuardHome在OpenWrt分流解析DNS

一、明确目标
首先,要明确,想要实现国内外分流解析这一场景,我们必须同时实现3个目标

使用加密的DNS协议;(例如DoH、DoT、DoQ等协议)
解析国内域名时,使用国内的加密DNS服务;(例如DNSPod和阿里DNS)
解析国外域名时,使用国外的加密DNS服务。(例如Google和Cloudflare)
二、解决思路
其次,要满足上面的条件,我们用下面的思路来实现。

AdGuard Home 简称(ADGH)是 AdGuard 开源的一个私人 DNS 服务端,支持DoT、DoH、DoQ等多种DNS加密协议,可以将其部署于网关,让局域网内其他设备享受到加密的DNS服务。

Docker是一个开源的应用容器引擎,可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,容器是完全使用沙箱机制,相互之间不会有任何接口(类似iPhone的APP),更重要的是容器性能开销极低。

解决上述条件1,可以使用AdGuard Home即可实现;
解决上述条件2,可以选择通过Openwrt全部默认流量走国内,并让国内的域名,用第一套AdGuard Home通过国内加密DNS服务进行解析;
解决上述条件3,同时在全部流量中筛选是否有是国外流量,若有,则不走国内,而走国外。再让国外的域名,用第二套AdGuard Home国外的加密DNS服务进行解析;
可以通过Docker分别安装两套AdGuard Home,让其相互独立,互不干扰;
默认所有解析优先用国内DNS,避免影响国内网站,优先保障访问国内网站正常。
三、处理方案
综上,要同时实现3种条件,我们需要用到的工具是:

一台通过Docker安装了两个AdGuard Home的Openwrt系统的软路由

两个AdGuard Home分别解析国内和国外流量,并默认走国内;若检测到有国外,则不走国内而走国外。

四、具体步骤
1、安装第一个用于解析国内域名的AdGuard Home
复制下面的命令输入进openwrt的shell;
建议:一行输入完,回车,再输入下一行;
下面的命令适用于X86架构的openwrt;
如果是ARM架构,需要修改容器的目录,请自行在OpenWrt里查看挂载点

创建容器目录

mkdir -p /mnt/sda3/adguardhome/confdir
mkdir -p /mnt/sda3/adguardhome/workdir

安装并启动容器

docker pull adguard/adguardhome
docker run --name adguardhome \
-v /mnt/sda3/adguardhome/workdir:/opt/adguardhome/work \
-v /mnt/sda3/adguardhome/confdir:/opt/adguardhome/conf \
--restart always \
--net host \
-d adguard/adguardhome

2、设置该用于国内域名解析的AdGuard Home
初始化设置
进入 http://路由器ip:3000/
设置时需要改两个端口:80(我改成1080),53(我改成1053)
初始化完成后,打开http://路由器ip:1080即可进入主界面。
将此AdGuard Home的上游DNS设成国内的加密DNS服务。
设置-DNS设置-上游DNS服务,清除掉他自带的内容
可以填入https://dns.alidns.com/dns-queryhttps://doh.pub/dns-query (仅供参考);
解析方式选择“并行请求”;
下方Bootstrap DNS服务器里清除掉他自带的内容;
填入你自己本地ISP提供的DNS地址;
不知道是多少的话,你可以填入114.114.114.114(仅供参考),点击”应用“保存设置。
把此AdGuard Home服务端口(1053)设置为dnsmasq的上游
打开OpenWrt的”网络“->”DHCP/DNS”
“DNS转发”设为 127.0.0.1#1053
此时配置正确的话,你已经可以访问国内网站了,但是还访问不到国外网站。
3、安装第二个用于解析国外域名的AdGuard Home
复制下面的命令输入进openwrt的shell;
建议:一行输入完,回车,再输入下一行;
下面的命令适用于X86架构的openwrt;
如果是ARM架构,需要修改容器的目录,请自行在OpenWrt里查看挂载点

创建容器目录

mkdir -p /mnt/sda3/adguardhome/confdir_gfw
mkdir -p /mnt/sda3/adguardhome/workdir_gfw

安装并启动容器

docker run --name adguardhome_gfw \
-v /mnt/sda3/adguardhome/workdir_gfw:/opt/adguardhome/work \
-v /mnt/sda3/adguardhome/confdir_gfw:/opt/adguardhome/conf \
--restart always \
--net host \
-d adguard/adguardhome

4.设置该用于国外域名解析的AdGuard Home
初始化设置
进入 http://路由器ip:3000/
设置时需要改两个端口:80(我改成1081),53(我改成5335)
初始化完成后,开http://路由器ip:1081端口即可进入主界面。
将此AdGuard Home的上游DNS设成国内的加密DNS服务
设置-DNS设置-上游DNS服务器,清除掉他自带的内容;
建议填入https://dns.google/dns-queryhttps://dns.cloudflare.com/dns-query
解析方式选择“并行请求”;
下方Bootstrap DNS服务器里清除掉他自带的内容后;
建议填入185.222.222.222和45.11.45.11(仅供参考),点击”应用“保存设置。
再到科学插件里设置使用此AdGuard Home的DNS
模式为中国列表以外,DNS是用pdnsd通过TCP节点请求DNS;
然后填入127.0.0.1#5335或者选择基于5335端口的dns的选项;
更多关于科学插件的事,这里就不说了,请自行Google;
配置正确的话,你国内和国外网站已经都可以正常访问了。
5.检测配置是否生效
设置到这里,没有出错的话,你就已经成功实现了DNS分流了;

可以进入刚才你设置好的管理页面:http://路由器ip:1080和http://路由器ip:1081查看;

如果访问国内和国外网站后,查询日志里面都有了解析的记录,那就说明成功分流。

  1. 1 2023-10-20

    555

  2. 1 2023-10-20

    1

  3. 1 2023-10-20

    1

    1. 1 2023-10-20
      @1

      555

    2. 1 2023-10-20
      @1

      1

  4. 1 2023-10-19

    555

    1. 1 2023-10-20
      @1

      555

    2. 1 2023-10-20
      @1

      1

    3. 1 2023-10-20
      @1

      1

      1. 1 2023-10-20
        @1

        555

Theme Jasmine by Kent Liao