运维的兄弟们一般使用dnsmasq来作为内网DNS解析服务。通过/etc/hosts 保存内网服务器IP地址与域名的映射关系。但是dnsmasq也会经常的报一些安全漏洞,让我们不胜其烦的去更新打补丁。最近在一次服务器更新换代的过程中尝试了一下CoreDNS,用它替代dnsmasq。感觉还行,可以跟大家分享一下替代方案。
我们采取docker容器的方式部署CoreDNS,方便版本的更新。使用coredns.sh脚本创建容器。
#!/bin/bash
# run core dns
docker stop coredns
docker rm coredns
docker run --name coredns -d \
-p 53:53 -p 53:53/udp \
-v $PWD/hosts:/hosts \
-v $PWD/corefile:/corefile \
coredns/coredns:1.8.3 \
-conf /corefile
通过两个文件corefile, hosts实现了dnsmasq的对应功能。corefile作为CoreDNS的配置文件配置如下
.:53 {
errors
health
log stdout
hosts /hosts {
fallthrough
reload 10s
}
forward . 114.114.114.114
reload
}
其中hosts指令实现了本地hosts文件的解析。fallthrough这个指令表示"如果hosts文件没有找到解析文件就会转发到下一个指令去执行"。下一个指令forward 将域名查询转发到其他dns服务器。hosts文件的作用和/etc/hosts是一样的。
另外我们可以实现一种高可用方案。搭建一台powerdns作为主dns。 多台CoreDNS作为辅助dns。通过cache指令和forward指令配合实现高可用。
CoreDNS代码小巧精悍,很容易进行代码安全检查,相关的安全漏洞也不多。性能方面也不输于dnsmasq。是个不错的替代方案。