使用 CoreDNS 搭建本地的 DNS 服务器
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]
下的 DNS
和 DNSStubListener
,分别去掉注释,并修改为如下内容,其他内容保持不变:
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.lan
(x.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 服务器时,也需要一定的配置,无疑影响到了使用体验。