)
后端网络云原生【免费下载链接】corednsCoreDNS is a DNS server that chains plugins项目地址https://gitcode.com/gh_mirrors/co/coredns点击查看免费下载CoreDNS 是一个用 Go 编写的 DNS 服务器/转发器其核心设计理念是“插件链”每一个插件完成一项特定的 DNS 功能通过 Corefile 配置文件将它们串联成完整的处理流水线。本文以官方 README 为主线结合当前仓库源码系统讲解如何从源码编译 CoreDNS、编写 Corefile 完成从“最小转发器”到“权威区托管 多协议加密监听”的实战配置并深入剖析插件注册机制、协议监听实现与 JSON 结构化日志等底层细节。读完本文你将具备独立构建、定制插件集合、配置 UDP/TCP、DoT、DoH、DoH3、DoQ、gRPC 多种监听方式并排查问题的能力。CoreDNS 是什么以插件链为核心的 DNS 服务器CoreDNS 是 Cloud Native Computing FoundationCNCF的毕业项目是一个“快速且灵活”的 DNS 服务器其中关键能力是flexible灵活借助插件你可以对 DNS 数据做任何想做的事如果开箱功能不够还可以通过编写插件仓库根目录的 plugin.md 提供了插件编写指导来扩展。插件机制在源码层面有清晰体现plugin.cfg 定义了插件directive的注册顺序文件头注释明确指出“Ordering is VERY important”顺序非常重要每个插件在请求处理中能感知到所有排在它之后下方的插件的影响但不应关心排在其上的插件在做什么。当前仓库默认注册了 root、metadata、geoip、cache、rewrite、dnssec、kubernetes、file、forward、whoami 等 60 余个插件。core/plugin/zplugin.go 是由directives_generate.go自动生成的插件导入文件通过空白导入_ ...把所有树内插件链接进二进制。plugin/register.go 提供了Register(name, action)函数内部调用caddy.RegisterPlugin并指定ServerType: dns这是每个插件向 CoreDNS 登记的标准入口。支持的监听协议CoreDNS 可以监听多种方式进入的 DNS 请求协议说明UDP/TCP传统 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非标准协议见 plugin/grpc 与 plugin/grpc_server这些协议前缀的解析实现在 core/dnsserver/address.go 的zoneAddr结构体中Transport字段取值正是dns、tls、grpc等SplitProtocolHostPort负责把dns://[::1]:53这类地址拆成协议、IP 与端口三部分。当前版本的能力清单按 README 与插件目录对照CoreDNS 目前能够从文件提供区域数据zone data支持 DNSSEC仅 NSEC与普通 DNSfile与auto插件从主服务器获取区域数据即作为辅助服务器仅 AXFRsecondary插件动态on-the-fly签署区域数据dnssec插件对响应做负载均衡loadbalance插件允许区域传输即作为主服务器filetransfer插件自动从磁盘加载区域文件auto插件缓存 DNS 响应cache插件以 etcd 作为后端替代 SkyDNSetcd插件以 Kubernetes 作为后端kubernetes插件作为代理把查询转发给其他递归名称服务器forward插件通过 Prometheus 提供指标prometheus对应 metrics 插件提供查询log与错误errors日志与云厂商集成route53、azure、clouddns插件支持 CH 类查询version.bind等chaos插件支持 RFC 5001 的 DNS 名称服务器标识NSID选项nsid插件支持性能剖析pprof插件重写查询qtype、qclass、qnamerewrite与template插件屏蔽 ANY 查询any插件提供 DNS64 IPv6 转换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 环境。需要注意版本要求仓库 go.mod 声明go 1.26.0README 明确要求 Go 版本为 1.26.0 或更高因为需要go mod支持及其他 API仓库根目录的 .go-version 文件被 Makefile 读取用于设置GOTOOLCHAIN当前为1.27.0。CoreDNS 遵循上游 Go 项目的支持策略仅支持最近两个 Go 版本。检出项目后运行make即可编译出二进制$ git clone https://gitcode.com/gh_mirrors/co/coredns $ cd coredns $ make注意构建时可以通过设置COREDNS_PLUGINS环境变量来启用额外的插件其值为逗号分隔的插件列表格式与 plugin.cfg 一致例如COREDNS_PLUGINSlog,forward这种插件名:包名形式。编译完成后会得到一个coredns二进制。从 Makefile 可以看到构建细节默认CGO_ENABLED0纯静态编译、GOTAGSgrpcnotrace并通过-ldflags注入 GitCommit 版本信息make的 check 阶段会先执行go generate coredns.go重新生成 core/plugin/zplugin.go 与 core/dnsserver/zdirectives.go保证插件列表与 plugin.cfg 同步——这正是“改 plugin.cfg 即可裁剪/增加插件”的机制所在。使用 Docker 编译CoreDNS 需要 Go 才能编译但如果你已经安装了 Docker、又不想搭建 Go 环境可以方便地构建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上面的命令单独执行即可生成coredns二进制make gen先执行代码生成随后make完成编译-buildvcsfalse用于在非 git 检出环境下关闭构建时的 VCS 信息收集。快速开始第一个 Corefile创建一个最小化的 Corefilecat Corefile EOF .:53 { forward . 8.8.8.8 log } EOF运行 CoreDNS$ ./coredns -conf Corefile测试解析$ dig 127.0.0.1 google.com这个配置的含义是在.:53匹配所有域名的根区端口 53上启动服务器forward . 8.8.8.8把所有查询转发到上游 8.8.8.8log插件把每次查询打到标准输出。其底层行为可以对照 plugin/forward/README.md 与 plugin/log/README.md 印证forward插件复用已打开的到上游的 socket支持 UDP、TCP、DoT、DoH并使用带内健康检查健康检查以0.5s间隔循环进行通过递归查询. IN NS判断上游是否健康max_fails默认 2当所有上游都不可用时会尝试连接一个随机上游log插件把查询及响应部分输出到标准输出默认使用通用日志格式Common Log Format可通过class选项按success、denial、error、all分类过滤。配置进阶Corefile 的加载与常用指令默认加载行为与启动参数CoreDNS 的配置通过名为Corefile的文件完成。启动时 CoreDNS 会从当前工作目录查找Corefile。相关启动参数在 coremain/run.go 中注册包括参数默认值说明-confCorefile指定要加载的 Corefile 路径-dns.port/-p53默认监听端口-log-formattext日志格式text或json-plugins—列出已安装的插件-version—显示版本-quiet—安静模式不输出初始化信息-pidfile—写入 pid 文件的路径注意程序入口 coredns.go 中通过//go:generate注解触发 directives_generate.go 与 owners_generate.go 的自动生成随后调用coremain.Run()启动整个服务。无配置启动与 whoami当不带任何配置启动 CoreDNS 时它会加载whoami与log插件并监听 53 端口可用-dns.port覆盖启动输出大致如下.:53 CoreDNS-1.6.6 linux/amd64, go1.16.10, aa8c32此时可用以下命令查询正在运行的 CoreDNSdig 127.0.0.1 -p 53 www.example.com发往 53 端口的任意查询都会返回一些信息——你的发送地址、端口和使用的协议查询也会被记录到标准输出。这是因为whoami插件会如实回显请求方的地址、端口与协议信息实现见 plugin/whoami。一个监听 53 端口并启用 whoami 插件的 Corefile 是.:53 { whoami }修改端口有时 53 端口被系统进程占用可以修改 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环境变量可以在 Corefile 中使用环境变量语法为{$VARIABLE}。注意每个环境变量作为单个 token被插入 Corefile例如一个含空格的环境变量会被当作一个 token 处理而不是被拆成两个 token。.:53 { {$ENV_VAR} }多 Server Block权威区 转发一个把任意查询转发到上游 DNS如 8.8.8.8的 Corefile.:53 { forward . 8.8.8.8:53 log }启动后查询 53 端口查询会被转发到 8.8.8.8 并返回响应每次查询也会出现在标准输出的日志中。在 1053 端口提供NSECDNSSEC 签名的example.org区域错误与日志输出到标准输出允许所有人做区域传输同时显式写明 1 个 IP 地址以便 CoreDNS 向它发送 notify 通知example.org:1053 { file /var/lib/coredns/example.org.signed transfer { to * 2001:500:8f::53 } errors log }在 1053 端口提供example.org同时把所有不匹配example.org的查询转发给递归名称服务器并把 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负责转发其余查询。IP 地址与反向区自动转换IP 地址也可以直接作为 zone 使用它们会被自动转换为反向区10.0.0.0/24 { whoami }这表示你对0.0.10.in-addr.arpa.具有权威。IPv6 地址同样适用。如果出于某种原因想服务一个名为10.0.0.0/24的 zone加上结尾点10.0.0.0/24.即可阻止自动转换。甚至支持 CIDR见 RFC 1518 与 RFC 1519地址例如10.0.0.0/25CoreDNS 会检查in-addr请求是否落在正确的范围内相关过滤逻辑由 core/dnsserver/config.go 中的FilterFuncs承载例如限制对非字节边界反向区的访问。多协议监听DoT、gRPC、DoQ、DoH 与 DoH3Corefile 中通过协议前缀声明监听方式。同时监听 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 终止代理来转发 DNS 请求否则客户端无法通过 DoH 与服务器通信https://example.org { whoami }指定端口的方式相同grpc://example.org:1443 https://example.org:1444 { # ... }DNS over HTTP/3DoH3https3://example.org { whoami tls mycert mykey }同样此配置下 TLS 终止由 CoreDNS 负责。当未指定传输协议时默认使用dns://。这些协议前缀的解析与端口组合逻辑在 core/dnsserver/address.go 的SplitProtocolHostPort与zoneAddr.String()中实现而各协议对应的服务器实现分别位于 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 结构化日志-log-formatjson使用-log-formatjson启动 CoreDNS可以把整个进程的运行日志输出为单行 JSON。默认的-log-formattext保留原有文本输出。该格式作用于整个进程包含所有 server block并且在 Corefile 重载后依然保持。注意查询日志仍需要log插件-log-format只是进程级运行日志的格式开关。./coredns -conf Corefile -log-formatjson记录的字段包含timeRFC3339 格式、带小数秒的时间levelDEBUG、INFO、WARN、ERROR或FATALmsg消息内容。命名插件日志器还会额外带上plugin字段。消息内容包括内嵌换行与 DNS 转义会按 JSON 编码而不是被拼进 JSON 模板里。调试输出仍然需要debug插件。查询日志的字段说明见 plugin/log/README.md 的 JSON Output 一节其中定义了如下类型化字段字段类型含义client_ipstring客户端地址IPv6 不带括号client_portnumber客户端端口qnamestring小写、全限定的查询名DNS 展示格式qtype、qclassstring查询类型与类别未知值用数字形式protocolstringudp或tcpid、opcodenumber查询 ID 与 opcoderequest_sizenumber请求字节数dnssec_okboolean查询的 DNSSEC OK 位bufsizenumber有效响应缓冲区大小rcodestring 或 null响应 RCODE未记录到 DNS 响应时为 nullresponse_sizenumber记录的响应字节数duration_secondsnumber处理耗时秒日志格式开关在 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 错误以及查询/错误插件日志使用所选格式输出。社区、贡献、部署与安全参与贡献想为 CoreDNS 贡献代码请先阅读仓库内的贡献指南其中涵盖 bug 报告、测试补充、新功能与新插件的提交流程新插件通常约 1000 行 Go 代码含测试建议先从插件自己的README.md开始它能确定插件的正确名称与配置项再依次实现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 出现不向后兼容的变更时遵循以下流程版本 x.y.z发布公告声明下一个版本将做出不向后兼容的变更版本 x.y1.0增加次版本号并把补丁版本置 0做出变更但允许旧配置被解析——即 CoreDNS 可以从未改动的 Corefile 启动保留宽松解析版本 x.y1.1补丁版本升到 1移除宽松解析此时若仍使用旧特性CoreDNS 将无法启动。例如1.3.1 发布公告1.4.0 发布带变更但兼容旧配置的新版本1.4.1 移除配置兼容性 workaround。安全策略第三方安全审计分别于 2018 年 3 月Cure53与 2022 年 3 月Trail of Bits进行。如果发现安全漏洞或任何安全相关问题请不要提交公开 issue而是私下发送报告到securitycoredns.io。项目维护者会公开致谢。详细的漏洞披露、修复与发布流程含 Product Security Team 组织方式、私有披露流程、Fix Team 协作、CVSS 评估、私有发行商名单与禁运政策等见仓库内的安全文档。CoreDNS 还提供面向发行商的私有通告邮件列表coredns-distributors-announcelists.cncf.io加入该列表需要满足活跃发行商、有公开可验证的安全修复记录等条件。小结CoreDNS 的价值在于用一套简洁的 Corefile 语法把可插拔的插件链组织成任意形态的 DNS 服务从单行forward的最小转发器到filetransfer的权威区托管再到tls://、https://、https3://、quic://、grpc://的多协议加密监听都可以通过修改配置文件即时切换。理解 plugin.cfg 的插件顺序、core/plugin/zplugin.go 的生成机制以及 coremain/run.go 中的启动参数你就能按需裁剪构建、定制日志格式并借助-log-formatjson与 Prometheus 指标见 plugin/metrics/README.md在生产环境中高效运维。赞分享后端网络云原生【免费下载链接】corednsCoreDNS is a DNS server that chains plugins项目地址https://gitcode.com/gh_mirrors/co/coredns点击查看免费下载相关推荐终极CoreDNS插件系统完全指南构建灵活DNS服务链的10个核心技巧终极CoreDNS插件系统完全指南构建灵活DNS服务链的10个核心技巧 CoreDNS是一个用Go语言编写的高性能DNS服务器采用插件链架构设计能够通过灵后端网络云原生CoreDNS tls 插件完全指南为 DoT / gRPC / DoH 服务器配置 TLS 与 ACME 自动证书CoreDNS tls 插件完全指南为 DoT / gRPC / DoH 服务器配置 TLS 与 ACME 自动证书 导读 tls 插件是 CoreDNS 中后端网络云原生CoreDNS grpc_server 插件详解DNS-over-gRPC 服务的并发与安全限制配置CoreDNS grpc_server 插件详解DNS over gRPC 服务的并发与安全限制配置 grpc_server 是 CoreDNS 中用于配置后端网络云原生创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考