配置Coredns的一些心得

今日由于工作需要,要配置内网DNS。经过一轮调研之后,发现目前市面使用率最高的DNS开源服务器是bind9。但bind9不支持插件,也不提供RestAPI,虽然稳定高效,但不利于业务场景。所以转而考虑Google提供的开源dns-coredns,coredns是skydns的继承者(kubernetes当前在使用的dns服务),提供插件机制。 本文就分享一些配置coredns的心得。 首先介绍业务场景,这个场景很简单,在内网DNS中负责解析所有针对*.mydomain.com的查询请求,并返回相对应的A记录。其它查询请求直接转交给上级DNS。 好,让我们看一下如何使用coredns来完成这个需求。首先启动coredns,建议直接使用官方提供的docker镜像:

docker run   --name dns \  
                -v /etc/localtime:/etc/localtime \
                -p 53:53/udp \
                -p 53:53/tcp \
                -v /root/Corefile:/file/Corefile \
                -v /root/local:/file/local \
                coredns/coredns -conf /file/Corefile

上面的-conf /file/Corefile意思是让coredns使用最新的Corefile配置文件,也就是/coredns -conf /file/Corefile

因为DNS服务器必须同时支持TCP和UDP两种查询协议,所以必须同时暴露出tcp和udp的53端口。

下面来看看Corefile里面的内容:

. {
    debug
    errors
    whoami
    log
    proxy . /etc/resolv.conf {
            except mydomain.com
        }
    file /file/local mydomain.com
}

debug errors whoami log file proxy都是coredns支持的插件,这里就直接使用。上面最重要的是proxy和file两个插件。

proxy插件中 . /etc/resolv.conf表示所有的查询请求都由/etc/resolv.conf中的nameserver来负责解析,但除了mydomain.com的请求。

mydomain.com的请求怎么处理呢?就靠下面的file /file/local。coredns会加载/file/local中的数据,并且使用这个文件的数据来解析所有和mydomain.com有关的请求。这里需要注意,为什么coredns知道mydomain.com有关的数据都在local文件中,是因为file /file/local mydomain.com最后的mydomain.com表示local文件绑定的就是mydomain.com这个域名。

好,我们看一下local的内容。

$TTL 10
@     IN  SOA     ns1.cznews.cc. root.cznews.cc. (
            2   ;serial
            300 ; refresh
            1800 ; retry
            10  ; expire
            300 ; minimum
)

;name servers
@       IN      NS      ns1.cznews.cc.
ns1.cznews.cc.    IN  A 47.92.154.72  
cc    IN  CNAME    www.baidu.com.  
zk    10 IN A 172.16.255.20  
zk2    10 IN A 172.16.255.144  
zk1    10 IN A 172.16.255.126  

上面的内容遵循RFC-1035规范。 SOA记录表示当前NS的身份和相关参数(这里面的TTL为10秒,是为了测试方便)。

后面提供了当前NS的A记录,同时也添加了一条cc.mydomain.com的CNAME记录,还有三条A记录。

如果用户通过dig @47.92.154.72 cc.mydomain.com时就回复CNAME为www.baidu.com,同时返回www.baidu.com的dig记录。(我的DNS服务不一定会时刻开启,所以当你敲入上面命令时,很可能会报错😎)。

如果用户执行dig @47.92.154.72 zk.mydomain.com,那就返回zk相对应的A记录。

通过上面的配置,可以看到coredns使用起来还是比较简单的。这个例子,作为coredns入门会比较合适,后面我会再继续研究如何使用coredns来配置多域名查询,和如何与etcd进行集成。