在Linux系统中,DNS(域名系统)服务是网络基础设施的核心组成部分,它负责将人类可读的域名转换为机器可识别的IP地址,本文将详细介绍如何在CentOS操作系统上搭建外部DNS和内部DNS服务器,涵盖环境准备、安装配置、测试验证等关键步骤,确保服务的高可用性和安全性。

环境准备与基础配置
在开始搭建DNS服务前,需确保系统满足基本要求:CentOS 7或更高版本版本,root权限或具备sudo权限的用户账户,以及稳定的网络环境,更新系统软件包并安装必要的依赖工具:
sudo yum update -y sudo yum install bind bind-utils -y
Bind(Berkeley Internet Name Domain)是应用最广泛的DNS软件实现,包含DNS服务器(named)和客户端工具(如nslookup、dig),安装完成后,检查named服务状态并设置为开机启动:
sudo systemctl status named sudo systemctl enable --now named
外部DNS服务器配置
外部DNS主要用于解析公共域名,需遵循互联网DNS标准规范,配置过程主要包括修改主配置文件、定义区域文件及配置转发器。
修改主配置文件
编辑/etc/named.conf,确保全局配置正确:
options {
    listen-on port 53 { any; };  # 监听所有网络接口
    listen-on-v6 port 53 { ::1; };
    directory       "/var/named";
    dump-file       "/var/named/data/cache_dump.db";
    statistics-file "/var/named/data/named_stats.txt";
    memstatistics-file "/var/named/data/named_mem_stats.txt";
    allow-query     { any; };  # 允许所有客户端查询(生产环境需限制)
    recursion yes;
    forwarders { 8.8.8.8; 8.8.4.4; }; # 转发非本域查询到公共DNS
};
定义正向与反向区域
假设需要解析example.com域,创建正向区域文件/var/named/example.com.zone:
$TTL 86400
@   IN  SOA ns1.example.com. admin.example.com. (
        2025100101  ; Serial
        3600        ; Refresh
        1800        ; Retry
        604800      ; Expire
        86400 )     ; Minimum TTL
    IN  NS  ns1.example.com.
    IN  MX  10 mail.example.com.
ns1 IN  A   203.0.113.10
www IN  A   203.0.113.20
反向区域文件/var/named/113.0.203.in-addr.arpa用于IP到域名的反向解析:

$TTL 86400
@   IN  SOA ns1.example.com. admin.example.com. (
        2025100101  ; Serial
        3600        ; Refresh
        1800        ; Retry
        604800      ; Expire
        86400 )
    IN  NS  ns1.example.com.
10  IN  PTR ns1.example.com.
20  IN  PTR www.example.com.
配置区域声明
在/etc/named.conf中添加区域定义:
zone "example.com" IN {
    type master;
    file "example.com.zone";
    allow-update { none; };
};
zone "113.0.203.in-addr.arpa" IN {
    type master;
    file "113.0.203.in-addr.arpa";
    allow-update { none; };
};
内部DNS服务器配置
内部DNS主要用于企业内网域名解析,可自定义内部域名(如internal.local),并支持动态更新(需配合DHCP)。
安全配置优化
限制内部DNS查询仅允许内网IP段(如168.1.0/24):
options {
    listen-on port 53 { 192.168.1.1; 127.0.0.1; }; # 仅监听内网IP和本地
    allow-query { 192.168.1.0/24; localhost; };
    allow-transfer { none; };  # 禁止区域传输(或指定信任服务器)
};
内部区域配置
创建内部正向区域internal.local:
$TTL 3600
@   IN  SOA ns1.internal.local. admin.internal.local. (
        2025100101  ; Serial
        3600        ; Refresh
        1800        ; Retry
        604800      ; Expire
        3600 )
    IN  NS  ns1.internal.local.
    IN  A   192.168.1.1
ns1 IN  A   192.168.1.1
db1 IN  A   192.168.1.10
printer IN  A  192.168.1.100
启用日志记录
在/etc/named.conf中添加日志配置,便于故障排查:
logging {
    channel default_log {
        file "/var/log/named/named.log" versions 3 size 5m;
        severity info;
        print-time yes;
    };
    category default { default_log; };
};
测试与验证
配置完成后,重启named服务并测试解析功能:

sudo systemctl restart named # 测试外部域名解析 dig @203.0.113.10 www.example.com # 测试内部域名解析 dig @192.168.1.1 db1.internal.local # 测试反向解析 dig -x 203.0.113.20 @203.0.113.10
使用named-checkconf和named-checkzone检查配置文件语法正确性:
named-checkconf named-checkzone example.com /var/named/example.com.zone
安全加固建议
- 访问控制:通过
allow-query和allow-transfer限制查询和传输范围。 - TSIG认证:主从DNS服务器间使用TSIG密钥进行安全认证。
 - 防火墙配置:仅开放53端口(TCP/UDP)给授权客户端:
sudo firewall-cmd --permanent --add-service=dns sudo firewall-cmd --reload
 - 定期更新:及时更新Bind软件包以修复安全漏洞。
 
相关FAQs
Q1: 如何配置DNS主从服务器以实现高可用?
A1: 在从服务器上安装Bind后,编辑/etc/named.conf,添加从区域声明并指定主服务器IP:
zone "example.com" IN {
    type slave;
    masters { 203.0.113.10; };
    file "slaves/example.com.zone";
};
启动从服务器后,区域文件会自动同步到/var/named/slaves/目录,通过rndc reload重载配置,并检查/var/log/messages确认同步状态。
Q2: 内部DNS如何实现动态更新(DDNS)?
A2: 1. 在主配置文件中启用动态更新:
zone "internal.local" IN {
    type master;
    file "dynamic/internal.local.db";
    allow-update { key "internal-key"; };
};
- 生成TSIG密钥并添加到
/etc/named.conf:key "internal-key" { algorithm hmac-sha256; secret "生成的Base64密钥"; }; - 在DHCP服务器配置中添加
ddns-update-style interim和key选项,使DHCP客户端在获取IP时自动更新DNS记录。