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

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!"