使用 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.1DNSStubListener=no然后重启 systemd-resolved:
sudo systemctl restart systemd-resolved.service然后再次运行 coredns,确保它不会出错:
sudo coredns -conf /etc/coredns/Corefile创建系统服务
创建系统服务的配置 /etc/systemd/system/coredns,内容如下:
[Unit]Description=CoreDNS DNS serverDocumentation=https://coredns.ioAfter=network.target
[Service]PermissionsStartOnly=trueLimitNOFILE=1048576LimitNPROC=512CapabilityBoundingSet=CAP_NET_BIND_SERVICEAmbientCapabilities=CAP_NET_BIND_SERVICENoNewPrivileges=trueDynamicUser=trueExecStart=coredns -conf=/etc/coredns/CorefileExecReload=/bin/kill -SIGUSR1 $MAINPIDRestart=on-failure
[Install]WantedBy=multi-user.target将其启用,并启动:
sudo systemctl enable coredns.servicesudo 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 服务器时,也需要一定的配置,无疑影响到了使用体验。