使用 NSD 作为权威 DNS 服务器

摆脱各大名称服务器提供商,建立你自己的名称服务器吧!

本文为 DNS 完全解决方案三部曲之二 —— 权威 DNS。

背景

当我们通过购买或其他途径得到一个域名的控制权时,第一件事就是设置名称服务器(nameserver)。通常,域名提供商(如 GoDaddy、NameSilo)会提供这一服务(前提是你的域名是在它们那里购买的),一些 CDN 也会提供这一服务(如 Cloudflare)。然而,根据名称服务器工作原理,它知道所有访问你的域名(包括子域名)的用户的 IP 地址及访问时间,这无疑对隐私不利。那么,能否不依赖这些大型公司,建立独属于个人的名称服务器呢?当然可以。NSD 是以极致性能为目的设计的名称服务器,根据其主页,三个根服务器和大量顶级域名的名称服务器使用 NSD,这无疑证明了其能力非凡。

用法

我们默认读者已经掌握了 DNS 的基本概念,且拥有一个域名及 Linux 服务器。

下载并安装 NSD 后,在 /etc/nsd/nsd.conf.d 目录下新建一个配置文件,命名为 ns.conf(任意名字均可,只要以 .conf 结尾),内容如下。

server:
    server-count: 2
    ip-address: 1.2.3.4
    reuseport: yes
    hide-version: yes
    hide-identity: yes
    refuse-any: yes
    zonesdir: /etc/nsd/zone
zone:
    name: example.com
    zonefile: example.com

example.com 修改为你自己的域名,1.2.3.4 修改为服务器的公网 IPv4 地址,server-count 项的内容改为服务器的 CPU 线程数。注意:之所以将 1.2.3.4 修改为公网地址而不是直接修改为 0.0.0.0 是为了和 unbound 共存。Unbound 监听在 127.0.0.1:53,因此为避免冲突,NSD 只能监听在公网 IP 的 53 端口。配置文件中各项参数的含义见文档

然后在 /etc/nsd 目录下建立 zone 文件夹,用于存放具体的 DNS 记录。根据上面配置文件的 zonefile 项,取相应的文件名,即 example.com(理论上只要保证 zonefile 项与文件名相同即可,但习惯上取域名为文件名),其内容的示例如下。

$ORIGIN example.com.
$TTL 1h

@ IN SOA ns1 me 2021122301 28800 7200 864000 86400

@ IN NS ns1
@ IN NS ns2
ns1 IN A 1.2.3.4
ns2 IN A 1.2.3.4

@ IN A 5.6.7.8
www IN CNAME @
@ IN MX 10 mail.provider.com.
@ 86400 IN TXT "This is example.com."

拥有基本 DNS 知识的读者应当能猜出各项含义,这里仅作简要介绍。$ORIGIN 为域名名称(以 . 结尾),$TTL 为各项的默认 TTL(前提是没有指定,例如示例内容的最后一条记录的 TTL 是 1 天,其余均为 1 小时),下面就是各项 DNS 记录。通常,DNS 记录以 SOA 和 NS 记录开始,然后是其他记录。

值得注意的是,不以 . 结尾的域名均指相对域名,如 ns1 等价于 ns1.example.com.;特别地,@ 等价于 example.com.。善用相对域名可以简化 DNS 记录编辑,但涉及到第三方域名时就必须使用绝对域名(以 . 结尾),如示例内容中的 mail.provider.com.。此外,SOA 记录中的第一项代表主要名称服务器,示例中为 ns1.example.com.;第二项代表域名所有者联系邮箱,如 me 代表 me@example.com.,若写为 me.a 则代表 me@a.example.com.,即第一个 . 代表 @;第三项代表 DNS 记录序号,只能增加不能减少,通常取 YYYYMMDD 加上两位代表当日修改次数的数字,如 2021122301 代表此 DNS 记录是在格林威治时间 2021 年 12 月 23 日进行了第一次修改后的结果;后四项不建议修改。

到此,我们已经完成了服务器所需的所有配置。我们还需在域名提供商处设置域名的名称服务器为 ns1.example.com.ns2.example.com.。通常,我们需要先注册这两个子域名为名称服务器,然后再修改域名的名称服务器。

至此,所有配置进行完毕。享受独属于你自己的名称服务器吧!