在Linux上配置高可用DNS集群通常采用主从架构结合负载均衡或Anycast技术,以下是几种常见方案:
下面以最常用的BIND+Keepalived方案为例进行详细说明。
# CentOS/RHEL
sudo yum install bind bind-utils -y
# Ubuntu/Debian
sudo apt install bind9 bind9utils -y
编辑主配置文件 /etc/named.conf
:
options {
listen-on port 53 { any; };
directory "/var/named";
allow-query { any; };
allow-transfer { slave-server-IP; }; # 只允许从服务器传输
recursion no; # 关闭递归查询(权威DNS)
dnssec-enable yes;
dnssec-validation yes;
};
zone "example.com" IN {
type master;
file "example.com.zone";
allow-update { none; };
};
创建区域文件 /var/named/example.com.zone
:
$TTL 86400
@ IN SOA ns1.example.com. admin.example.com. (
2023060101 ; serial
3600 ; refresh
900 ; retry
604800 ; expire
86400 ; minimum TTL
)
@ IN NS ns1.example.com.
@ IN NS ns2.example.com.
ns1 IN A 192.168.1.10
ns2 IN A 192.168.1.11
www IN A 192.168.1.100
编辑 /etc/named.conf
:
options {
listen-on port 53 { any; };
directory "/var/named";
allow-query { any; };
recursion no;
};
zone "example.com" IN {
type slave;
file "slaves/example.com.zone";
masters { master-server-IP; };
};
在两台服务器上安装Keepalived:
# CentOS/RHEL
sudo yum install keepalived -y
# Ubuntu/Debian
sudo apt install keepalived -y
主服务器Keepalived配置 /etc/keepalived/keepalived.conf
:
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass dns-cluster
}
virtual_ipaddress {
192.168.1.100/24 dev eth0
}
}
从服务器配置(priority设为较低值如90):
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass dns-cluster
}
virtual_ipaddress {
192.168.1.100/24 dev eth0
}
}
# 主服务器
sudo systemctl start named
sudo systemctl enable named
sudo systemctl start keepalived
sudo systemctl enable keepalived
# 从服务器
sudo systemctl start named
sudo systemctl enable named
sudo systemctl start keepalived
sudo systemctl enable keepalived
# CentOS/RHEL
sudo yum install pdns pdns-backend-mysql mariadb-server
# Ubuntu/Debian
sudo apt install pdns-server pdns-backend-mysql mysql-server
CREATE DATABASE pdns;
GRANT ALL ON pdns.* TO 'pdns'@'localhost' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;
导入数据库架构:
mysql -u root -p pdns < /usr/share/doc/pdns-backend-mysql-*/schema.mysql.sql
编辑 /etc/pdns/pdns.conf
:
launch=gmysql
gmysql-host=localhost
gmysql-user=pdns
gmysql-password=password
gmysql-dbname=pdns
日志监控:
journalctl -u named -f
区域文件同步检查:
dig @slave-server example.com AXFR
Keepalived状态检查:
ip addr show eth0
自动化监控建议:
Anycast部署:在多个数据中心部署DNS服务器,使用BGP宣告相同IP
DNS负载均衡:使用NLB或专用DNS负载均衡器
DNSSEC配置:增强安全性
响应策略区域(RPZ):实现DNS防火墙功能
区域传输失败:
Keepalived VIP不漂移:
高负载问题:
以上配置可根据实际网络环境和需求进行调整,建议在生产环境部署前进行充分测试。