Knot DNS 使用教程

简述

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

备用服务器配置

主服务器上

首先我们添加 slaveremote 来指明从服务器的 IP:

1
2
3
remote:
- id: slave
address: <IP>@53

添加 acl 授予远程节点 slave 传输 transferAXFR)权限:

1
2
3
4
acl:
- id: acl_slave
address: <IP>
action: transfer

在你想要添加备用服务器的 templatezone 中添加 notifyacl

1
2
3
4
zone:
- domain: groverchou.com
notify: slave
acl: acl_slave

从服务器上

添加 masterremote 来指明主服务器的 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.