Canary Workshop

Whatever is worth doing at all is worth doing well

配置 PowerDNS 权威 DNS 主服务器和 HE.net 从节点的问题及解决

也算有惊无险,第一次考成功满分收工,就写一贴记录下做题时的心理过程、线上考试的经验和准备PAT时的经验作为纪念吧。

想给一个域名启用 DNSSEC,平时用的 HE.net 并不支持 DNSSEC。其他免费 DNS 服务商要么不支持 DNSSEC,要么存在各种限制,找来找去没有找到很合适的。然而 HE.net 的 slave 模式(就叫“从节点模式”吧)支持 DNSSEC,那就搭个所谓的”hidden master”吧。

网上搭建教程有不少,这里不再赘述。我打算使用常见的 PowerDNS + PowerDNS-Admin 的组合,不过实际操作下来遇到了一些大大小小的问题,记录在这里备考。

环境

主服务器使用 Ubuntu 20.04,考虑到只有一个域名而且记录数很少,就直接用 SQLite 3 作为数据库后端。

PowerDNS-Admin 使用 Docker 安装,并用 nginx 反向代理。

PowerDNS-Admin 无法连接到 API

这是遇到的第一个问题。最初的表现是:添加域名时报400错误。

看到这个错误觉得很奇怪:是 PowerDNS-Admin 构造了错误的请求吗?是软件 bug 吗?

经过一阵调试,发现请求根本就没有被 PowerDNS 收到(那为什么要报400而不是显示超时一类的呢)。原来是所用的云服务器网卡只有私有 IP 地址,Docker 内的 PowerDNS-Admin 无法连接到这样的私有地址。

解决方法:API 地址使用公网地址即解决。安全起见,在防火墙加入规则只允许本地访问。

无法写入数据

具体而言,报错 Database failed to start transaction: Error while retrieving SQLite query results: attempt to write a readonly database。看到“只读”第一反应就是出现了权限问题。

那就先777试试吧,结果还是不行。那很可能是类似 SELinux 一样的权限管理限制?

网上查询,得到这个结果。果然,是权限限制的问题。把数据库丢进 /var/lib/powerdns 即解决。

dns.he.net 不拉取记录

这个是最离谱的一个问题,先描述下症状:

  • 在 dns.he.net 添加域名一切正常;
  • PowerDNS 记录到了一次成功的 AXFR;
  • 之后哪怕进行了成功的 Notify,也不会再发生任何 AXFR,整个域是空的。

这个问题花了不少时间来解决。期间想到会不会是 PowerDNS 不兼容,会不会是 DNSSEC 的问题……直到看到这个,帖子中 porjo 这个用户说

After contacting HE support, my issue is now resolved. Apparently there was a config issue on the particular ns1 my slave talks to (seems like there are several ns1’s in operation and your slave contacts the nearest depending on anycast routing)

仿佛看到了希望……看了下,我的主服务器连接到的是 ns1.he.net 在伦敦的节点,搞不好这个节点有问题?

不想再在别的地域的服务器上重装 PowerDNS,灵机一动想到 HE 还提供 TunnelBroker 服务。起了个 Fremont 节点的 TunnelBroker,再次尝试通过 IPv6 测试……一切正常了。

也就是说是伦敦的节点出现了问题。HE 真的还在维护这个么……