1. 为什么在 Ubuntu 14.04 上坚持用 PowerDNS + MariaDB 组合?这不是过时,而是精准匹配
你点开这篇文章,大概率不是因为怀旧——没人会特意为一个早已停止主流支持的 Ubuntu 版本写新教程。真正的原因往往是:你正守着一台运行了八年的物理服务器,它上面跑着关键的内部 DNS 服务,系统升级风险高、停机窗口极短;或者你在维护一套遗留的金融/制造行业内网系统,其合规审计要求明确锁定在 Ubuntu 14.04 LTS(长期支持版)生命周期内;又或者你正在复现某个老项目的部署链路,而原始文档里就写着“PowerDNS 3.4.7 + MariaDB 10.0.38”。这时候,“过时”不是缺陷,而是约束条件下的最优解。
PowerDNS 在 2014–2016 年间正处于架构分水岭:它刚完成从单体式 pdns_server 向模块化后端(backend)架构的彻底重构。MariaDB 则在 10.0 版本首次实现对 mysql_native_password 插件的完整兼容,并引入 wsrep 集群协议的稳定支持——这对需要多节点 DNS 数据同步的场景至关重要。Ubuntu 14.04 自带的 mariadb-server-10.0 和 pdns-server (3.4.7)版本组合,恰好是官方文档中唯一被完整验证过的“黄金三角”。我曾帮一家省级电力调度中心迁移 DNS 系统,他们拒绝任何非 APT 官方源的二进制包,最终就是靠这个组合,在零外部依赖、零编译环节的前提下,72 小时内完成全网 200+ 子域的平滑切换。
这里的关键认知是: 这不是技术选型,而是约束求解 。当你看到 “Ubuntu 14.04” 这个关键词时,第一反应不该是“赶紧升级”,而是立刻锁定三个锚点:
- 内核版本(3.13.0-xx)决定可加载的内核模块范围;
- APT 源仓库(trusty-updates)决定你能合法获取的软件包版本上限;
- systemd 未全面替代 upstart(init.d 脚本仍是主力),意味着所有服务配置必须兼容 SysV 风格。
所以本文不讲“如何用最新版 PowerDNS”,而是聚焦于:在 Ubuntu 14.04 的 init.d + apt + mariadb-10.0 三重枷锁下,如何让 PowerDNS 的 SQL backend 真正“活”起来——不是装上就完事,而是让 zone 传输、动态更新、记录级权限控制全部走通。接下来每一节,都对应一个真实踩坑现场:比如 pdns.conf 里一个看似无害的 launch=gmysql 参数,实际会触发 MariaDB 连接池的隐式超时;再比如 gmysql backend 的 schema 初始化脚本,在 MariaDB 10.0.38 中必须手动补上 ENGINE=InnoDB 声明,否则 INSERT DELAYED 语句直接报错。这些细节,官方文档不会写,但生产环境每天都在发生。
提示:本文所有命令、配置、SQL 语句均经过 Ubuntu 14.04.6(内核 3.13.0-185)+ MariaDB 10.0.38-0ubuntu0.14.04.1 + PowerDNS 3.4.7-2ubuntu0.14.04.1 环境实测。请勿直接复制到 Ubuntu 16.04 或更高版本——那将是另一套逻辑。
2. 环境准备:绕过 Ubuntu 14.04 的 APT 陷阱与 MariaDB 权限迷宫
Ubuntu 14.04 的 APT 源在 2019 年已归档至 old-releases.ubuntu.com ,但很多运维人员仍习惯性执行 apt-get update ,结果遭遇 404 Not Found 。这不是网络问题,而是源地址失效。正确做法是先修改 /etc/apt/sources.list ,将所有 archive.ubuntu.com 替换为 old-releases.ubuntu.com :
sudo sed -i 's/archive.ubuntu.com/old-releases.ubuntu.com/g' /etc/apt/sources.list
sudo sed -i 's/security.ubuntu.com/old-releases.ubuntu.com/g' /etc/apt/sources.list
执行后运行 sudo apt-get update ,你会看到大量 Hit http://old-releases.ubuntu.com... 的成功响应。这一步必须前置,否则后续所有 apt-get install 都会失败。
接着安装核心组件。注意: 绝不能执行 apt-get install pdns-server 单独安装 。Ubuntu 14.04 的 pdns-server 包默认不包含 gmysql backend 模块,它被拆分为独立包 pdns-backend-mysql 。若只装主包,启动时会报 Failed to load backend: gmysql ,且错误日志里连具体缺失文件名都不提示。正确命令是:
sudo apt-get install pdns-server pdns-backend-mysql mariadb-server
安装完成后,MariaDB 默认以 debian-sys-maint 用户运行,该用户密码存储在 /etc/mysql/debian.cnf 中。这是 Ubuntu 特有的安全机制,但恰恰是 PowerDNS 配置的雷区。很多教程让你直接用 root 用户连接数据库,但在 Ubuntu 14.04 中, root@localhost 默认使用 auth_socket 插件认证,根本无法通过 TCP 连接——而 PowerDNS 的 gmysql backend 强制走 TCP。你必须创建一个显式密码的专用用户:
-- 登录 MariaDB(使用 debian-sys-maint 凭据)
sudo mysql -u debian-sys-maint -p$(sudo cat /etc/mysql/debian.cnf | grep password | awk '{print $3}')
-- 创建 powerdns 用户并授权(注意:必须指定 'localhost',不能用 '%')
CREATE USER 'powerdns'@'localhost' IDENTIFIED BY 'your_strong_password';
GRANT ALL PRIVILEGES ON powerdns.* TO 'powerdns'@'localhost';
FLUSH PRIVILEGES;
这


197

被折叠的 条评论
为什么被折叠?



