在Linux上使用CoreDNS搭建简易的DoT服务器

发布于 6 天前  14 次阅读


近期本人有自定义大量域名解析的需求,虽改动「Hosts」文件可以实现此功能,但如此灵活性欠佳,且不便于在未解锁系统分区的手机上使用,因而萌生了自建DNS的想法。

由于境内服务器对53端口有限制,使用基于TLS加密的「DNS over TLS」协议来作为「传统DNS」的替代;「CoreDNS」是个开源且简便的DNS工具,正好满足我简单的需求。


一、工具下载

在系统中创建一个名为「coredns」的目录,并cd至其中:

mkdir coredns
cd coredns

在官方提供的GitHub Releases页面找到对应系统的版本,复制链接,

直接wget下来(x64版)并以「coredns.tgz」命名:

wget -O coredns.tgz https://github.com/coredns/coredns/releases/download/v1.10.0/coredns_1.10.0_linux_amd64.tgz

解压下载的「coredns.tgz」压缩包到当前目录:

tar zxvf coredns.tgz -C ./

解压后会获得一个名为「coredns」的可执行文件,既是其本体,非常简单。

尝试运行一下:./coredns,可能有如下输出:

.:53
CoreDNS-1.10.0
linux/amd64, go1.19.1, 596a9f9

此时意味着可以运行,但不能正常解析,因为未有配置文件。

若提示53端口被占用,可暂且不理,因为用不到ㄟ( ▔, ▔ )ㄏ。

二、工具配置

CoreDNS的大部分功能由插件实现,以下所提插件为本体自带;

因采用TLS,需先申请SSL证书。

1. 创建配置文件

在CoreDNS执行文件的同一目录中,用vim创建一个名为「Corefile」文件:

vim Corefile

按「i」开始编辑,输入以下配置:

tls://.:853 {
    #「tls」后为证书和密钥文件路径,可自定义
    tls tnpc.crt tnpc.key
    #第二个「hosts」为hosts文件路径,可自定义
    hosts hosts . {
        fallthrough 
    }
    #「forward .」后为上游DNS地址,可自定义
    forward . tls://106.55.127.112:853 {
        tls_servername dns.pub
    }
    log
    errors
}

解释:

tls://使用TLS协议,.:853对所有域名监听853端口;

tls调用tls插件,引入SSL证书;

hosts调用hosts插件,按hosts文件解析,fallthrough若hosts文件中无则以下面配置的方法解析;

forward调用forward插件,设置上游DNS,我在此选择腾讯DNSPod的「dns.pub」作为上游,其地址为106.55.127.112且采用TLS协议及853端口,tls_servername后为其主机名;这里也可以使用DNS协议的DNS,只需在forward .后写上地址即可,可写多个同或不同协议的,如forward . 119.29.29.29:53 223.5.5.5:53 tls://106.55.127.112:853

log调用log插件,在控制台上输出日志;errors调用errors插件,在控制台上输出错误;

最后按下「Esc」并输入:wq再「回车」保存推出;

2. 启动测试

前面配置了引入hosts文件,在此创建一个vim hosts,方便自定义解析;

启动程序:

./coredns
#或coredns -conf ./Corefile
#可以-conf自定义配置文件路径

启动后打开另一终端窗口,使用kdig测试:

若提示找不到kdig命令,可先用包管理器安装knot-dnsutils

kdig -p 853 @服务器地址 +tls tnpc.space

输出将包含如下内容:

;; QUESTION SECTION:
;; tnpc.space.                  IN      A

;; ANSWER SECTION:
tnpc.space.             600     IN      A       202.95.9.130

在hosts文件中自定义几条,再以同样的方式测试是否返回想要的结果,若是则配置完成。

三、保持运行

这个东西的启动方式对于有过Minecraft服务器架设经验的人来说应该都有种熟悉感,

我在此尝试用Minecraft的方式,即直接将其挂在screen中:

screen -S dns
#创建一个名为「dns」的screen

在刚创建的新窗口重复上述的启动流程,

启动后按下Ctrl + A + D即可将其挂在后台,

(想看输出刷屏幕的时候)可随时切回来:

screen -r dns

为了方便,整个脚本:

#!/bin/bash
#看启动没有
if screen -list | grep -q "dns"; then
    echo "服务端早已启动!执行“screen -r dns”以查看"
    exit 1
fi

#移动到安装目录
cd ~/coredns

echo "正启动服务端。欲浏览窗口则请执行screen -r dns"
echo "要使窗口最小化并后台运行,可按下Ctrl+A+D"
#启动在screen中
screen -dmS dns /bin/bash -c "./coredns"

乆,年更完成。(¦3[▓▓]