器與轉(zhuǎn)發(fā)器(編譯、Corefile 配置到多協(xié)議部署))
后端網(wǎng)絡(luò)云原生【免費下載鏈接】corednsCoreDNS is a DNS server that chains plugins項目地址https://gitcode.com/gh_mirrors/co/coredns點擊查看免費下載CoreDNS 是一個用 Go 編寫的 DNS 服務(wù)器/轉(zhuǎn)發(fā)器其核心設(shè)計理念是“插件鏈”每一個插件完成一項特定的 DNS 功能通過 Corefile 配置文件將它們串聯(lián)成完整的處理流水線。本文以官方 README 為主線結(jié)合當前倉庫源碼系統(tǒng)講解如何從源碼編譯 CoreDNS、編寫 Corefile 完成從“最小轉(zhuǎn)發(fā)器”到“權(quán)威區(qū)托管 多協(xié)議加密監(jiān)聽”的實戰(zhàn)配置并深入剖析插件注冊機制、協(xié)議監(jiān)聽實現(xiàn)與 JSON 結(jié)構(gòu)化日志等底層細節(jié)。讀完本文你將具備獨立構(gòu)建、定制插件集合、配置 UDP/TCP、DoT、DoH、DoH3、DoQ、gRPC 多種監(jiān)聽方式并排查問題的能力。CoreDNS 是什么以插件鏈為核心的 DNS 服務(wù)器CoreDNS 是 Cloud Native Computing FoundationCNCF的畢業(yè)項目是一個“快速且靈活”的 DNS 服務(wù)器其中關(guān)鍵能力是flexible靈活借助插件你可以對 DNS 數(shù)據(jù)做任何想做的事如果開箱功能不夠還可以通過編寫插件倉庫根目錄的 plugin.md 提供了插件編寫指導來擴展。插件機制在源碼層面有清晰體現(xiàn)plugin.cfg 定義了插件directive的注冊順序文件頭注釋明確指出“Ordering is VERY important”順序非常重要每個插件在請求處理中能感知到所有排在它之后下方的插件的影響但不應(yīng)關(guān)心排在其上的插件在做什么。當前倉庫默認注冊了 root、metadata、geoip、cache、rewrite、dnssec、kubernetes、file、forward、whoami 等 60 余個插件。core/plugin/zplugin.go 是由directives_generate.go自動生成的插件導入文件通過空白導入_ ...把所有樹內(nèi)插件鏈接進二進制。plugin/register.go 提供了Register(name, action)函數(shù)內(nèi)部調(diào)用caddy.RegisterPlugin并指定ServerType: dns這是每個插件向 CoreDNS 登記的標準入口。支持的監(jiān)聽協(xié)議CoreDNS 可以監(jiān)聽多種方式進入的 DNS 請求協(xié)議說明UDP/TCP傳統(tǒng) DNSTLSDoT基于 RFC 7858 的 DNS over TLSDNS over HTTP/2DoH基于 RFC 8484 的 DNS over HTTPSDNS over HTTP/3DoH3基于 HTTP/3 的 DoHDNS over QUICDoQ基于 RFC 9250 的 DNS over QUICgRPC非標準協(xié)議見 plugin/grpc 與 plugin/grpc_server這些協(xié)議前綴的解析實現(xiàn)在 core/dnsserver/address.go 的zoneAddr結(jié)構(gòu)體中Transport字段取值正是dns、tls、grpc等SplitProtocolHostPort負責把dns://[::1]:53這類地址拆成協(xié)議、IP 與端口三部分。當前版本的能力清單按 README 與插件目錄對照CoreDNS 目前能夠從文件提供區(qū)域數(shù)據(jù)zone data支持 DNSSEC僅 NSEC與普通 DNSfile與auto插件從主服務(wù)器獲取區(qū)域數(shù)據(jù)即作為輔助服務(wù)器僅 AXFRsecondary插件動態(tài)on-the-fly簽署區(qū)域數(shù)據(jù)dnssec插件對響應(yīng)做負載均衡loadbalance插件允許區(qū)域傳輸即作為主服務(wù)器filetransfer插件自動從磁盤加載區(qū)域文件auto插件緩存 DNS 響應(yīng)cache插件以 etcd 作為后端替代 SkyDNSetcd插件以 Kubernetes 作為后端kubernetes插件作為代理把查詢轉(zhuǎn)發(fā)給其他遞歸名稱服務(wù)器forward插件通過 Prometheus 提供指標prometheus對應(yīng) metrics 插件提供查詢log與錯誤errors日志與云廠商集成route53、azure、clouddns插件支持 CH 類查詢version.bind等chaos插件支持 RFC 5001 的 DNS 名稱服務(wù)器標識NSID選項nsid插件支持性能剖析pprof插件重寫查詢qtype、qclass、qnamerewrite與template插件屏蔽 ANY 查詢any插件提供 DNS64 IPv6 轉(zhuǎn)換dns64插件以及更多view、acl、dns64、siit、shed、timeouts、header、minimal、hosts、tsig、dynupdate、sign、reload、ready、health、trace 等插件均在 plugin.cfg 中可見每個插件都有自己的文檔見各插件目錄下的 README.md例如 plugin/cache/README.md、plugin/kubernetes/README.md。從源碼編譯 CoreDNS編譯 CoreDNS 的前提是有一個可用的 Go 環(huán)境。需要注意版本要求倉庫 go.mod 聲明go 1.26.0README 明確要求 Go 版本為 1.26.0 或更高因為需要go mod支持及其他 API倉庫根目錄的 .go-version 文件被 Makefile 讀取用于設(shè)置GOTOOLCHAIN當前為1.27.0。CoreDNS 遵循上游 Go 項目的支持策略僅支持最近兩個 Go 版本。檢出項目后運行make即可編譯出二進制$ git clone https://gitcode.com/gh_mirrors/co/coredns $ cd coredns $ make注意構(gòu)建時可以通過設(shè)置COREDNS_PLUGINS環(huán)境變量來啟用額外的插件其值為逗號分隔的插件列表格式與 plugin.cfg 一致例如COREDNS_PLUGINSlog,forward這種插件名:包名形式。編譯完成后會得到一個coredns二進制。從 Makefile 可以看到構(gòu)建細節(jié)默認CGO_ENABLED0純靜態(tài)編譯、GOTAGSgrpcnotrace并通過-ldflags注入 GitCommit 版本信息make的 check 階段會先執(zhí)行g(shù)o generate coredns.go重新生成 core/plugin/zplugin.go 與 core/dnsserver/zdirectives.go保證插件列表與 plugin.cfg 同步——這正是“改 plugin.cfg 即可裁剪/增加插件”的機制所在。使用 Docker 編譯CoreDNS 需要 Go 才能編譯但如果你已經(jīng)安裝了 Docker、又不想搭建 Go 環(huán)境可以方便地構(gòu)建docker run --rm -i -t \ -v $PWD:/go/src/github.com/coredns/coredns -w /go/src/github.com/coredns/coredns \ golang:1.25 sh -c GOFLAGS-buildvcsfalse make gen GOFLAGS-buildvcsfalse make上面的命令單獨執(zhí)行即可生成coredns二進制make gen先執(zhí)行代碼生成隨后make完成編譯-buildvcsfalse用于在非 git 檢出環(huán)境下關(guān)閉構(gòu)建時的 VCS 信息收集??焖匍_始第一個 Corefile創(chuàng)建一個最小化的 Corefilecat Corefile EOF .:53 { forward . 8.8.8.8 log } EOF運行 CoreDNS$ ./coredns -conf Corefile測試解析$ dig 127.0.0.1 google.com這個配置的含義是在.:53匹配所有域名的根區(qū)端口 53上啟動服務(wù)器forward . 8.8.8.8把所有查詢轉(zhuǎn)發(fā)到上游 8.8.8.8log插件把每次查詢打到標準輸出。其底層行為可以對照 plugin/forward/README.md 與 plugin/log/README.md 印證forward插件復用已打開的到上游的 socket支持 UDP、TCP、DoT、DoH并使用帶內(nèi)健康檢查健康檢查以0.5s間隔循環(huán)進行通過遞歸查詢. IN NS判斷上游是否健康max_fails默認 2當所有上游都不可用時會嘗試連接一個隨機上游log插件把查詢及響應(yīng)部分輸出到標準輸出默認使用通用日志格式Common Log Format可通過class選項按success、denial、error、all分類過濾。配置進階Corefile 的加載與常用指令默認加載行為與啟動參數(shù)CoreDNS 的配置通過名為Corefile的文件完成。啟動時 CoreDNS 會從當前工作目錄查找Corefile。相關(guān)啟動參數(shù)在 coremain/run.go 中注冊包括參數(shù)默認值說明-confCorefile指定要加載的 Corefile 路徑-dns.port/-p53默認監(jiān)聽端口-log-formattext日志格式text或json-plugins—列出已安裝的插件-version—顯示版本-quiet—安靜模式不輸出初始化信息-pidfile—寫入 pid 文件的路徑注意程序入口 coredns.go 中通過//go:generate注解觸發(fā) directives_generate.go 與 owners_generate.go 的自動生成隨后調(diào)用coremain.Run()啟動整個服務(wù)。無配置啟動與 whoami當不帶任何配置啟動 CoreDNS 時它會加載whoami與log插件并監(jiān)聽 53 端口可用-dns.port覆蓋啟動輸出大致如下.:53 CoreDNS-1.6.6 linux/amd64, go1.16.10, aa8c32此時可用以下命令查詢正在運行的 CoreDNSdig 127.0.0.1 -p 53 www.example.com發(fā)往 53 端口的任意查詢都會返回一些信息——你的發(fā)送地址、端口和使用的協(xié)議查詢也會被記錄到標準輸出。這是因為whoami插件會如實回顯請求方的地址、端口與協(xié)議信息實現(xiàn)見 plugin/whoami。一個監(jiān)聽 53 端口并啟用 whoami 插件的 Corefile 是.:53 { whoami }修改端口有時 53 端口被系統(tǒng)進程占用可以修改 Corefile 讓 CoreDNS 從 1053 端口啟動.:1053 { whoami }如果 Corefile 中沒有指定端口默認使用 53也可以通過-dns.port標志覆蓋例如coredns -dns.port 1053在 1053 端口運行。import 指令可以使用import指令把其他文本文件引入 Corefile并支持用 glob 一次匹配多個文件.:53 { import example1.txt } import example2.txt環(huán)境變量可以在 Corefile 中使用環(huán)境變量語法為{$VARIABLE}。注意每個環(huán)境變量作為單個 token被插入 Corefile例如一個含空格的環(huán)境變量會被當作一個 token 處理而不是被拆成兩個 token。.:53 { {$ENV_VAR} }多 Server Block權(quán)威區(qū) 轉(zhuǎn)發(fā)一個把任意查詢轉(zhuǎn)發(fā)到上游 DNS如 8.8.8.8的 Corefile.:53 { forward . 8.8.8.8:53 log }啟動后查詢 53 端口查詢會被轉(zhuǎn)發(fā)到 8.8.8.8 并返回響應(yīng)每次查詢也會出現(xiàn)在標準輸出的日志中。在 1053 端口提供NSECDNSSEC 簽名的example.org區(qū)域錯誤與日志輸出到標準輸出允許所有人做區(qū)域傳輸同時顯式寫明 1 個 IP 地址以便 CoreDNS 向它發(fā)送 notify 通知example.org:1053 { file /var/lib/coredns/example.org.signed transfer { to * 2001:500:8f::53 } errors log }在 1053 端口提供example.org同時把所有不匹配example.org的查詢轉(zhuǎn)發(fā)給遞歸名稱服務(wù)器并把 ANY 查詢重寫成 HINFOexample.org:1053 { file /var/lib/coredns/example.org.signed transfer { to * 2001:500:8f::53 } errors log } . { any forward . 8.8.8.8:53 errors log }第二個 server block 中的any插件會把 ANY 查詢重寫為 HINFO 查詢見 plugin/any/README.mdforward負責轉(zhuǎn)發(fā)其余查詢。IP 地址與反向區(qū)自動轉(zhuǎn)換IP 地址也可以直接作為 zone 使用它們會被自動轉(zhuǎn)換為反向區(qū)10.0.0.0/24 { whoami }這表示你對0.0.10.in-addr.arpa.具有權(quán)威。IPv6 地址同樣適用。如果出于某種原因想服務(wù)一個名為10.0.0.0/24的 zone加上結(jié)尾點10.0.0.0/24.即可阻止自動轉(zhuǎn)換。甚至支持 CIDR見 RFC 1518 與 RFC 1519地址例如10.0.0.0/25CoreDNS 會檢查in-addr請求是否落在正確的范圍內(nèi)相關(guān)過濾邏輯由 core/dnsserver/config.go 中的FilterFuncs承載例如限制對非字節(jié)邊界反向區(qū)的訪問。多協(xié)議監(jiān)聽DoT、gRPC、DoQ、DoH 與 DoH3Corefile 中通過協(xié)議前綴聲明監(jiān)聽方式。同時監(jiān)聽 TLSDoT與 gRPCtls://example.org grpc://example.org { whoami }類似地QUICDoQquic://example.org { whoami tls mycert mykey }DNS over HTTP/2DoHhttps://example.org { whoami tls mycert mykey }在這種配置下TLS 終止由 CoreDNS 自己負責。也可以讓 CoreDNS 以明文 HTTP 提供 DoH不做 TLS 終止但注意此時 CoreDNS 實例之前必須有一個 TLS 終止代理來轉(zhuǎn)發(fā) DNS 請求否則客戶端無法通過 DoH 與服務(wù)器通信https://example.org { whoami }指定端口的方式相同grpc://example.org:1443 https://example.org:1444 { # ... }DNS over HTTP/3DoH3https3://example.org { whoami tls mycert mykey }同樣此配置下 TLS 終止由 CoreDNS 負責。當未指定傳輸協(xié)議時默認使用dns://。這些協(xié)議前綴的解析與端口組合邏輯在 core/dnsserver/address.go 的SplitProtocolHostPort與zoneAddr.String()中實現(xiàn)而各協(xié)議對應(yīng)的服務(wù)器實現(xiàn)分別位于 core/dnsserver/server_tls.go、core/dnsserver/server_grpc.go、core/dnsserver/server_https.go、core/dnsserver/server_https3.go 與 core/dnsserver/server_quic.go。JSON 結(jié)構(gòu)化日志-log-formatjson使用-log-formatjson啟動 CoreDNS可以把整個進程的運行日志輸出為單行 JSON。默認的-log-formattext保留原有文本輸出。該格式作用于整個進程包含所有 server block并且在 Corefile 重載后依然保持。注意查詢?nèi)罩救孕枰猯og插件-log-format只是進程級運行日志的格式開關(guān)。./coredns -conf Corefile -log-formatjson記錄的字段包含timeRFC3339 格式、帶小數(shù)秒的時間levelDEBUG、INFO、WARN、ERROR或FATALmsg消息內(nèi)容。命名插件日志器還會額外帶上plugin字段。消息內(nèi)容包括內(nèi)嵌換行與 DNS 轉(zhuǎn)義會按 JSON 編碼而不是被拼進 JSON 模板里。調(diào)試輸出仍然需要debug插件。查詢?nèi)罩镜淖侄握f明見 plugin/log/README.md 的 JSON Output 一節(jié)其中定義了如下類型化字段字段類型含義client_ipstring客戶端地址IPv6 不帶括號client_portnumber客戶端端口qnamestring小寫、全限定的查詢名DNS 展示格式qtype、qclassstring查詢類型與類別未知值用數(shù)字形式protocolstringudp或tcpid、opcodenumber查詢 ID 與 opcoderequest_sizenumber請求字節(jié)數(shù)dnssec_okboolean查詢的 DNSSEC OK 位bufsizenumber有效響應(yīng)緩沖區(qū)大小rcodestring 或 null響應(yīng) RCODE未記錄到 DNS 響應(yīng)時為 nullresponse_sizenumber記錄的響應(yīng)字節(jié)數(shù)duration_secondsnumber處理耗時秒日志格式開關(guān)在 coremain/run.go 中注冊flag.StringVar(logFormat, log-format, text, ...)并在Run()中通過clog.Configure(logFormat, os.Stdout)生效。標準庫的默認 logger包括 Caddy 的生命周期消息也會以INFO級別路由到同一后端原始消息得以保留、不做文本解析猜測。獨立配置的第三方 logger、直接寫 stdout/stderr 的輸出以及 Go 運行時診斷不會被攔截。命令行幫助、flag 解析錯誤、-version與-plugins輸出保持人類可讀。正常啟動信息、Corefile 錯誤以及查詢/錯誤插件日志使用所選格式輸出。社區(qū)、貢獻、部署與安全參與貢獻想為 CoreDNS 貢獻代碼請先閱讀倉庫內(nèi)的貢獻指南其中涵蓋 bug 報告、測試補充、新功能與新插件的提交流程新插件通常約 1000 行 Go 代碼含測試建議先從插件自己的README.md開始它能確定插件的正確名稱與配置項再依次實現(xiàn)setup.go、ServeDNShandler 等所有提交需附帶 Developer Certificate of Origingit commit -s。部署參考systemd 及其他使用場景的部署示例存放在獨立的 deployment 倉庫中README 已給出指引Kubernetes 場景可參考 plugin/kubernetes/README.md 與 plugin/k8s_external/README.md。棄用策略Deprecation Policy當 CoreDNS 出現(xiàn)不向后兼容的變更時遵循以下流程版本 x.y.z發(fā)布公告聲明下一個版本將做出不向后兼容的變更版本 x.y1.0增加次版本號并把補丁版本置 0做出變更但允許舊配置被解析——即 CoreDNS 可以從未改動的 Corefile 啟動保留寬松解析版本 x.y1.1補丁版本升到 1移除寬松解析此時若仍使用舊特性CoreDNS 將無法啟動。例如1.3.1 發(fā)布公告1.4.0 發(fā)布帶變更但兼容舊配置的新版本1.4.1 移除配置兼容性 workaround。安全策略第三方安全審計分別于 2018 年 3 月Cure53與 2022 年 3 月Trail of Bits進行。如果發(fā)現(xiàn)安全漏洞或任何安全相關(guān)問題請不要提交公開 issue而是私下發(fā)送報告到securitycoredns.io。項目維護者會公開致謝。詳細的漏洞披露、修復與發(fā)布流程含 Product Security Team 組織方式、私有披露流程、Fix Team 協(xié)作、CVSS 評估、私有發(fā)行商名單與禁運政策等見倉庫內(nèi)的安全文檔。CoreDNS 還提供面向發(fā)行商的私有通告郵件列表coredns-distributors-announcelists.cncf.io加入該列表需要滿足活躍發(fā)行商、有公開可驗證的安全修復記錄等條件。小結(jié)CoreDNS 的價值在于用一套簡潔的 Corefile 語法把可插拔的插件鏈組織成任意形態(tài)的 DNS 服務(wù)從單行forward的最小轉(zhuǎn)發(fā)器到filetransfer的權(quán)威區(qū)托管再到tls://、https://、https3://、quic://、grpc://的多協(xié)議加密監(jiān)聽都可以通過修改配置文件即時切換。理解 plugin.cfg 的插件順序、core/plugin/zplugin.go 的生成機制以及 coremain/run.go 中的啟動參數(shù)你就能按需裁剪構(gòu)建、定制日志格式并借助-log-formatjson與 Prometheus 指標見 plugin/metrics/README.md在生產(chǎn)環(huán)境中高效運維。贊分享后端網(wǎng)絡(luò)云原生【免費下載鏈接】corednsCoreDNS is a DNS server that chains plugins項目地址https://gitcode.com/gh_mirrors/co/coredns點擊查看免費下載相關(guān)推薦終極CoreDNS插件系統(tǒng)完全指南構(gòu)建靈活DNS服務(wù)鏈的10個核心技巧終極CoreDNS插件系統(tǒng)完全指南構(gòu)建靈活DNS服務(wù)鏈的10個核心技巧 CoreDNS是一個用Go語言編寫的高性能DNS服務(wù)器采用插件鏈架構(gòu)設(shè)計能夠通過靈后端網(wǎng)絡(luò)云原生CoreDNS tls 插件完全指南為 DoT / gRPC / DoH 服務(wù)器配置 TLS 與 ACME 自動證書CoreDNS tls 插件完全指南為 DoT / gRPC / DoH 服務(wù)器配置 TLS 與 ACME 自動證書 導讀 tls 插件是 CoreDNS 中后端網(wǎng)絡(luò)云原生CoreDNS grpc_server 插件詳解DNS-over-gRPC 服務(wù)的并發(fā)與安全限制配置CoreDNS grpc_server 插件詳解DNS over gRPC 服務(wù)的并發(fā)與安全限制配置 grpc_server 是 CoreDNS 中用于配置后端網(wǎng)絡(luò)云原生創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考