目的与适用场景:在日本 VPS 上部署权威或递归 DNS 时,防止域名篡改与缓存投毒并支持 DNSSEC 验证。
前置条件:有 VPS(CentOS/Ubuntu)、root 权限、域名已在域名注册商处可管理、熟悉 shell。
备份:先备份 /etc、Zone 文件与当前 DNS 配置:cp -a /etc/bind /root/bind-backup 或相应目录。
建议:权威服务器用 BIND9 或 Knot,递归解析用 Unbound;负载/前端可用 dnsdist 或 CoreDNS。
安装示例(Ubuntu):apt update && apt install bind9 unbound dnsutils -y。
确认版本并及时打补丁:apt list --upgradable 或使用 apt-get upgrade。
BIND 配置示例(named.conf.options):将 recursion no; 设置在权威服务器上,使用 allow-recursion/allow-query 来限定 IP。
示例:allow-transfer { none; }; 或只允许主从具体 IP,使用 allow-transfer { x.x.x.x; };。
防火墙:仅开放 53/UDP、53/TCP,推荐用 ufw 或 iptables 限制来源到信任网段。
禁止默认 AXFR:在 named.conf 中 set allow-transfer 为特定主备 IP。
启用 TSIG:生成密钥(dnssec-keygen 或 tsig-keygen),在主从配置中用 key "tsig-key";示例:key "axfr-key" { algorithm hmac-sha256; secret "BASE64"; };。
在 zone 声明中添加 allow-transfer { key "axfr-key"; }。
步骤:1)更新软件支持 DNSSEC;2)为每个 zone 生成 KSK/ZSK。
BIND 示例:dnssec-keygen -a RSASHA256 -b 2048 -n ZONE example.com 生成 ZSK;dnssec-keygen -a RSASHA256 -b 4096 -n ZONE -f KSK example.com 生成 KSK。
生成后会得到 .key 和 .private 文件,妥善备份 .private 并限制权限(chmod 600)。
手动签名:dnssec-signzone -o example.com -k Kexample.com.+008+12345 example.com.zone。
自动化:使用 rndc signing 或 OpenDNSSEC/Knot-psl,或写 cron 任务定期检查 ZSK 轮换并重签名:每日运行 dnssec-signzone 并 reload named。
把生成的 signed zone 放到 BIND 的 zone 文件路径并在 named.conf 中引用 signed 文件名。
获取 DS:使用 dnssec-dsfromkey 或从 .key 文件读取 DS 值,例如:dnssec-dsfromkey Kexample...key。
登录日本注册商(如 Onamae、Muumuu),在域名管理界面添加 DS 记录,填入 keytag、算法、digest type 和 digest。
验证链:使用 dig +dnssec example.com SOA 和 dig +short @127.0.0.1 example.com SOA +dnssec 验证 RRSIG/DS 是否生效。
在日本 VPS 当作递归解析器时,安装并配置 Unbound:unbound-anchor 自动获取根信任锚。
unbound.conf 中设置: auto-trust-anchor-file: "/var/lib/unbound/root.key";验证 enabled,并重启 unbound。
用 dig @127.0.0.1 example.com +dnssec 验证 AD 标志或使用 drill/nslookup 检查。
使用 Unbound 或 Stubby 提供 DNS-over-TLS(DoT),或使用 dnsdist/Cloudflare DoH。
示例 Unbound 配置:tls-upstream: yes;forward-zone { name: "."; forward-addr: 1.1.1.1@853; }。
客户端启用:在系统或应用层配置使用 DoT/DoH 的本地 resolver,避免明文 UDP 泄漏。
BIND 可启用 Response Rate Limiting (RRL):在 named.conf 加 rrl-ratelimit 配置;Knot/dnsdist 有更细粒度的防护。
在 dnsdist 中配置规则:addAction(Condition, RRLAction) 来限制高频查询。
结合 iptables/ufw 黑名单、fail2ban 规则和监控(Prometheus + Grafana)快速响应异常流量。
启用详细日志但注意隐私与存储大小:BIND 的 logging 配置;收集查询量、错误率、签名状态。
使用 logrotate 管理日志,配置 Prometheus node_exporter + blackbox 或自定义脚本采集 DNS 指标。
设置告警:签名过期、DS 不匹配、无法验证的响应、AXFR 事件告警。
KSK 与 ZSK 分离,定期轮换 ZSK(建议 30–90 天)并按需轮换 KSK(6–12 个月)。
轮换步骤:1)生成新 ZSK;2)加入签名链并共存签名;3)删除旧 ZSK;4)更新 DS(若轮换 KSK)。
自动化工具:使用 OpenDNSSEC 或脚本结合 dnssec-settime/dnssec-keymgr 实现安全轮换。
签名/验证失败:检查 RRSIG、SOA 时间和系统时间是否同步(ntp/chrony)。
AXFR 问题:确认 TSIG 密钥、allow-transfer 与防火墙端口;用 dig +tcp @master example.com AXFR 测试。
缓存投毒疑似:启用 DNSSEC 验证并观察非验证通过的回答记录。
1)更新系统并安装 BIND/Unbound;2)限制递归/开放端口;3)生成 KSK/ZSK 并签名;4)将 DS 上报注册商;5)启用 RRL、TSIG、日志与监控。
建议先在测试域和测试 VPS 上完整演练一遍再上线生产域名。

答:最常见的问题是没有把 DS 记录正确添加到注册商,或者系统时间不同步导致 RRSIG 认为已过期。解决办法是用 dnssec-dsfromkey 生成 DS 并在注册商面板核对粘贴,同时确保 VPS 使用 ntp/chrony 与标准时间源同步。
答:使用 TSIG 为主从传输做认证,设置 allow-transfer 只允许指定从服务器 IP,并在传输外通过 SSH/SFTP/rsync + signed zones 进行额外备份。将私钥 (.private) 文件权限设为 600,并将签名操作限定在可信机器上。
答:使用 dig/drill 查询并带 +dnssec,例如 dig +dnssec @你的服务器 example.com A,检查返回是否有 AD 标志或 RRSIG;使用在线工具(Verisign Labs、DNSViz)检查链路和 DS/DS 匹配性;并监控 RRSIG 有无临近过期和签名覆盖所有记录。