1. 程式人生 > >centos7.5下coredns+etcd搭建DNS服務器

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

space 實現 輪詢 才會 項目 主機 地址 inux 解決

  • coredns簡介
  • 安裝etcd
  • 安裝coredns
  • 設置域名解析
    • A記錄
    • AAAA記錄
    • CNAME記錄
    • SRV記錄
    • TXT記錄

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服務器