本文共4205字,快速阅读仅需5分钟。

鉴于我们处于这特殊的网络环境下,如果单纯使用国内DNS时,解析得到的结果会有些不准确,可单纯使用国外DNS时,又会导致解析过程太慢,两种方式都存在着其短板。

那么有没有办法“鱼和熊掌兼得”呢?也就是说,如果我们能使得国内与国外的域名分流解析,当访问国内网站时用国内的DNS服务器解析;访问国外网站时又用国外的DNS服务器解析。

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

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

一、明确目标

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

  1. 使用加密的DNS协议;(例如DoH、DoT、DoQ等协议)
  2. 解析国内域名时,使用国内的加密DNS服务;(例如DNSPod阿里DNS
  3. 解析国外域名时,使用国外的加密DNS服务。(例如GoogleCloudflare

二、解决思路

其次,要满足上面的条件,我们用下面的思路来实现

AdGuard Home 简称(ADGH)是 AdGuard 开源的一个私人 DNS 服务端,支持DoT、DoH、DoQ等多种DNS加密协议,可以将其部署于网关,让局域网内其他设备享受到加密的DNS服务。
Docker是一个开源的应用容器引擎,可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,容器是完全使用沙箱机制,相互之间不会有任何接口(类似iPhone的APP),更重要的是容器性能开销极低。
  1. 解决上述条件1,可以使用AdGuard Home即可实现;
  2. 解决上述条件2,可以选择通过Openwrt全部默认流量走国内,并让国内的域名,用第一套AdGuard Home通过国内加密DNS服务进行解析;
  3. 解决上述条件3,同时在全部流量中筛选是否有是国外流量,若有,则不走国内,而走国外。再让国外的域名,用第二套AdGuard Home国外的加密DNS服务进行解析;
  4. 可以通过Docker分别安装两套AdGuard Home,让其相互独立,互不干扰;
  5. 默认所有解析优先用国内DNS,避免影响国内网站,优先保障访问国内网站正常。

三、处理方案

综上,要同时实现3种条件,我们需要用到的工具是:

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

两个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

  1. 初始化设置
  • 进入 http://路由器ip:3000/
  • 设置时需要改两个端口:80(我改成1080),53(我改成1053)
  • 初始化完成后,打开http://路由器ip:1080即可进入主界面。
  1. 将此AdGuard Home的上游DNS设成国内的加密DNS服务
  • 设置-DNS设置-上游DNS服务,清除掉他自带的内容
  • 可以填入https://dns.alidns.com/dns-queryhttps://doh.pub/dns-query (仅供参考);
  • 解析方式选择“并行请求”;
  • 下方Bootstrap DNS服务器里清除掉他自带的内容;
  • 填入你自己本地ISP提供的DNS地址;
  • 不知道是多少的话,你可以填入114.114.114.114(仅供参考),点击”应用“保存设置。
  1. 把此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

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

5.检测配置是否生效

设置到这里,没有出错的话,你就已经成功实现了DNS分流了;

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

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

五、写在最后

我过去曾写过一篇名为《OpenWrt在docker下安装AdGuardhome》的文章。实话实说,那个不是教程,只是我的一篇笔记,写的很乱,而且只适用在基于ARM架构的斐讯N1盒子上。

如果贸然按那个步骤去做,有可能连安装都很费劲,更别提正确设置。但后来,我却看到那篇文章的访问量越来越多了起来,为了不误导别人,于是我又写下了这篇文字,详细叙述我的理解和正确步骤。

当然了,实现国内外流量分流并解析的办法有很多种。本文只介绍了在有软路由或者旁路由情况下,是实现该目地最简单,也是最小白的一种方式

最后,本人能力一般,水平有限。如有不足之处,还请各位谅解。