简述
Knot DNS 是一个高性能权威域名解析服务器软件(authoritative-only DNS server),由 CZ.NIC 编写。之所以采用 Knot DNS 是因为它可以算是 DNS 服务器中较优越的一个,支持自动 DNSSEC 签名,配置简单(使用 YAML),使用方便。
Knot DNS 有一个姊妹项目 Knot Resolver ,它是一个 DNS 缓存解析器(caching DNS resolver)。简单来说当用户获取一个域名的 IP 时,它先查找缓存,不存在时递归解析域名(联系权威服务器获得结果),缓存后再返回结果给用户。
安装
添加软件源:
1 2 3 4 5
| # openSUSE Tumblweed zypper ar -f https://download.opensuse.org/repositories/home:CZ-NIC:knot-dns-latest/openSUSE_Tumbleweed/home:CZ-NIC:knot-dns-latest.repo
# openSUSE Leap 15.2 zypper ar -f https://download.opensuse.org/repositories/home:CZ-NIC:knot-dns-latest/openSUSE_Leap_15.2/home:CZ-NIC:knot-dns-latest.repo
|
安装 knot
:
1 2
| zypper ref zypper in knot
|
配置
基础配置
Knot DNS 的配置文件位于 /etc/knot/knot.conf
,采用 YAML 格式书写。
首先修改 listen
,将你用于访问的外部 IP 地址添加进去:
1 2 3 4 5 6 7 8 9 10 11
| server: rundir: "/run/knot" user: knot:knot listen: [ 127.0.0.1@53, ::1@53, <IPv4>@53, <IPv6>@53 ]
log: - target: syslog any: info
database: storage: "/var/lib/knot"
|
修改模板 template
,和其他模板同理,之后 zone
中的 domain
将继承模板配置的属性。default
是默认模板,如果未明显注明使用的模板将默认使用 default
。我将 master 和 slave 分别存放在不同的位置:
1 2 3 4 5 6 7 8
| template: - id: default storage: "/var/lib/knot/master" file: "%s.zone"
- id: slave storage: "/var/lib/knot/slave" file: "%s.zone"
|
将你的域名添加至 zone
:
1 2 3 4
| zone: - domain: 0.d.1.0.a.d.e.f.2.0.6.2.ip6.arpa
- domain: groverchou.com
|
启动服务并配置自动启动:
1
| systemctl enable --now knot
|
备用服务器配置
主服务器上
首先我们添加 slave
到 remote
来指明从服务器的 IP:
1 2 3
| remote: - id: slave address: <IP>@53
|
添加 acl
授予远程节点 slave
传输 transfer
(AXFR)权限:
1 2 3 4
| acl: - id: acl_slave address: <IP> action: transfer
|
在你想要添加备用服务器的 template
或 zone
中添加 notify
和 acl
:
1 2 3 4
| zone: - domain: groverchou.com notify: slave acl: acl_slave
|
从服务器上
添加 master
到 remote
来指明主服务器的 IP:
1 2 3
| remote: - id: master address: <IP>@53
|
添加 acl
授予远程节点 master
传输 notify
权限:
1 2 3 4
| acl: - id: acl_master address: <IP> action: notify
|
在添加域名到 zone
时使用 slave
模板,并添加 master
参数指明主服务器和 acl
:
1 2 3 4 5
| zone: - domain: groverchou.com template: slave master: master acl: acl_master
|
最后重启两边的 knot.service
即可。
DNSSEC 配置
添加 policy
来设置自动 DNSSEC 签名,这里是推荐的配置:
1 2 3 4 5 6
| policy: - id: default algorithm: ecdsap384sha384 ksk-lifetime: 365d zsk-lifetime: 30d nsec3: on
|
在 zone
中启用 dnssec-signing
:
1 2 3 4 5 6
| zone: - domain: groverchou.com notify: slave acl: acl_slave dnssec-signing: on dnssec-policy: default
|
重启服务即可,再使用如下命令获得 DS 记录并提交给域名注册商:
1
| keymgr groverchou.com ds
|
完成的配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
| server: rundir: "/run/knot" user: knot:knot listen: [ 127.0.0.1@53, ::1@53, <IPv4>@53, <IPv6>@53 ]
log: - target: syslog any: info
database: storage: "/var/lib/knot"
key: - id: key_certbot algorithm: hmac-sha512 secret: <secret>
remote: - id: slave address: <IP>@53
acl: - id: acl_slave address: <IP> action: transfer
- id: acl_certbot address: 127.0.0.1 key: key_certbot action: update
template: - id: default storage: "/var/lib/knot/master" file: "%s.zone"
- id: slave storage: "/var/lib/knot/slave" file: "%s.zone"
policy: - id: default algorithm: ecdsap384sha384 ksk-lifetime: 365d zsk-lifetime: 30d nsec3: on
zone: - domain: 0.d.1.0.a.d.e.f.2.0.6.2.ip6.arpa notify: slave acl: acl_slave dnssec-signing: on dnssec-policy: default
- domain: groverchou.com notify: slave acl: [ acl_slave, acl_certbot ] dnssec-signing: on dnssec-policy: default
|
日常事务
修改 DNS 记录主要使用 knotc
命令行工具,使用方法如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| # 开始会话 knotc zone-begin groverchou.com
# 设置记录 knotc zone-set groverchou.com @ 3600 A <IP> knotc zone-set groverchou.com www 3600 CNAME example.com.
# 删除记录 knotc zone-unset groverchou.com @ 3600 A <IP>
# 读取记录 knotc zone-read -- knotc zone-read groverchou.com knotc zone-read groverchou.com @ knotc zone-read groverchou.com www CNAME
# 查看差异 knotc zone-diff groverchou.com
# 提交修改 knotc zone-commit groverchou.com
# 中止会话 knotc zone-abort groverchou.com
|
新建 zone 流程:
1 2 3 4 5 6 7 8
| knotc zone-begin groverchou.com # grover.groverchou.com. 是邮箱地址 grover@groverchou.com knotc zone-set groverchou.com @ 7200 SOA ns1 grover.groverchou.com. 1 86400 900 691200 3600 knotc zone-set groverchou.com @ 3600 NS ns1 knotc zone-set groverchou.com ns1 3600 A <IP> knotc zone-set groverchou.com @ 3600 A <IP> knotc zone-set groverchou.com www 3600 A <IP> knotc zone-commit groverchou.com
|
查看日志可以使用 kjournalprint
:
1
| kjournalprint -l 5 /var/lib/knot/journal groverchou.com.
|