云原生 | 企業內使用 CoreDNS 構建高性能、插件化的DNS服務器
設為「?? 星標」帶你從基礎入門 到 全棧實踐 再到 放棄學習!
涉及 網絡安全運維、應用開發、物聯網IOT、學習路徑 、個人感悟 等知識分享。
希望各位看友多多支持【關注、點贊、評論、收藏、投幣】,助力每一個夢想。
【WeiyiGeek Blog's - 花開堪折直須折,莫待無花空折枝 】
作者主頁: 【 https://weiyigeek.top 】
博客地址: 【 https://blog.weiyigeek.top 】
作者答疑學習交流群:歡迎各位志同道合的朋友一起學習交流【點擊 ?? 加入交流群】, 或者關注公眾號回復【學習交流群】。
首發地址: https://mp.weixin.qq.com/s/hAMvwSqWfCQmGM_XzeqOOQ
0X00 前言簡述
在企業高可用DNS架構部署方案中我們使用的是傳統老牌DNS軟件Bind, 但是現在不少企業內部流行容器化部署,所以也可以將Bind替換為 CoreDNS ,由于 CoreDNS 是 Kubernetes 的一個重要組件,穩定性不必擔心,于此同時還可將K8S集群SVC解析加入到企業內部的私有的CoreDNS中。
CoreDNS 介紹
什么是CoreDNS?
CoreDNS 由 Go 語言編寫是一個高度可擴展和靈活的(
插件式) DNS 服務器,可以在多平臺環境上運行,來自Cloud Native Computing Foundation(云原生基金會)的開源畢業項目,它的設計目標是易于使用且具有強大的功能。
除此之外,CoreDNS與其他DNS服務器不同,例如(所有優秀的)BIND,Knot,PowerDNS 和 Unbound(技術上是一個解析器,但仍然值得一提)因為它非常靈活,幾乎所有功能都外包到插件中,插件可以是獨立的,也可以協同工作以執行“DNS功能”,這使得 CoreDNS 不僅可以用作傳統的 DNS 服務器,還可以用作服務發現、負載均衡和其他用途。
coredns 官方文檔:https://coredns.io/manual/toc/
coredns 發布版本: https://github.com/coredns/coredns/releases/
那么什么是“DNS功能”呢?
CoreDNS 其目的是易于使用且具有強大的功能,我們將其定義為一個軟件實現 CoreDNS 插件 API, 實現的功能可能會大相徑庭,有本身不會創建響應(例如指標或緩存)但會添加功能的插件,然后有一些插件確實會生成一個回應。這些也可以做任何事情:有與 Kubernetes 通信以提供服務發現的插件,從中讀取數據的插件 文件或數據庫。
CoreDNS 核心特點
-
插件架構(Plugins):通過插件,可以輕松擴展 CoreDNS 的功能。插件可以用于處理 DNS 請求、轉發請求、緩存結果、記錄日志等。插件的使用和配置都非常簡單。
-
性能和可靠性:CoreDNS 使用 Go 語言編寫,具有很高的性能。同時,它具有自動重試、健康檢查和負載均衡等功能,以確保 DNS 服務的可靠性。
-
易于配置:CoreDNS 使用名為 Caddyfile 的配置文件格式,這種格式簡單易懂,易于編寫和維護。
-
Kubernetes 集成:CoreDNS 可以與 Kubernetes 集成,作為集群內的 DNS 服務器。自 Kubernetes 1.11 版本起,CoreDNS 成為 Kubernetes 的默認 DNS 服務器,替代了之前的 kube-dns。
其實從功能角度來看,CoreDNS 更像是一個通用 DNS 方案(類似于 BIND),然后通過插件模式來極大地擴展自身功能,從而可以適用于不同的場景(比如 Kubernetes)。正如官方博客所說:CoreDNS is powered by plugins.
0x01 安裝部署
1.編譯方式安裝
$ git clone -b v1.11.1 https://github.com/coredns/coredns
$ cd coredns
$ make
# 如果本地沒有go環境,可以使用docker 的go鏡像進行編譯
$ docker run --rm -i -t -v $PWD:/v -w /v golang:1.21 make
2.二進制方式安裝
# 指定最新版本
COREDNS_VERSION="1.11.1"
# 官方下載
wget -O /tmp/coredns_${COREDNS_VERSION}_linux_amd64.tgz https://github.com/coredns/coredns/releases/download/v${COREDNS_VERSION}/coredns_${COREDNS_VERSION}_linux_amd64.tgz
# 代理下載
wget -O /tmp/coredns_${COREDNS_VERSION}_linux_amd64.tgz https://ghproxy.com/https://github.com/coredns/coredns/releases/download/v${COREDNS_VERSION}/coredns_${COREDNS_VERSION}_linux_amd64.tgz
# 解壓
tar xf /tmp/coredns_${COREDNS_VERSION}_linux_amd64.tgz -C /usr/local/bin
# 軟連接設置
ln -s /usr/local/bin/coredns /usr/bin/coredns
3.部署配置&驗證
Step 1.為了安全,此處為 coredns 服務創建獨立用戶,以及使用systemd管理此服務。
# 添加獨立用戶
useradd coredns -s /sbin/nologin
# 創建配置目錄文件及權限
mkdir -vp /etc/coredns/
touch /etc/coredns/Corefile
chown -R coredns /etc/coredns/Corefile
# 創建systemd服務管理清單
tee -a /usr/lib/systemd/system/coredns.service <<'EOF'
[Unit]
Description=CoreDNS DNS server
Documentation=https://coredns.io
After=network.target
[Service]
LimitNOFILE=1048576
LimitNPROC=512
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_BIND_SERVICE
PermissionsStartOnly=true
NoNewPrivileges=true
WorkingDirectory=/etc/coredns
User=coredns
ExecStart=/usr/bin/coredns -conf=/etc/coredns/Corefile
ExecReload=/bin/kill -SIGUSR1 $MAINPID
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
# Reload systemd manager configuration
systemctl daemon-reload
# Auto Start Configuration
systemctl enable coredns
Step 2.設置防火墻規則,以及創建生成coredns服務所需使用的配置文件。
# 設置防火墻允許DNS服務53端口網絡通行
firewall-cmd --permanent --add-service=dns
firewall-cmd --reload
# 使用 host 插件配置一個簡單解析
tee -a /etc/coredns/Corefile <<'EOF'
.:53 {
# 綁定所有接口
bind 0.0.0.0
# hosts 插件: https://coredns.io/plugins/hosts/
hosts {
# 自定義 weiyigeek.top 子域名解析
# 因為解析的域名少我們這里直接用hosts插件即可完成需求
# 如果有大量自定義域名解析那么建議用file插件使用 符合RFC 1035規范的DNS解析配置文件
192.168.1.2 www.weiyigeek.top
192.168.1.3 blog.weiyigeek.top
192.168.1.250 gitlab.weiyigeek.top
192.168.1.251 harbor.weiyigeek.top
# ttl
ttl 60
# 重載hosts配置
reload 1m
# 繼續執行
fallthrough
}
# file enables serving zone data from an RFC 1035-style master file.
# 最后所有的都轉發到系統配置的上游dns服務器去解析
forward . 223.6.6.6
# 緩存時間ttl
cache 120
# 自動加載配置文件的間隔時間
reload 6s
# 輸出日志
log
# 輸出錯誤
errors
}
EOF
# 啟動并查看coredns服務
systemctl start coredns && systemctl status coredns
# 查看監聽端口服務
lsof -i :53
# COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
# coredns 4548 coredns 7u IPv6 36174 0t0 TCP *:domain (LISTEN)
# coredns 4548 coredns 8u IPv6 36176 0t0 UDP *:domain
Step 3.簡單測試部署的Coredns服務是否正常工作。
- 在 Windows 中使用 nslookup 工具解析指定子域名
# 配置在coredns中的子域解析
[weiyigeek@localhost] C:\Users\WeiyiGeek $ nslookup -qt=a gitlab.weiyigeek.top 10.20.176.120
服務器: UnKnown
Address: 10.20.176.120
名稱: gitlab.weiyigeek.top
Address: 192.168.1.250
# coredns 不存在的子域解析將轉發給上游DNS服務器解析
[weiyigeek@localhost] C:\Users\WeiyiGeek $ nslookup -qt=a api.weiyigeek.top 10.20.176.120
服務器: UnKnown
Address: 10.20.176.120
非權威應答:
名稱: api.weiyigeek.top
Address: 82.156.18.253
- 在 Linux (redhat/centos/kylinos) 中 dig 工具解析指定子域名
dnf install bind-utils -y
dig harbor.weiyigeek.top @10.20.176.120
dig api.weiyigeek.top @10.20.176.120

0x02 CoreDNS 配置說明
描述: 通常情況下,一個典型的 Corefile 格式如下所示:
# ZONE : 定義 server 負責的 zone,PORT 是可選項,默認為 53;
ZONE:[PORT] {
# PLUGIN : 定義 server 所要加載的 plugin, 并且每個 plugin 可以有多個參數;
[PLUGIN] ...
}
例如,設置根域 . 的解析以及自定義域名的正向與反向解析。
# 根域, 監聽 53 端口
.:53 {
# whoami 插件:返回解析器的本地 IP 地址、端口和傳輸,且請求結束時下一個插件將不會被調用。
whoami
# .....
}
# 定義 Server Zone (正向解析)
weiyigeek.top {
whoami
# 可使用 host 或者 file 方法指定解析記錄。
file db.weiyigeek.top
}
# 同一個 server 但是負責不同 zone 的解析,有不同插件鏈。
weiyigeek.cn {
whoami
# 使用 host 或者 file 方法指定解析記錄。
host db.weiyigeek.top
}
# 定義 Reverse Zone (反向解析 IP 地址對應的域名)
# 方式1
0.0.10.in-addr.arpa {
whoami
}
# 方式2
10.0.0.0/24 {
whoami
}
# CoreDNS 除了支持 DNS 協議,也支持 TLS 和 gRPC,即 DNS-over-TLS[3] 和 DNS-over-gRPC 模式
tls://example.org:1443 {
#...
}
示例演示:
假若,CoreDNS 的 Corefile 配置文件的內容如下所示:
coredns.io:5300 {
file db.coredns.io
}
example.io:53 {
log
errors
file db.example.io
}
example.net:53 {
file db.example.net
}
.:53 {
kubernetes
proxy . 8.8.8.8
log
health
errors
cache
}
從配置文件來看,我們定義了兩個 server(盡管有 4 個區塊),分別監聽在 5300 和 53 端口, 每個進入到某個 server 的請求將按照 plugin.cfg 定義順序執行其已經加載的插件。
其邏輯圖可如下所示, 從圖中我們需要注意盡管在 .:53 配置了 health 插件,但是它并為在上面的邏輯圖中出現,其原因是,該插件并未參與請求相關的邏輯(即并沒有在插件鏈上),只是修改了 server 配置。
一般地,我們可以將插件分為兩種:Normal 插件(參與請求相關的邏輯,且插入到插件鏈中) 和 Other 插件 (不參與請求相關的邏輯,也不出現在插件鏈中,只是用于修改 server 的配置, 例如 health,tls 等插件.)

0x03 CoreDNS 插件說明
插件分類
描述: coredns官方對于插件的分類基本可以分為三種:Plugins(默認)、External Plugins和其他,其中Plugins一般都會被默認編譯到coredns的預編譯版本中,而External Plugins則不會,官方的文檔對外部插件的定義有著明確的解釋,主要要求大概是有用、高效、符合標準、文檔齊全、通過測試等。
官方插件幫助文檔: https://coredns.io/plugins/
通過官方的二進制部署的coredns可使用--plugins參數驗證可用的coredns插件,
$ coredns -plugins
Server types:
dns
Caddyfile loaders:
flag
default
Other plugins:
dns.acl
dns.any
dns.auto
dns.autopath
dns.azure
dns.bind
dns.bufsize
dns.cache
dns.cancel
dns.chaos
dns.clouddns
dns.debug
dns.dns64
dns.dnssec
dns.dnstap
dns.erratic
dns.errors
dns.etcd
dns.file
dns.forward
dns.geoip
dns.grpc
dns.header
dns.health
dns.hosts
dns.k8s_external
dns.kubernetes
dns.loadbalance
dns.local
dns.log
dns.loop
dns.metadata
dns.minimal
dns.nsid
dns.pprof
dns.prometheus
dns.ready
dns.reload
dns.rewrite
dns.root
dns.route53
dns.secondary
dns.sign
dns.template
dns.timeouts
dns.tls
dns.trace
dns.transfer
dns.tsig
dns.view
dns.whoami
on
溫馨提示: 若所需的插件不存在,請自行下載插件源碼到cordns源碼的plugin目錄,然后在plugin.cfg文件中添加下載的插件名稱例如etcd:etcd,又或者直接指定Github中的插件地址他會自行下載,例如 dump:github.com/miekg/dump,最后手動編譯coredns源碼。
# plugin.cfg
.....
# 對于在plugin目錄下已經存在的插件,則可以直接寫成plugin中的目錄名:
sign:sign
# 對于在plugin目錄下不存在的插件
dump:github.com/miekg/dump
# 需提前準備Golang環境
$ git clone -b v1.11.1 https://github.com/coredns/coredns
$ cd coredns
$ go get github.com/miekg/dump
$ go generate
$ go build && make
插件工作模式
描述: 當 CoreDNS 啟動后,它將根據配置文件啟動不同 server ,每臺 server 都擁有自己的插件鏈。當有 DNS 請求時,它將依次經歷如下 3 步邏輯:
- 如果有當前請求的 server 有多個 zone,將采用貪心原則選擇最匹配的 zone;
- 一旦找到匹配的 server,按照
plugin.cfg定義的順序執行插件鏈上的插件; - 每個插件將判斷當前請求是否應該處理,將有以下幾種可能:
- 請求被當前插件處理 : 插件將生成對應的響應并回給客戶端,此時請求結束,下一個插件將不會被調用,如
whoami插件; - 請求被當前插件以 Fallthrough 形式處理 : 如果請求在該插件處理過程中有可能將跳轉至下一個插件,該過程稱為 fallthrough,并以關鍵字
fallthrough來決定是否允許此項操作,例如host插件,當查詢域名未位于 /etc/hosts,則調用下一個插件; - 請求在處理過程被攜帶 Hint : 請求被插件處理,并在其響應中添加了某些信息(hint)后繼續交由下一個插件處理。這些額外的信息將組成對客戶端的最終響應,如
metric插件
- 請求被當前插件處理 : 插件將生成對應的響應并回給客戶端,此時請求結束,下一個插件將不會被調用,如
常用插件介紹
host 插件
描述: 此對于為文件中的區域提供服務很有用,但是僅支持 A、AAAA 和 PTR 記錄,如果要在主機插件中沒有匹配項的情況下將請求傳遞給插件鏈的其余部分,則必須指定該fallthrough選項,請注意每個塊{}只能使用一次此插件。
插件參考: https://coredns.io/plugins/hosts/
溫馨提示: 反向查找的 PTR 記錄由 CoreDNS 自動生成(基于hosts文件條目)
語法參數:
hosts [FILE [ZONES...]] {
# 條目的形式基于 IETF RFC 952 格式
# IP_address canonical_hostname [aliases...]
[INLINE]
# 生成的記錄的 DNS TTL,默認 3600s
ttl SECONDS
# 重載時間,若為0s表示不重載
reload DURATION
# 禁用生成反向解析
no_reverse
# 如果區域匹配并且無法生成任何記錄,請將請求傳遞給下一個插件。
fallthrough [ZONES...]
}
示例演示:
示例1.少量不同域名解析直接寫在 Corefile 配置文件中
.:53 {
# 綁定interface ip
bind 127.0.0.1
# 先走本機的hosts
hosts {
# 因為解析的域名少我們這里直接用hosts插件即可完成需求
192.168.1.2 www.weiyigeek.top weiyigeek.top
192.168.1.3 blog.weiyigeek.top
# ttl
ttl 60
# 重載hosts配置
reload 1m
# 繼續執行
fallthrough
}
# file enables serving zone data from an RFC 1035-style master file.
# 最后所有的都轉發到系統配置的上游dns服務器去解析
forward . /etc/resolv.conf
# 緩存時間ttl
cache 120
# 自動加載配置文件的間隔時間
reload 6s
# 輸出日志
log
# 輸出錯誤
errors
}
示例2.將解析寫在獨立的/etc/coredns/hosts文件中,也可以寫在 /etc/hosts 看個人喜好。
tee /etc/coredns/Corefile <<'EOF'
.:53 {
bind 10.20.176.120
hosts /etc/coredns/hosts
# 未配置解析的將轉發到上游服務器。
forward . 8.8.8.8:53
# 緩存時間ttl
cache 120
# 自動加載配置文件的間隔時間
reload 6s
# 輸出日志
log
# 輸出錯誤
errors
}
EOF
tee /etc/coredns/hosts <<'EOF'
# weiyigeek.com
192.168.1.2 www.weiyigeek.com
192.168.1.3 blog.weiyigeek.com
# weiyigeek.top
192.168.1.250 gitlab.weiyigeek.top
192.168.1.251 harbor.weiyigeek.top
EOF
修改配置文件后重啟coredns以便于驗證解析:
[weiyigeek@localhost] C:\Users\WeiyiGeek $ nslookup -qt=a www.weiyigeek.com 10.20.176.120
服務器: UnKnown
Address: 10.20.176.120
名稱: www.weiyigeek.com
Address: 192.168.1.2
[weiyigeek@localhost] C:\Users\WeiyiGeek $ nslookup -qt=a harbor.weiyigeek.top 10.20.176.120
服務器: UnKnown
Address: 10.20.176.120
名稱: harbor.weiyigeek.top
file 插件 (常用)
描述: 如果有大量自定義域名記錄解析那么則建議使用file插件,配置需要符合RFC 1035規范的DNS解析配置文件,如果區域文件包含簽名(即,使用 DNSSEC),返回正確的 DNSSEC 答案
語法參數
# DBFILE : 要讀取和分析的數據庫文件
# ZONES:它應該是權威的, 若為空則配置塊中的區域被使用。
file DBFILE [ZONES...] {
# 在 SOA 版本更改時執行區域重新加載的時間間隔
reload DURATION
}
示例演示:
示例1.使用file插件創建內部域名的正向以及反向解析。
tee /etc/coredns/Corefile <<'EOF'
.:53 {
forward . 223.6.6.6:53 114.114.114.114:53 /etc/resolv.conf # 上面etcd未查詢到的請求轉發給設置的DNS服務器解析
# 啟用緩存,保持正高速緩存大小 5000 和 負高速緩存大小 2500.
cache {
success 5000
denial 2500
}
log
errors
}
# 正向解析
weiyigeek.top {
file /etc/coredns/weiyigeek.top.conf
forward . 223.6.6.6:53
log
errors
}
# 反向解析
20.10.in-addr.arpa {
file /etc/coredns/db.20.10.conf
log
errors
}
EOF
# 正向解析配置文件,符合 RFC 1035 標準格式
tee /etc/coredns/weiyigeek.top.conf <<'EOF'
$TTL 86400
$ORIGIN weiyigeek.top.
@ 3600 IN SOA dns1.weiyigeek.top. master.weiyigeek.top. (
20210313 ; Serial
50400 ; Refresh
86400 ; Retry
604800 ; Expire
86400 ) ; Negative Cache TTL
;
; name servers - NS records
@ IN NS dns1
dns1 IN A 10.20.176.120
; root server - A records
@ IN A 192.168.10.71
; child server records
www IN A 192.168.10.71
blog IN A 192.168.10.70
EOF
tee /etc/coredns/db.20.10.conf <<'EOF'
$TTL 86400
@ 3600 IN SOA 20.10.in-addr.arpa. master.weiyigeek.top. (
20210313 ; Serial
50400 ; Refresh
86400 ; Retry
604800 ; Expire
86400 ) ; Negative Cache TTL
;
; name servers - NS records
@ IN NS dns1.weiyigeek.top.
; PTR Records
120.176 IN PTR dns1.weiyigeek.top.
EOF
重啟cordns服務驗證服務: systemctl restart coredns && sleep 6 &&systemctl status coredns
$ nslookup -qt=a weiyigeek.top 10.20.176.120
$ nslookup -qt=ns weiyigeek.top 10.20.176.120
$ nslookup -qt=ptr weiyigeek.top 10.20.176.120
執行結果:

etcd 插件
描述: 使用etcd插件我們可以將解析存入到etcd的解析記錄進行讀取,它可以實現了DNS服務發現,但是它不適合作為一個通用的DNS區域數據插件, 只實現了DNS記錄類型的一個子集。
語法示例
etcd [ZONES...] {
fallthrough [ZONES...]
path PATH
endpoint ENDPOINT...
credentials USERNAME PASSWORD
tls CERT KEY CACERT
stubzones
}
# 參數解析
fallthrough: 如果區域匹配但沒有記錄可以生成,將請求傳遞給下一個插件
path: etcd中的路徑,默認值/skydns
endpoint: etcd endpoint
credentials: etcd的用戶名和密碼
tls: CA
stubzones 啟用存根區域功能
示例演示:
.:53 {
forward . 223.6.6.6
}
weiyigeek.local {
file weiyigeek.local {
reload 30s
}
}
etcd-weiyigeek.local:53 {
etcd {
stubzones # 啟用存根區域功能,stubzone僅在位于指定的第一個區域下方的etcd樹中完成
path /root
endpoint http://172.22.50.98:2379 # 此處根據自己部署的etcd地址進行填寫。
fallthrough # 如果區域匹配但不能生成記錄,則將請求傳遞給下一個插件
}
forward . 8.8.8.8:53 8.8.4.4:53 /etc/resolv.conf # 上面etcd未查詢到的請求轉發給設置的DNS服務器解析
cache 160
loadbalance # 開啟DNS記錄輪詢策略
log # 打印日志
}
使用 etcd 插件利用目錄結構查詢相關條目,已上面的 etcd-weiyigeek.local 為例,配置的etcd的path為/root 。
# etcd-weiyigeek.local 的 A 記錄 為 172.22.50.28
$./etcdctl put /root/local/etcd-weiyigeek/ '{"host":"172.22.50.28","ttl":60}'
# demo1.etcd-weiyigeek.local 的 A 記錄 為 172.22.50.128
$./etcdctl put /root/local/etcd-weiyigeek/demo1 '{"host":"172.22.50.128","ttl":60}'
# demo2.etcd-weiyigeek.local 的 A 記錄 為 172.22.50.228
$./etcdctl put /root/local/etcd-weiyigeek/demo2 '{"host":"172.22.50.228","ttl":60}'
kubernetes 插件
描述: kubernetes 插件允許從kubernetes集群讀取區域數據, 插件地址: https://coredns.io/plugins/kubernetes/
語法參數:
kubernetes [ZONES...] {
endpoint URL
tls CERT KEY CACERT
kubeconfig KUBECONFIG [CONTEXT]
namespaces NAMESPACE...
labels EXPRESSION
pods POD-MODE
endpoint_pod_names
ttl TTL
noendpoints
fallthrough [ZONES...]
ignore empty_service
}
示例演示:
在 K8S 集群中的 Pod 內的 DNS 域名解析配置文件為 /etc/resolv.conf,文件內容如下所示。
#定義 DNS 服務器的 IP 地址。
nameserver xx.xx.0.10
# 設置域名的查找后綴規則,查找配置越多,說明域名解析查找匹配次數越多。
# Kubernetes 集群匹配有 kube-system.svc.cluster.local、svc.cluster.local、cluster.local 3 個后綴,最多進行 8 次查詢才能得到正確解析結果。
search kube-system.svc.cluster.local svc.cluster.local cluster.local
#定義域名解析配置文件選項,例如該參數設置成 ndots:5,說明如果訪問的域名字符串內的點字符數量超過 ndots 值,則認為是完整域名,并被直接解析;如果不足 ndots 值,則追加 search 段后綴再進行查詢。
options ndots:5
CoreDNS 配置:
$ kubectl get cm -n kube-system coredns -o yaml
.....
Corefile: |
.:53 {
errors # 輸出錯誤信息,若需調試請設置為debug
log # 輸出客戶端請求解析信息
health { # 健康檢查配置
lameduck 15s # 關閉延遲時間
}
ready # CoreDNS 插件,一般用來做可讀性檢查,可以通過 http://localhost:8181/ready 讀取。
# CoreDNS Kubernetes 插件,提供集群內服務解析能力。
kubernetes {{.ClusterDomain}} in-addr.arpa ip6.arpa {
pods verified
fallthrough in-addr.arpa ip6.arpa
}
# 添加自定義 hosts。
hosts {
192.168.1.41 www.weiyigeek.top
192.168.1.40 harbor.weiyigeek.top
fallthrough in-addr.arpa ip6.arpa
}
prometheus :9153 # CoreDNS 自身 metrics 數據接口。
# 當域名不在 Kubernetes 域時,將請求轉發到預定義的解析器。
forward . /etc/resolv.conf {
max_concurrent 1000
}
cache 30 # DNS 查詢緩存。
loop #環路檢測,如果檢測到環路,則停止 CoreDNS。
reload #允許自動重新加載已更改的 Corefile, 編輯 ConfigMap 配置后,請等待兩分鐘以使更改生效。
loadbalance #循環 DNS 負載均衡器,可以在答案中隨機 A、AAAA、MX 記錄的順序。
}
dnssec 插件
描述: DNSSEC 支持對服務的數據進行動態 DNSSEC 簽名,每個服務器塊只能使用此插件一次。
插件地址: https://coredns.io/plugins/dnssec/
語法參數:
dnssec [ZONES... ] {
# 指定讀取的Key文件
key file KEY...
# 使用緩存來存儲 RRSIGs,缺省值為 10000
cache_capacity CAPACITY
}
示例演示:
$ mkdir -vp /etc/coredns/dnssec && cd /etc/coredns/dnssec
# 使用 dnssec-keygen 工具生成密鑰文件
$ dnssec-keygen -a ECDSAP256SHA256 -f KSK weiyigeek.top
Generating key pair.
# 生成的密鑰的基本名稱
Kweiyigeek.top.+013+29388
# 生成的 public key 與 private key
$ ls
Kweiyigeek.top.+013+29388.key Kweiyigeek.top.+013+29388.private
# 配置文件 Corefile 示例
$ cat /etc/coredns/Corefile
.:53 {
forward . 223.6.6.6:53
log
errors
}
# 正向解析
weiyigeek.top {
file /etc/coredns/db.weiyigeek.top.conf
dnssec {
key file /etc/coredns/dnssec/Kweiyigeek.top.+013+29388.key
}
log
errors
}
知識擴展: 使用dnssec-keygen生成DNSSEC密鑰對,您需要按照以下步驟操作:
- 打開命令行工具,并確保您的計算機上已經安裝了BIND軟件包,該軟件包通常包含在DNS服務器軟件包中。
- 運行以下命令來生成DNSSEC密鑰對:
dnssec-keygen -a <algorithm> -b <bits> -n <type> -f KSK/ZSK <domain><algorithm>:選擇用于生成密鑰對的加密算法,常見的算法有RSA、DSA、ECDSA等。<bits>:指定密鑰的位數,一般為1024、2048、4096等。<type>:指定密鑰的類型,可以是KSK(Key Signing Key)或ZSK(Zone Signing Key)。<domain>:指定域名,生成的密鑰對將與該域名相關聯。
- 運行命令后,將會生成兩個密鑰文件,一個是私鑰文件(以".private"結尾),另一個是公鑰文件(以".key"結尾)。
請注意,生成的密鑰對需要妥善保管,私鑰文件應保密,而公鑰文件需要添加到您的域名的DNS記錄中。接下來,我們將討論如何將公鑰添加到DNS記錄中。
sign 插件
描述: sign 插件用于對區域進行簽名并 將 DNSSEC 記錄添加到區域文件。
插件地址: https://coredns.io/plugins/sign/
語法參數:
# DBFILE 讀取和分析的區域數據庫文件, 即符合 RFC 1035 標準格式文件
sign DBFILE [ZONES...] {
# 指定用于對區域進行簽名的密鑰(可以有多個)
key file|directory KEY...|DIR...
# 指定 CoreDNS 應在其中保存已簽名區域的 DIR,默認為 /var/lib/coredns 目錄(需要自行驗證)
directory DIR
}
使用示例:
# 1.使用 dnssec-keygen 生成 KSK 類型的 密鑰
$ cd /etc/coredns/dnssec/
$ dnssec-keygen -a ECDSAP256SHA256 -f KSK weiyigeek.top
# Generating key pair.
# Kweiyigeek.top.+013+04352
$ ls
# Kweiyigeek.top.+013+04352.key Kweiyigeek.top.+013+04352.private
# 2.創建已簽名區域的 DIR 目錄 /var/lib/coredns
mkdir -vp /var/lib/coredns
# 3.Corefile 配置示例文件
$ cat /etc/coredns/Corefile
# 正向解析
weiyigeek.top {
file /etc/coredns/db.weiyigeek.top.conf
sign /etc/coredns/db.weiyigeek.top.conf {
key file /etc/coredns/dnssec/Kweiyigeek.top.+013+29388.key
}
}
# 4.運行后生成的signd文件
cat /var/lib/coredns/db.weiyigeek.top.signed

tsig 插件
描述: tsig 定義 TSIG 密鑰,驗證傳入的 TSIG 簽名請求并簽署響應。
插件地址: https://coredns.io/plugins/tsig/
溫馨提示: 對于 Secondary 主從區域傳輸暫不支持此插件,希望后續官方完善。
語法參數:
tsig [ZONE...] {
# 顯式的設置密鑰的名稱 以及 TSIG 密鑰
secret NAME KEY
# 使用文件方式的加載TSIG 密鑰(推薦)
secrets FILE
# 指定用于的查詢類型,例如 `AXFR IXFR`
require [QTYPE...]
}
使用示例:
# 1.使用 tsig-keygen 工具生成TSIG 密鑰
tsig-keygen -a hmac-sha256 dns-tsig-keygen. > /etc/coredns/dnssec/dns-tsig-keygen.secrets
cat /etc/coredns/dnssec/dns-tsig-keygen.secrets
# key "dns-tsig-keygen." {
# algorithm hmac-sha256;
# secret "ec5onpRjGTIaOBZa+zGl2VJbwdJl1qlzj+NZNHrhhk4=";
# };
# 2.Corefile 配置文件示例
# 要求 TSIG 簽名的事務才能發出 AXFR IXFR
weiyigeek.top {
file /etc/coredns/db.weiyigeek.top.conf
tsig {
secrets /etc/coredns/dnssec/dns-tsig-keygen.secrets
require AXFR IXFR
}
transfer {
to *
}
}
# 要求 TSIG 簽名的事務才能發出所有請求
auth.zone {
tsig {
secret auth.zone.key. NoTCJU+DMqFWywaPyxSijrDEA/eC3nK0xi3AMEZuPVk=
require all
}
forward . 10.1.0.2
}
原文地址: https://blog.weiyigeek.top
本文至此完畢,更多技術文章,盡情期待下一章節!
專欄書寫不易,如果您覺得這個專欄還不錯的,請給這篇專欄 【點個贊、投個幣、收個藏、關個注,轉個發,留個言】(人間六大情),這將對我的肯定,謝謝!。
點擊 ?? 關注「 全棧工程師修煉指南」公眾號
微信溝通交流: weiyigeeker (點擊添加)
交流溝通群:629184198 或 關注公眾號回復【學習交流群】
溫馨提示: 由于作者水平有限,本章錯漏缺點在所難免,希望讀者批評指正,并請在文章末尾留下您寶貴的經驗知識,聯系郵箱地址 master@weiyigeek.top 或者關注公眾號 WeiyiGeek 聯系我。

本文來自博客園,作者:全棧工程師修煉指南,轉載請注明原文鏈接:http://www.rzrgm.cn/WeiyiGeek/p/17676558.html。
歡迎關注博主【WeiyiGeek】公眾號以及【極客全棧修煉】小程序

在企業高可用DNS架構部署方案中我們使用的是傳統老牌DNS軟件Bind, 但是現在不少企業內部流行容器化部署,所以也可以將Bind替換為 CoreDNS ,由于 CoreDNS 是 Kubernetes 的一個重要組件,穩定性不必擔心,于此同時還可將K8S集群SVC解析加入到企業內部的私有的CoreDNS中。
浙公網安備 33010602011771號