使用 CoreDNS 搭建本地的 DNS 服务器

2024-09-27#DNS#CoreDNS

CoreDNS 是一个开源的 DNS 和服务器发现工具,是一个从 CNCF( Cloud Native Computing Foundation)毕业的项目。与很多同样使用 Go 语言编写的工具类似,只需要下载它在对应平台的可执行文件,通过传入配置文件即可运行。

CoreDNS 配置文件示例 🔗

一个简单的配置文件示例如下:

.:53 {
        bind 0.0.0.0
        hosts {
                192.168.10.98 server.lan
                fallthrough
        }
        forward . /etc/resolv.conf
        cache 120
        reload 6s
        log
        errors
}

在该配置中,将域名 server.lan 指向了 IP 地址 192.168.10.98。那么在理想情况下,当使用该 DNS 服务的客户端在访问域名 server.lan 时,应该访问 IP 地址为 192.168.10.98 的主机。

注意,这里配置了端口号为 53,因此 DNS 服务器的标准端口就是 53。题外话:在 AWS 中,域名服务就叫做 Route53

在服务器运行 CoreDNS 🔗

运行 🔗

运行 CoreDNS 的方法也很简单,假定配置文件位于 /etc/coredns/Corefile,那么只需要执行如下命令即可:

sudo coredns -conf /etc/coredns/Corefile

更新 systemd-resolved 🔗

在运行 coredns 时很可能会出错,提示端口 53 被占用(bind: address already in use)。使用如下命令查看使用该端口的进程:

sudo netstat -nlp | grep :53

那么就会发现,systemd-resolved 使用了这个端口。因此,需要让 systemd-resolved 释放该端口。

使用管理员打开 /etc/systemd/resolved.conf 文件,找到 [Resolve] 下的 DNSDNSStubListener,分别去掉注释,并修改为如下内容,其他内容保持不变:

DNS=127.0.0.1
DNSStubListener=no

然后重启 systemd-resolved

sudo systemctl restart systemd-resolved.service

然后再次运行 coredns,确保它不会出错:

sudo coredns -conf /etc/coredns/Corefile

创建系统服务 🔗

创建系统服务的配置 /etc/systemd/system/coredns,内容如下:

[Unit]
Description=CoreDNS DNS server
Documentation=https://coredns.io
After=network.target

[Service]
PermissionsStartOnly=true
LimitNOFILE=1048576
LimitNPROC=512
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_BIND_SERVICE
NoNewPrivileges=true
DynamicUser=true
ExecStart=coredns -conf=/etc/coredns/Corefile
ExecReload=/bin/kill -SIGUSR1 $MAINPID
Restart=on-failure

[Install]
WantedBy=multi-user.target

将其启用,并启动:

sudo systemctl enable coredns.service
sudo systemctl restart coredns.service

检查运行正常:

sudo systemctl status coredns.service

此时,CoreDNS 服务器已经搭建成功。

验证 DNS 记录 🔗

在客户端测试 DNS 服务器能够正常解析域名 server.lanx.x.x.x 是 DNS 服务器的IP):

dig @x.x.x.x server.lan

在正常情况下,dig 命令会打印 DNS 服务器的回答( Answer),其中包括了 server.lan 的 IP 地址。

在客户端配置 DNS 服务器 🔗

虽然 DNS 服务器配置好了,但是客户端使用的命令行工具、浏览器等,还不能使用它。可以在如下几个层面的配置:

  • 在路由器配置。但是,路由器可能会提示:WAN口首选DNS地址和LAN口IP地址不能处于同一子网。
  • 在主机上配置。在主机上打开网络配置,设置 DNS 服务器。设置好之后,使用命令行工具比如 curl 访问 server.lan 的 Web服务,应该是没问题的。使用 Firefox 浏览器访问 server.lan 上的 Web服务,也是没问题的。
  • 浏览器配置。使用 Chrome 可能并不认可系统中的 DNS 配置,因为 Chrome 有更严格的安全要求。在 Reddit 上有一个针对该问题的讨论,其中提高了修改 Chrome 中的配置项。

另外,对于 .com 等域名,Chrome 浏览器默认会自动地把 http 重定向到 https 地址。这也可以在 Chrome 进行设置,见讨论 Chrome persistently redirecting to HTTPS for HTTP site,但无疑让事情变得复杂,在某些情况下又可能有安全问题。

结尾 🔗

使用 CoreDNS 搭建 DNS 服务器还是很简单,但在在生产级别的环境中, 配置可能复杂地多。这需要深入理解网络、DNS等原理,同时掌握 CoreDNS 的配置语言。在使用自托管的 DNS 服务器时,也需要一定的配置,无疑影响到了使用体验。


加载中...