插件窝 干货文章 如何在Linux上配置高可用的DNS集群

如何在Linux上配置高可用的DNS集群

Keepalived 配置 服务器 example 256    来源:    2025-04-15

Linux高可用DNS集群配置指南

方案概述

在Linux上配置高可用DNS集群通常采用主从架构结合负载均衡或Anycast技术,以下是几种常见方案:

  1. BIND主从复制+Keepalived
  2. PowerDNS集群+数据库后端
  3. NSD/Unbound+Anycast BGP

下面以最常用的BIND+Keepalived方案为例进行详细说明。

方案一:BIND主从复制+Keepalived

1. 系统准备

  • 至少两台Linux服务器(推荐CentOS/RHEL 8+或Ubuntu 20.04+)
  • 确保服务器间网络互通
  • 同步系统时间(NTP服务)

2. 安装BIND

# CentOS/RHEL
sudo yum install bind bind-utils -y

# Ubuntu/Debian
sudo apt install bind9 bind9utils -y

3. 主DNS服务器配置

编辑主配置文件 /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

4. 从DNS服务器配置

编辑 /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; };
};

5. 配置Keepalived实现VIP漂移

在两台服务器上安装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
    }
}

6. 启动服务

# 主服务器
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

方案二:PowerDNS集群+数据库后端

1. 安装PowerDNS和数据库后端

# CentOS/RHEL
sudo yum install pdns pdns-backend-mysql mariadb-server

# Ubuntu/Debian
sudo apt install pdns-server pdns-backend-mysql mysql-server

2. 配置MySQL/MariaDB

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

3. 配置PowerDNS

编辑 /etc/pdns/pdns.conf

launch=gmysql
gmysql-host=localhost
gmysql-user=pdns
gmysql-password=password
gmysql-dbname=pdns

4. 配置多台PowerDNS服务器指向同一数据库

监控与维护

  1. 日志监控

    journalctl -u named -f
    
  2. 区域文件同步检查

    dig @slave-server example.com AXFR
    
  3. Keepalived状态检查

    ip addr show eth0
    
  4. 自动化监控建议

    • 使用Prometheus+Granfana监控DNS查询量、响应时间
    • 设置Zabbix/Nagios监控服务状态

高级优化

  1. Anycast部署:在多个数据中心部署DNS服务器,使用BGP宣告相同IP

  2. DNS负载均衡:使用NLB或专用DNS负载均衡器

  3. DNSSEC配置:增强安全性

  4. 响应策略区域(RPZ):实现DNS防火墙功能

常见问题解决

  1. 区域传输失败

    • 检查主从服务器allow-transfer设置
    • 检查防火墙是否放行TCP/53端口
  2. Keepalived VIP不漂移

    • 检查VRRP通信是否正常
    • 检查网络接口配置
  3. 高负载问题

    • 启用查询缓存
    • 考虑部署DNS分发器

以上配置可根据实际网络环境和需求进行调整,建议在生产环境部署前进行充分测试。