关于程序员:云原生-使用-CoreDNS-构建高性能插件化的DNS服务器

51次阅读

共计 15524 个字符,预计需要花费 39 分钟才能阅读完成。

文章目录:

原文连贯:https://mp.weixin.qq.com/s/hAMvwSqWfCQmGM_XzeqOOQ

设为「⭐️ 星标」带你从根底入门 到 全栈实际 再到 放弃学习!
波及 网络安全运维、利用开发、物联网 IOT、学习门路、集体感悟 等常识分享。

心愿各位看友多多反对【关注、点赞、评论、珍藏、投币】,助力每一个幻想。

0X00 前言简述

在企业高可用 DNS 架构部署计划中咱们应用的是传统老牌 DNS 软件 Bind, 然而当初不少企业外部风行容器化部署,所以也能够将 Bind 替换为 CoreDNS,因为 CoreDNS 是 Kubernetes 的一个重要组件,稳定性不用放心,于此同时还可将 K8S 集群 SVC 解析退出到企业外部的公有的 CoreDNS 中。

CoreDNS 介绍

什么是 CoreDNS?

CoreDNS 由 Go 语言编写是一个高度可扩大和灵便的 ( 插件式) DNS 服务器,能够在多平台环境上运行,来自Cloud Native Computing Foundation(云原生基金会)的开源毕业我的项目,它的设计指标是易于应用且具备弱小的性能。

除此之外,CoreDNS 与其余 DNS 服务器不同,例如(所有优良的)BINDKnotPowerDNSUnbound(技术上是一个解析器,但依然值得一提)因为它非常灵活,简直所有性能都外包到插件中,插件能够是独立的,也能够协同工作以执行“DNS 性能”,这使得 CoreDNS 不仅能够用作传统的 DNS 服务器,还能够用作服务发现、负载平衡和其余用处。

coredns 官网文档:https://coredns.io/manual/toc/
coredns 公布版本: https://github.com/coredns/coredns/releases/

<br/>

那么什么是“DNS 性能”呢?

CoreDNS 其目标是易于应用且具备弱小的性能,咱们将其定义为一个软件实现 CoreDNS 插件 API, 实现的性能可能会天壤之别, 有自身不会创立响应(例如指标或缓存)但会增加性能的插件, 而后有一些插件的确会生成一个回应。这些也能够做任何事件:有与 Kubernetes 通信以提供服务发现的插件,从中读取数据的插件 文件或数据库。

<br/>

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

<br/>

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

<br/>

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

<br/>

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

<br/>

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

<br/>

插件工作模式

形容: 当 CoreDNS 启动后,它将依据配置文件启动不同 server,每台 server 都领有本人的插件链。当有 DNS 申请时,它将顺次经验如下 3 步逻辑:

  1. 如果有以后申请的 server 有多个 zone,将采纳贪婪准则抉择最匹配的 zone;
  2. 一旦找到匹配的 server,依照 plugin.cfg 定义的程序执行插件链上的插件;
  3. 每个插件将判断以后申请是否应该解决,将有以下几种可能:

    • 申请被以后插件解决 : 插件将生成对应的响应并回给客户端,此时申请完结,下一个插件将不会被调用,如 whoami 插件;
    • 申请被以后插件以 Fallthrough 模式解决 : 如果申请在该插件处理过程中有可能将跳转至下一个插件,该过程称为 fallthrough,并以关键字 fallthrough来决定是否容许此项操作,例如 host 插件,当查问域名未位于 /etc/hosts,则调用下一个插件;
    • 申请在处理过程被携带 Hint : 申请被插件解决,并在其响应中增加了某些信息(hint)后持续交由下一个插件解决。这些额定的信息将组成对客户端的最终响应,如 metric 插件

<br/>

罕用插件介绍

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...]
}

<br/>

示例演示:
示例 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

<br/>

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

执行后果:

<br/>

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 启用存根区域性能

<br/>

示例演示:

.: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 记录的程序。}

<br/>

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
}

<br/>

常识扩大 : 应用dnssec-keygen 生成 DNSSEC 密钥对,您须要依照以下步骤操作:

  1. 关上命令行工具,并确保您的计算机上曾经装置了 BIND 软件包,该软件包通常蕴含在 DNS 服务器软件包中。
  2. 运行以下命令来生成 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>:指定域名,生成的密钥对将与该域名相关联。
  3. 运行命令后,将会生成两个密钥文件,一个是私钥文件(以 ”.private” 结尾),另一个是公钥文件(以 ”.key” 结尾)。

请留神,生成的密钥对须要妥善保存,私钥文件应窃密,而公钥文件须要增加到您的域名的 DNS 记录中。接下来,咱们将探讨如何将公钥增加到 DNS 记录中。

<br/>

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

<br/>

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
}

本文至此结束,更多技术文章,纵情期待下篇好文!


参考起源:【WeiyiGeek Blog’s – 花开堪折直须折,莫待无花空折枝】

作者主页:【https://weiyigeek.top】

博客地址:【https://blog.weiyigeek.top】

本文由 mdnice 多平台公布

正文完
 0