centos7.5下coredns+etcd搭建DNS服务器

Posted leffss

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了centos7.5下coredns+etcd搭建DNS服务器相关的知识,希望对你有一定的参考价值。

 

 

coredns简介

CoreDNS是一个DNS服务器,和Caddy Server具有相同的模型:它链接插件。CoreDNS是云本土计算基金会启动阶段项目。

CoreDNS是SkyDNS的继任者。 SkyDNS是一个薄层,暴露了DNS中的etcd中的服务。 CoreDNS建立在这个想法上,是一个通用的DNS服务器,可以与多个后端(etcd,kubernetes等)进行通信。

CoreDNS旨在成为一个快速灵活的DNS服务器。 这里的关键灵活指的是:使用CoreDNS,您可以使用DNS数据进行所需的操作。 还可以自已写插件来实现DNS的功能。

CoreDNS可以通过UDP / TCP(旧式的DNS),TLS(RFC 7858)和gRPC(不是标准)监听DNS请求。

CoreDNS目前支持的行为,括号里面的英文表示插件:

  • 从文件提供区域数据; 支持DNSSEC(仅限NSEC)和DNS(file)。
  • 从主机检索区域数据,即充当辅助服务器(仅限AXFR)(secondary)。
  • 快速签署区域数据(dnssec)
  • 响应负载均衡(loadbalance)
  • 允许区域传输,即充当主服务器(file)
  • 从磁盘自动加载区域文件(auto)
  • 缓存(cache)
  • 对endpoint的健康检查(health)
  • 使用ETCD作为后端,即SkyDNS(ETCD)的101.5%替换(etcd)
  • 使用k8s(kubernetes)作为后端(kubernetes)
  • 作为一个代理转发查询到一些其他(递归)域名服务器(proxy)
  • 提供指标(使用Prometheus)(metrics)
  • 提供查询(log)和错误(errors)日志记录
  • 支持CH类:version.bind和friends(chaos)
  • 分析支持(pprof)
  • 重写查询(qtype,qclass和qname)(rewrite)
  • 回传所使用的IP地址,传输和端口号(whoami)

安装etcd

使用yum安装,最简化配置,非集群,生成环境建议部署etcd集群。 安装

% yum install etcd -y

启动

% systemctl start etcd

设置开机启动

% systemctl enable etcd

安装coredns

下载二进制版本:https://github.com/coredns/coredns/releases 解压安装

% tar zxvf coredns_1.3.0_linux_amd64.tgz
% mv coredns /usr/bin
% mkdir /etc/coredns

添加主配置文件 vi /etc/coredns/Corefile,内容如下:

.:53 {	# 监听tcp和udp的53端口
    etcd {   # 配置启用etcd插件,后面可以指定域名,例如 etcd test.com {
        stubzones # 启用存根区域功能。 stubzone仅在位于指定的第一个区域下方的etcd树中完成
        path /coredns # etcd里面的路径 默认为/skydns,以后所有的dns记录就是存储在该存根路径底下
        endpoint http://localhost:2379 # etcd访问地址,多个空格分开
        
        # upstream设置要使用的上游解析程序解决指向外部域名的在etcd(认为CNAME)中找到的外部域名。
        upstream 8.8.8.8:53 8.8.4.4:53 /etc/resolv.conf 
        
        fallthrough # 如果区域匹配但不能生成记录,则将请求传递给下一个插件
        # tls CERT KEY CACERT # 可选参数,etcd认证证书设置
    }
    prometheus  # 监控插件
    cache 160
    loadbalance   # 负载均衡,开启DNS记录轮询策略
    proxy . 8.8.8.8:53 8.8.4.4:53 /etc/resolv.conf  # 上面etcd未查询到的请求转发给设置的DNS服务器解析
    log # 打印日志
}
  • coredns也可以使用file插件读取zone文件,和bind9一样兼容DNS标准文档(见RFC1035)

启动

% nohup /usr/bin/coredns -conf /etc/coredns/Corefile > /tmp/coredns.log 2>&1 &

验证

% dig +short @localhost www.baidu.com   
www.a.shifen.com.
61.135.169.121
61.135.169.125

设置域名解析

coredns只能使用etcd v3版本api添加的数据,etcdctl命令默认使用v2版本api,设置v3 api方法

% export ETCDCTL_API=3

或者添加以下内容到环境变量 vim ~/.bash_profile:

export ETCDCTL_API=3

A记录

% etcdctl put /coredns/com/leffss/www ‘{"host":"1.1.1.1","ttl":10}‘
OK
  • etcd的目录结构和域名是相反的,即上面表示域名:www.leffss.com
  • ttl值设置60s后,coredns每60s才会到etcd读取这个域名的记录一次

查询结果:

% dig @localhost +short www.leffss.com
1.1.1.1

如果想添加多条记录,让coredns轮询,方法如下:

% etcdctl put /coredns/com/leffss/www/x1 ‘{"host":"1.1.1.2","ttl":10}‘
OK
% etcdctl put /coredns/com/leffss/www/x2 ‘{"host":"1.1.1.3","ttl":10}‘
OK
  • x1和x2可以自定义,比如a、b、c等
  • 设置多个AAAA、CNAME等方法类似
  • 添加/coredns/com/leffss/www/x1、x2后,请求www.leffss.com就不会再读取/coredns/com/leffss/www,可以使用etcdctl del /coredns/com/leffss/www删除值

查询结果:

% dig @localhost +short www.leffss.com                                  
1.1.1.2
1.1.1.3

**注意:**如果想让取消设置的轮询值,需要删除/coredns/com/leffss/www/x1与/coredns/com/leffss/www/x2

AAAA记录

% etcdctl put /coredns/com/leffss/www ‘{"host":"1002::4:2","ttl":10}‘
OK

查询结果:

% dig -t AAAA @localhost +short www.leffss.com    
1002::4:2

CNAME记录

% etcdctl put /coredns/com/leffss/www ‘{"host":"www.baidu.com","ttl":10}‘
OK

查询结果:

% dig -t CNAME @localhost +short www.leffss.com 
www.baidu.com.
  • 这里cname设置成外部百度域名,按理说coredns应该也把这个cname记录继续解析成www.baidu.cm的IP地址,但是经过测试发现请求www.leffss.com只能解析到CNAME:www.baidu.com,无法继续解析,原因未知,以后研究

SRV记录

% etcdctl put /coredns/com/leffss/www ‘{"host":"www.baidu.com","port":80,"ttl":10}‘
OK
  • SRV记录和CNAME记录类似,只是多了port,它们的添加方法其实可以通用

查询结果:

% dig -t SRV @localhost +short www.leffss.com 
10 100 80 www.baidu.com.

TXT记录

% etcdctl put /coredns/com/leffss/www ‘{"text":"This is text!","ttl":10}‘  
OK

查询结果:

% dig -t TXT @localhost +short www.leffss.com
"This is text!"



以上是关于centos7.5下coredns+etcd搭建DNS服务器的主要内容,如果未能解决你的问题,请参考以下文章

CoreDNS配置etcd作为后端

coredns部署和etcd数据备份和恢复

Centos 7.5私有域名服务器部署(coredns+etcd)

k8s组件coredns以及dashboard

K8S 之 Coredns安装与理解

基于containerd搭建的K8S集群calico与coredns组件一直处于pending状态