运维的兄弟们一般使用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。是个不错的替代方案。