1. 为什么你需要一个高可用的内网DNS?
如果你在公司里负责过IT运维,或者自己折腾过家庭服务器,肯定遇到过这样的场景:某个内部系统的域名突然解析不了了,大家跑来问你“网站怎么打不开了?”,你一通排查,最后发现是那台唯一的DNS服务器挂了。重启一下,服务恢复,但下次呢?这种单点故障就像一颗定时炸弹,随时可能引爆。
这就是我们今天要聊的核心问题:如何给你的内网DNS解析服务加上“双保险”甚至“多保险”。一个健壮的内网DNS架构,应该是即使其中一台服务器宕机,解析服务也能无缝切换,用户完全无感知。这不仅能提升内部服务的可用性,也是运维成熟度的一个重要标志。
PowerDNS(简称PDNS)就是一个能帮你实现这个目标的强大工具。它不仅仅是一个DNS服务器,更是一个支持多种后端(比如MySQL、PostgreSQL)和丰富特性的解析平台。我们今天要重点演练的,就是它的主从同步(Master/Slave) 功能。通过配置一主多从,让DNS记录在一台服务器(Master)上修改后,自动、快速地同步到其他所有从服务器(Slave)上。这样,任何一台服务器都能对外提供完整的解析服务,前端再用一个负载均衡器(比如dnsdist)把请求分发出去,一个高可用架构就成型了。
听起来是不是比守着那一台“独苗”服务器安心多了?接下来,我就手把手带你从零开始,搭建一套基于PowerDNS的高可用内网DNS系统。我会把我在实际部署中踩过的坑、总结的最佳实践都分享给你,保证你跟着做就能成功。
2. 环境准备与基础安装
在开始配置主从同步之前,我们得先把PowerDNS和它的“好搭档”MySQL给装好。这里我假设你有两台或以上的CentOS 7服务器(其他Linux发行版思路类似),IP地址分别是192.168.1.131(计划作为Master)和192.168.1.132(计划作为Slave)。所有操作都需要root权限。
2.1 安装MySQL数据库
PowerDNS需要一个后端数据库来存储所有的域名和记录信息。我们选择最常用的MySQL。注意,主从服务器上的MySQL需要各自独立安装,我们同步的是PowerDNS的数据,而不是直接同步MySQL数据库(那是另一种“Native”模式,后面会对比)。
先在每台服务器上执行以下命令安装MySQL 5.7:
# 下载并安装MySQL的官方yum源
wget http://repo.mysql.com/mysql57-community-release-el7-11.noarch.rpm
rpm -ivh mysql57-community-release-el7-11.noarch.rpm
# 安装MySQL服务器,--nogpgcheck跳过GPG检查避免报错
yum -y install mysql-community-server --nogpgcheck
# 启动MySQL服务并设置开机自启
systemctl start mysqld
systemctl enable mysqld
安装完成后,MySQL会生成一个临时密码,我们需要找到它并修改:
# 从日志中查找初始密码
grep 'temporary password' /var/log/mysqld.log
使用找到的密码登录MySQL,然后修改密码。MySQL 5.7默认的密码策略很严格,为了方便测试,我们先降低策略要求(生产环境请根据安全规范设置强密码):
-- 登录MySQL,回车后输入刚才查到的密码
mysql -uroot -p
-- 降低密码验证策略
SET GLOBAL validate_password_policy = 0;
SET GLOBAL validate_password_length = 4;
-- 修改root用户密码为 'test123'(示例,请按需更改)
SET PASSWORD = PASSWORD('test123');
-- 授权root用户可以从任意IP远程登录(内网环境方便管理,生产环境应限制IP)
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'test123' WITH GRANT OPTION;
FLUSH PRIVILEGES;
现在,为PowerDNS创建专用的数据库和用户:
-- 创建名为 powerdns 的数据库
CREATE DATABASE powerdns;
-- 创建用户 powerdns,并允许从任意IP连接(同样,生产环境应限制)
CREATE USER 'powerdns'@'%' IDENTIFIED BY 'test123';
-- 授予该用户对 powerdns 数据库的所有权限
GRANT ALL ON powerdns.* TO 'powerdns'@'%';
-- 授予 PROCESS 权限,PowerDNS某些操作需要
GRANT PROCESS ON powerdns.* TO 'powerdns'@'%';
FLUSH PRIVILEGES;
重要提示:以上操作需要在每一台将要运行PowerDNS的服务器上执行。也就是说,131和132两台机器上都要有一个独立的powerdns数据库和用户。
2.2 安装PowerDNS服务端
PowerDNS官方提供了稳定的Yum源,安装起来很方便。
# 安装EPEL源和优先级插件
yum install epel-release yum-plugin-priorities -y
# 添加PowerDNS Authoritative Server(权威服务器)的官方yum源
curl -o /etc/yum.repos.d/powerdns-auth-49.repo https://repo.powerdns.com/repo-files/centos-auth-49.repo
# 安装PowerDNS主程序、递归解析器(可选但推荐)以及MySQL后端支持
yum install pdns pdns-recursor pdns-backend-mysql -y
安装完成后,我们需要初始化数据库结构。PowerDNS的MySQL后端包提供了一个SQL脚本:
# 使用root用户登录MySQL,导入表结构
mysql -uroot -ptest123 powerdns < /usr/share/doc/pdns-backend-mysql-4.9.1/schema.mysql.sql
你可以登录MySQL检查一下表是否创建成功:
USE powerdns;
SHOW TABLES;
应该能看到domains, records等核心表。这里有个小技巧,为了方便后期排查问题,我们可以给records表加一个记录创建时间的字段(非必须):
ALTER TABLE records ADD COLUMN create_time timestamp NULL DEFAULT CURRENT_TIMESTAMP AFTER auth;
2.3 配置PowerDNS(基础部分)
PowerDNS的主配置文件是/etc/pdns/pdns.conf。默认情况下这个文件内容很多,全是注释。我们直接创建一个新的,或者清空后添加我们需要的配置。以下是一个最精简但功能完整的配置,两台服务器上可以先配置成一样的:
# 编辑配置文件
vi /etc/pdns/pdns.conf
将以下内容写入(根据你的实际情况修改数据库连接信息和监听端口):
# 运行身份
setgid=pdns
setuid=pdns
# 后端数据库启动模块
launch=gmysql
# MySQL数据库连接配置
gmysql-host=127.0.0.1
gmysql-dbname=powerdns
gmysql-user=powerdns
gmysql-password=test123
gmysql-port=3306
# DNS服务监听设置(监听所有IP的54端口,避免与系统已占用的53端口冲突)
local-address=0.0.0.0
local-port=54
# 开启API,用于pdns-admin等管理工具
api=yes
api-key=qwerasdf # 请务必修改为一个复杂的密钥!
# 开启Web服务器,用于提供API服务
webserver=yes
webserver-address=0.0.0.0
webserver-port=8081
webserver-allow
270



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



