centos7.5下coredns+etcd搭建DNS伺服器
阿新 • • 發佈:2018-12-20
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!"