Skip to main content
德胜云
  万速智能9 > 域名

没想到「OpenWrt使用Docker搭建国内外分流DNS服务器」openwrt部署clouddrive2openwrt部署alist

2024-04-22 18:46:33 浏览:

没想到「OpenWrt使用Docker搭建国内外分流DNS服务器」openwrt部署clouddrive2openwrt部署alist

作者:Kation

为什么要国内外DNS分流

由于不可描述的原因,使用国内DNS服务器解析国外域名时,可能会返回错误的IP地址。

目前有很多种解决方法。

使用国外DNS服务器

这个还是会被污染

使用国外DoH、DoT技术

基本上无法访问

通过代理使用国外DNS服务器

可行,但是

那么,能不能国内域名使用国内的DNS服务器,国外域名使用国外的DNS服务器呢?

答案是可以的,其实网上有多种解决方案,我这里介绍其中一种。

DNS服务器

TechnitiumSoftware的DnsServer是一个由C#编写的开源DNS服务器,支持Windows、Linux系统,有Docker镜像。

你问我为什么选它,我的答案是,因为我会C#

这个DNS服务器本身是没有分流功能的,但是其支持插件,我为其编写了一个分流插件

当检测到域名是的国外的时候(配置的列表),直接用国外的DNS服务器解析

先使用默认DNS服务器(一般配置国内的几个DNS服务器)解析

解析出来后,判断IP地址是不是非法的(配置的列表,里面一般是内网网段以及GFW喜欢设置的网络黑洞网段)

不是非法的,再通过GEO数据库,判断IP地址是不是国内的

如果是非法的或者不是国内的,再使用国外的DNS服务器解析一遍

可以配置使用代理访问国外DNS服务器,一般都要使用代理

源码地址:TechnitiumSoftware/DnsServer: Technitium DNS Server (github.com)

插件源码地址:Kation/DnsServer: Technitium DNS Server (github.com)

前置条件

废话不多说,以我家里的网络环境为例,搞它

由于我还不会制作OpenWrt的插件,所以先用Docker来运行DNS服务器

OpenWrt需满足

OpenWrt安装了Docker插件

安装了内核模块kmod-macvlan

Docker网络配置

如果你的网络启用了IPv6,那么请先到这里,把“IPv6 ULA”前缀记下,一般是OpenWrt自动生成的

然后我们进入Docker的网络管理界面,点击“新建

广告
人生最低谷时,冷艳女上司让他迎来人生新的机会!
×

网络名称不能重复

驱动器选择“MAC VLAN

基设备选择OpenWrt本地网桥,一般为“br-lan

模式默认保持桥接

子网输入一个新的网段,不能与现有网段重复

网关输入该网段内的一个IP,为本OpenWrt设备的IP地址

IP范围与子网相同即可

如果使用了IPv6网络,则勾选“启用IPv6

IPv6子网,我的IPv6 ULA地址是“fdbf:6008:a32f::/48”,在a32f后,添加一个不重复网段,例如我的239,48掩码改为64,我的例子为“fdbf:6008:a32f:239::/64”,注意冒号不能少也不能多

IPv6网关将/64改为1即可,我的例子为“fdbf:6008:a32f:239::/1

OpenWrt网络配置

点击菜单里的接口时,会弹出一个对话框,点击“继续”,此时会看到新增了一个网络“DOCKER_你的Docker网络名称

如果没有使用IPv6,则不需要更多配置,跳到下一步骤。

点击编辑新的网络,在IPv6地址栏里填入创建Docker网络时填入的网关地址,点击保存。

然后在路由管理界面静态IPv6路由选项卡点击“添加”。

接口选择对应生成的Docker接口

目标填入创建Docker网络时的IPv6子网

网关填入创建Docker网络时的IPv6网关

保存后,OpenWrt的网络就配置好了

部署DNS服务器

创建数据存储文件夹

在开始部署前,先确定你的OpenWrt数据存储位置

如果你的OpenWrt装有Diskman插件,进入Disk man管理界面,查看挂载点

可以看到,我的OpenWrt内有一块nvme固态硬盘,其中有个118G的分区,挂载在路径/mnt/storage

没有Diskman的话,通过ssh或在线终端功能连入OpenWrt,执行lsblk命令

同样能看到一个118G的分区,挂载在路径/mnt/storage

通过ssh或在线终端功能连入OpenWrt,执行命令

执行cd /mnt/storage进入挂载点

执行mkdir dnsserver创建数据文件夹

使用OpenWrt界面部署,不支持IPV6

在Docker的容器管理界面点击新增

容器名称填入不重复的名称,例如dnsserver

Docker镜像填入technitium/dns-server:latest

重启策略选择Always

网络选择上文中新创建的macvlan网络

IPv4地址填写的IP地址必须属于网络子网

环境变量填入TZ=Asia/Shanghai

绑定挂载填入上文创建的数据文件夹路径,加上“:/etc/dns”,我这里为“/mnt/storage/dnsserver:/etc/dns

点击提交即可拉取镜像并创建出DNS服务器容器

使用控制台命令部署,支持IPv6

由于OpenWrt的Docker管理界面添加容器时不能指定IPv6地址,所以只能通过ssh或在线终端功能连入OpenWrt,使用命令行执行命令添加容器

--name参数为容器名称

--net参数改为上文新创建的macvlan网络名称

--ip参数改为你的网络子网IP地址

--ip6参数改为你的网络IPv6子网IP地址,不能为网关地址

-v参数中的“/mnt/storage/dnsserver”替换为上文创建的数据文件夹路径

docker run

-d

--name=dnsserver

--net=app

-e TZ="Asia/Shanghai"

--restart=always

--ip 192.168.239.1

--ip6 fdbf:6008:a32f:239::2

-v /mnt/storage/dnsserver:/etc/dns:rw

technitium/dns-server

执行命令即可拉取镜像并创建出DNS服务器容器

容器启动完毕后,你应该能在电脑上ping通IP地址

配置DNS服务器

在浏览器内输入容器IP地址,加上端口号5380进入DNS服务器管理界面

关闭DNS校验

由于不可描述的原因,取消勾选Enable DNSSEC Validation

修改默认DNS服务器

填入几个国内常用的DNS服务器

例如119.28.28.28119.29.29.29223.5.5.5

如果你填写了多于2个的DNS服务器地址,那么改一下并发查询数

安装分流插件

先到https://github.com/Kation/DnsServer/releases下载最新的插件压缩包

然后到App选项卡点击Install按钮

App Name随便填

App Zip File选择刚才下载的压缩包

点击Install进行安装

安装好后在列表页点击Config按钮进行配置

将内容替换为自己的配置,点击Save保存

配置说明

这里可能不是最新的配置说明,最新配置说明请看下载页

重点关注nameServers配置,如果你的代理服务器仅支持常规端口,请只配置Https类型的DNS服务器

proxy配置改为你的代理服务器

什么值得买的JSON展示太丑了,大家去看下载页的示例

测试DNS

配置完毕后,可以在电脑上使用nslookup命令测试DNS服务器工作是否正常

可以看到,已经正常返回结果

使用国内DNS服务器的结果

修改下发的DNS服务器地址

最后一步,修改OpenWrt的接口下发的DNS服务器地址为容器IP地址

如果你不是使用OpenWrt作为DHCP服务器,请自行设置,你应该会的

在OpenWrt接口修改界面,DHCP选项填入“6,你的容器IP地址

如果使用了IPv6,还需要修改IPv6的DNS服务器地址

通告的IPv6 DNS服务器填入容器的IPv6地址

好了,到此全部配置完毕,家里的设备都能正常解析DNS地址了

结语

有人可能要问,既然都有代理了,为什么不用代理提供的DNS服务?比如OpenClash

我这么做当然是有原因的

OpenClash提供的DNS服务会有点问题,无法指定使用国内的DNS服务器来解析代理服务器地址

指定国外DNS服务器的话,解析代理服务器地址需要连上代理,然而代理服务器地址还没解析出来,就……

而且用OpenClash的DNS解析,国内某些手机APP的DNS解析有时候好慢,非常影响体验,收到来自老婆的“关爱”

现在用了DNS分流就简单了,OpenClash直接配置本地DNS劫持停用,只干代理的活

查看文章精彩评论,请前往什么值得买进行阅读互动

没想到「OpenWrt使用Docker搭建国内外分流DNS服务器」openwrt部署clouddrive2openwrt部署alist

  • 满满干货「硬干货!京东云域名注册及备案操作指南」京东云绑定域
  • 满满干货「外贸及独立站域名注册选择」外贸独立站怎么运营外贸独
  • 真没想到「如何购买域名?」如何购买域名和备案的区别如何购买域
  • 学会了吗「如何查询域名是否被注册?」如何查询域名是否已经被注
  • 越早知道越好「如何查询企业是否具有ICP备案?几种常见的ic