
!nsd
NSD是一款仅提供权威解析、高性能、简单且开源的域名服务器。本Docker镜像封装了NSD,旨在提供便捷的DNS服务部署方案,特别支持DNSSEC相关功能。
| 变量名 | 描述 | 类型 | 默认值 |
|---|---|---|---|
| UID | nsd用户ID | 可选 | 991 |
| GID | nsd用户组ID | 可选 | 991 |
将DNS区域文件放置于/mnt/docker/nsd/zones/db.domain.tld。示例区域文件:
$ORIGIN domain.tld. $TTL 7200 ; SOA记录 @ IN SOA ns1.domain.tld. hostmaster.domain.tld. ( 2016020202 ; 序列号 7200 ; 刷新时间 1800 ; 重试时间 1209600 ; 过期时间 86400 ) ; 最小TTL ; 名称服务器记录 @ IN NS ns1.domain.tld. @ IN NS ns2.domain.tld. ; A记录 @ IN A IPv4地址 hostname IN A IPv4地址 ns1 IN A IPv4地址 ns2 IN A IPv4地址 ; CNAME记录 www IN CNAME hostname ; 邮件记录 @ IN MX 10 hostname.domain.tld. ...
将NSD配置文件放置于/mnt/docker/nsd/conf/nsd.conf。
主服务器配置示例
yamlserver: server-count: 1 # 服务器实例数量 ip4-only: yes # 仅使用IPv4 hide-version: yes # 隐藏版本信息 identity: "" # 身份标识(为空则不显示) zonesdir: "/zones" # 区域文件目录 remote-control: control-enable: yes # 启用远程控制 key: name: "sec_key" # 密钥名称 algorithm: hmac-sha256 # 加密算法 secret: "WU9VUl9TRUNSRVRfS0VZCg==" # 密钥(通过`echo "您的密钥" | base64`生成) zone: name: domain.tld # 区域名称 zonefile: db.domain.tld.signed # 签名后的区域文件 notify: 从服务器IP sec_key # 通知从服务器(带密钥) notify: 公共从服务器IP NOKEY # 通知公共从服务器(无密钥) provide-xfr: 从服务器IP sec_key # 允许从服务器AXFR传输(带密钥) provide-xfr: 公共从服务器IP NOKEY # 允许公共从服务器AXFR传输(无密钥) # "从服务器IP"是您的私有从域名服务器IP # "公共从服务器IP"可以是域名注册商提供的从服务器IP
从服务器配置示例(可选)
yamlserver: server-count: 1 ip4-only: yes hide-version: yes identity: "" zonesdir: "/zones" remote-control: control-enable: yes key: name: "sec_key" algorithm: hmac-sha256 secret: "WU9VUl9TRUNSRVRfS0VZCg==" # 与主服务器相同的密钥 zone: name: domain.tld zonefile: db.domain.tld.signed allow-notify: 主服务器IP sec_key # 允许主服务器通知(带密钥) request-xfr: AXFR 主服务器IP sec_key # 请求从主服务器AXFR传输(带密钥) # "主服务器IP"是您的主域名服务器IP
执行以下命令检查区域文件和NSD配置的有效性:
bashcd /mnt/docker/nsd # 检查区域文件 docker run --init --rm -v `pwd`/zones:/zones -ti hardware/nsd-dnssec nsd-checkzone domain.tld /zones/db.domain.tld # 检查NSD配置 docker run --init --rm -v `pwd`/conf:/etc/nsd -ti hardware/nsd-dnssec nsd-checkconf /etc/nsd/nsd.conf
docker-compose.yml配置
yamlnsd: image: hardware/nsd-dnssec container_name: nsd ports: - "公网IP:53:53" # 映射TCP端口 - "公网IP:53:53/udp" # 映射UDP端口 volumes: - /mnt/docker/nsd/conf:/etc/nsd # 配置文件目录 - /mnt/docker/nsd/zones:/zones # 区域文件目录 - /mnt/docker/nsd/db:/var/db/nsd # NSD数据目录
注意:将
公网IP替换为您的服务器公网IP。
启动容器
bashdocker-compose up -d
生成ZSK和KSK密钥并签名区域
bash# 生成密钥并签名区域(默认有效期1个月) docker-compose exec nsd keygen domain.tld # 自定义签名有效期(例如6个月) docker-compose exec nsd signzone domain.tld 20240601000000
自动更新区域与签名(示例脚本)
以下脚本用于定期更新区域文件序列号、TLSA记录并重新签名(避免RRSIG记录过期):
bash#!/bin/bash # Let's Encrypt证书路径 LETS_ENCRYPT_LIVE_PATH=/path/to/letsencrypt/live/domain.tld # 获取证书SHA256指纹 fingerprint=$(openssl x509 -noout -in "${LETS_ENCRYPT_LIVE_PATH}/cert.pem" -fingerprint -sha256 | cut -c 20- | sed s/://g) domain="domain.tld" zonename="db.${domain}" zonefile="/mnt/docker/nsd/zones/${zonename}" # 生成序列号(格式:年月日小时) serial=$(date -d "+1 day" +'%Y%m%d%H') # 获取TLSA记录行号 tlsa_line_number=$(grep -n TLSA $zonefile | cut -d : -f 1) # TLSA DNS记录 tlsa_dns_record="_dane IN TLSA 3 0 1 ${fingerprint}" # 签名有效期(6个月后) expiration_date=$(date -d "+6 months" +'%Y%m%d%H%M%S') # 更新序列号和TLSA记录 sed -i -e "s/20[0-9][0-9]\{7\} ; 序列号/${serial} ; 序列号/g" \ -e "${tlsa_line_number}s/.*/${tlsa_dns_record}/" $zonefile # 检查区域文件有效性并重新签名 if docker exec nsd nsd-checkzone "$domain" /zones/"$zonename" | grep -q "zone ${domain} is ok"; then docker exec nsd signzone "$domain" "$expiration_date" fi
查看DS记录(用于域名注册商配置)
bashdocker-compose exec nsd ds-records domain.tld > DS记录1 [摘要类型 = SHA1] : domain.tld. 600 IN DS xxxx 14 1 xxxxxxxxxxxxxx > DS记录2 [摘要类型 = SHA256] : domain.tld. 600 IN DS xxxx 14 2 xxxxxxxxxxxxxx > 公钥KSK : domain.tld. IN DNSKEY 257 3 14 xxxxxxxxxxxxxx ; {id = xxxx (ksk), size = 384b}
修改配置后,重启容器使变更生效:
bashdocker-compose restart nsd
探索更多轩辕镜像的使用方法,找到最适合您系统的配置方式
通过 Docker 登录认证访问私有仓库
无需登录使用专属域名
Kubernetes 集群配置 Containerd
K3s 轻量级 Kubernetes 镜像加速
VS Code Dev Containers 配置
Podman 容器引擎配置
HPC 科学计算容器配置
ghcr、Quay、nvcr 等镜像仓库
Harbor Proxy Repository 对接专属域名
Portainer Registries 加速拉取
Nexus3 Docker Proxy 内网缓存
需要其他帮助?请查看我们的 常见问题Docker 镜像访问常见问题解答 或 提交工单
manifest unknown
no matching manifest(架构)
invalid tar header(解压)
TLS 证书失败
DNS 超时
410 Gone 排查
402 与流量用尽
401 认证失败
429 限流
D-Bus 凭证提示
413 与超大单层
来自真实用户的反馈,见证轩辕镜像的优质服务