首先在域名注册商那里添加胶水记录(glue record)这里以namecheap为例:
我这里添加了两个记录,分别是ns1和ns2,指向自己的服务器公网ip,添加完成后点搜索看看能不能搜到,能搜到就说明添加成功了:
然后把域名的ns服务器改为自己的,例如你的域名是example.com,你刚才添加的胶水记录是ns1和ns2,那么这里就填写ns1.example.com和ns2.example.com:
编辑configuration.nix:
nano /etc/nixos/configuration.nix
引入nsd.nix:
{ imports = [ ./hardware-configuration.nix ./lnmp.nix ./mastodon.nix ./peertube.nix ./nextcloud.nix ./nsd.nix ]; }
新建nsd.nix:
nano /etc/nixos/nsd.nix
我的配置如下:
{ config, pkgs, lib, ... }: { services.nsd = { enable = true; interfaces = [ "0.0.0.0" "::" ]; zones."example.com" = { data = '' $ORIGIN example.com. $TTL 1800 @ IN SOA ns1.example.com. admin.example.com. ( 2022083101 ; serial number 10800 ; Refresh 3600 ; Retry 604800 ; Expire 3600 ; Negative response caching TTL ) NS ns1.example.com. ns1 A 1.2.3.4 @ A 1.2.3.4 www A 1.2.3.4 ''; }; zones."example2.com" = { data = '' $ORIGIN example2.com. $TTL 1800 @ IN SOA ns1.example.com. admin.example2.com. ( 2022083101 ; serial number 10800 ; Refresh 3600 ; Retry 604800 ; Expire 3600 ; Negative response caching TTL ) NS ns1.example.com. @ A 1.2.3.4 www A 1.2.3.4 ''; }; }; }
一个services.nsd.zones.name对应一个域名,多个域名就添加多个zones.name即可。例如上面的配置就有2个域名,分别是example.com和example2.com
每次修改区域记录后,soa记录里面的serial number记得往上增加,比如起始值是2022083101,修改一次记录后就可以改为2022083102。
配置完成后重建系统:
nixos-rebuild switch
测试解析是否正常:
dig +short @8.8.8.8 NS example.com dig +short @8.8.8.8 A example.com
正常的话就能返回正确的解析结果: