CE(DNS服务器)
映射为计算机可识别的 IP 地址(如 192.168.48.130),同时支持反向映射(IP→域名)。DNS(Domain Name System)是互联网的核心基础设施,核心解决。增量传送是主服务器数据修改后,从服务器仅同步变化的部分(无需全量同步),核心是。新增从服务器的 NS 和 A 记录(关键!预期结果:从服务器返回与主服务器完全一致的解析结果。主配置文件控制 BIND 的全局运行参数,默
一、DNS 核心原理深度解析
1.1 DNS 的本质与价值
DNS(Domain Name System)是互联网的核心基础设施,核心解决IP 地址难记忆的问题 —— 将人类易理解的域名(如www.openlab.com)映射为计算机可识别的 IP 地址(如 192.168.48.130),同时支持反向映射(IP→域名)。
- 无 DNS 的互联网:用户需输入
14.215.177.38才能访问百度,记忆成本极高; - 有 DNS 的互联网:输入
www.baidu.com即可,DNS 自动完成 “翻译”。
1.2 DNS 核心特性
1.2.1 端口与协议
- 监听端口:53(UDP/TCP 共用);
- 协议选择逻辑:
- 优先 UDP:轻量、快速,适用于普通查询(单次请求 / 响应,数据量小);
- 切换 TCP:UDP 查询无完整结果时(如区域传送、长报文),TCP 保证数据完整性。
1.2.2 域名层次结构(树状)
| 层级 | 示例 | 说明 |
|---|---|---|
| 根域名 | .(隐藏在域名末尾) |
全球 13 台 IPv4 根服务器,我国 “雪人计划” 部署 4 台 IPv6 根服务器 |
| 顶级域名 | .com/.cn/.org |
管理二级域名注册,如.com由 Verisign 管理 |
| 二级域名 | openlab.com |
企业 / 个人注册的核心域名 |
| 三级域名 | www.openlab.com |
二级域名下的子域名,可自定义 |
1.2.3 域名服务器类型(功能详解)
| 服务器类型 | 核心作用 | 应用场景 |
|---|---|---|
| 根域名服务器 | 全球最高层级,不直接解析域名,仅返回顶级域名服务器地址 | 所有 DNS 解析的 “总指引” |
| 顶级域名服务器 | 管理对应顶级域名下的二级域名,返回权威域名服务器地址 | 解析openlab.com时指向其注册商 DNS |
| 权威域名服务器 | 存储特定域名的解析记录(A/NS/MX 等),返回最终解析结果 | 企业自建 / 域名商提供的 DNS |
| 本地域名服务器 | 接收本机 / 内网主机的 DNS 查询请求,优先查缓存,无结果则递归 / 迭代查询 | 企业内网网关、运营商 DNS 节点 |
| 主服务器(Master) | 维护特定区域的解析记录,是解析数据的 “唯一写入口” | 企业核心 DNS 节点 |
| 从服务器(Slave) | 从主服务器同步解析记录,只读,主服务器宕机时接替服务 | 高可用部署、负载均衡 |
| 缓存服务器 | 缓存频繁查询的解析结果,不存储原始记录,加速重复查询 | 内网出口、CDN 节点 |
1.3 DNS 解析流程(逐步拆解)
以www.openlab.com解析为例,完整流程如下:
步骤 1:浏览器本地缓存查询
- 浏览器会缓存近期访问的域名解析结果,缓存时长由域名的 TTL(生存时间)决定(默认几分钟到几小时);
- 若缓存命中,直接返回 IP,解析结束;未命中则进入步骤 2。
步骤 2:操作系统缓存 /hosts 文件查询
- Linux:检查
/etc/hosts文件(手动配置的域名 - IP 映射); - Windows:检查
C:\Windows\System32\drivers\etc\hosts; - 若 hosts 中有
www.openlab.com 192.168.48.130,直接返回;未命中则进入步骤 3。
步骤 3:本地 DNS 服务器查询(核心环节)
- 操作系统将查询请求发送到网络配置中指定的本地 DNS 服务器(如企业内网 DNS:192.168.48.130);
- 本地 DNS 优先查自身缓存,命中则返回;未命中则触发递归查询(客户端→本地 DNS)+ 迭代查询(DNS 服务器之间):
- 本地 DNS 向根服务器发送查询请求:“请问www.openlab.com的 IP 是多少?”;
- 根服务器返回:“我不知,但.com 顶级域名服务器地址是 XXX,你问它”;
- 本地 DNS 向 **.com 顶级服务器 ** 发送请求;
- 顶级服务器返回:“openlab.com的权威 DNS 服务器是 XXX,你问它”;
- 本地 DNS 向openlab.com权威服务器发送请求;
- 权威服务器返回:“www.openlab.com的 IP 是 192.168.48.130”;
- 本地 DNS 缓存该结果(TTL 时长),并返回给客户端。
关键区别:递归 vs 迭代
| 类型 | 发起方 | 行为特征 |
|---|---|---|
| 递归查询 | 客户端→本地 DNS | 客户端只发 1 次请求,本地 DNS 必须返回最终结果(无论自己查还是找其他服务器) |
| 迭代查询 | DNS 服务器之间 | 每台服务器只返回 “下一跳” 地址,本地 DNS 需依次查询,直到拿到结果 |
1.4 常用公共 DNS(补充)
| DNS 地址 | 所属机构 | 特点 | 适用场景 |
|---|---|---|---|
| 114.114.114.114 | 国内运营商 | 无广告、解析快、国内适配好 | 国内用户日常使用 |
| 223.5.5.5/223.6.6.6 | 阿里云 | 稳定、抗污染 | 企业 / 个人均可 |
| 8.8.8.8/8.8.4.4 | 全球通用 | 访问国外网站 |
二、DNS 服务器搭建(基于 BIND,CentOS/Euler 系统)
2.1 环境准备(极致细节版)
2.1.1 基础环境清理(服务端 + 客户端)
# 关闭SELinux(临时生效,重启失效;永久关闭需修改/etc/selinux/config)
setenforce 0
# 关闭防火墙(临时生效,重启失效;永久关闭:systemctl disable firewalld)
systemctl stop firewalld
systemctl disable firewalld
# 检查防火墙状态(确保关闭)
systemctl status firewalld
# 检查SELinux状态(确保为Permissive)
getenforce
2.1.2 安装 BIND 软件(仅服务端)
# 安装BIND主程序及依赖
yum install bind bind-utils -y
# 验证安装(查看版本)
named -v
# 检查BIND服务状态(默认未启动)
systemctl status named
2.1.3 配置静态 IP(服务端 + 客户端)
| 角色 | IP 地址 | 网关 | DNS 地址 |
|---|---|---|---|
| 服务端 | 192.168.48.130/24 | 192.168.48.2 | 114.114.114.114(自测) |
| 客户端 | 192.168.48.131/24 | 192.168.48.2 | 192.168.48.130(服务端) |
# ====== 服务端配置 ======
# 修改网卡配置(ens32为网卡名,根据实际修改)
nmcli connection modify ens32 \
ipv4.method manual \
ipv4.addresses 192.168.48.130/24 \
ipv4.gateway 192.168.48.2 \
ipv4.dns 114.114.114.114
# 重新加载网卡配置
nmcli connection reload
# 激活网卡
nmcli connection up ens32
# 验证IP配置
ip addr show ens32
# ====== 客户端配置 ======
nmcli connection modify ens32 \
ipv4.method manual \
ipv4.addresses 192.168.48.131/24 \
ipv4.gateway 192.168.48.2 \
ipv4.dns 192.168.48.130
nmcli connection reload
nmcli connection up ens32
ip addr show ens32
2.2 正向解析配置(逐行注释版)
正向解析核心:将www.openlab.com映射为192.168.48.130。
步骤 1:修改 BIND 主配置文件(/etc/named.conf)
主配置文件控制 BIND 的全局运行参数,默认路径/etc/named.conf,共 59 行左右,关键修改如下:
vim /etc/named.conf
修改后核心内容
options {
# 监听53端口的IP:any表示允许所有IP访问,也可写具体IP(如192.168.48.130)
listen-on port 53 { any; };
# IPv6监听(无需则注释)
# listen-on-v6 port 53 { ::1; };
# DNS数据文件存储目录(默认/var/named,不可随意改)
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";
# 允许查询的客户端:any表示所有客户端,也可写网段(如192.168.48.0/24)
allow-query { any; };
# 开启递归查询(本地DNS核心功能,必须开启)
recursion yes;
# DNSSEC加密(新手可关闭,避免解析失败)
dnssec-validation no;
# 密钥管理目录(默认)
managed-keys-directory "/var/named/dynamic";
# PID文件路径(默认)
pid-file "/run/named/named.pid";
# 会话密钥文件(默认)
session-keyfile "/run/named/session.key";
};
# 日志配置(默认,无需修改)
logging {
channel default_debug {
file "data/named.run";
severity dynamic;
};
};
# 根服务器配置(默认,指向/var/named/named.ca,包含13台根服务器地址)
zone "." IN {
type hint;
file "named.ca";
};
# 引入区域配置文件(核心,所有解析区域都在这里配置)
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
步骤 2:修改区域配置文件(/etc/named.rfc1912.zones)
区域配置文件是 “解析目录”,定义哪些域名由本服务器解析,以及解析数据文件的位置:
vim /etc/named.rfc1912.zones
添加正向解析区域:
# 正向解析区域:openlab.com
zone "openlab.com" IN {
type master; # 服务器类型:master(主服务器)
file "openlab.com.zone"; # 解析数据文件名称(存储在/var/named/下)
allow-update { none; }; # 禁止动态更新(新手必设,避免被篡改)
allow-transfer { none; }; # 暂时禁止区域传送(主从配置时再改)
};
步骤 3:创建正向解析数据文件(核心)
解析数据文件存储具体的 “域名→IP” 映射,需基于模板文件修改(保留文件权限):
# 切换到数据文件目录
cd /var/named
# 拷贝模板文件(-a:保留权限、属主、时间戳等所有属性)
cp -a named.localhost openlab.com.zone
# 编辑数据文件
vim openlab.com.zone
数据文件完整内容:
$TTL 1D # 缓存生存时间(1D=1天,可改:1H=1小时,30M=30分钟)
# SOA记录:起始授权记录,整个区域的核心
@ IN SOA ns.openlab.com. admin.openlab.com. (
2024052001 ; serial(序列号,必须是10位以内整数,增量更新时需+1)
1D ; refresh(从服务器同步间隔:1天)
1H ; retry(同步失败后重试间隔:1小时)
1W ; expire(同步失败后,从服务器保留数据的时长:1周)
3H ) ; minimum(缓存最小值:3小时)
# NS记录:域名服务器记录,指定openlab.com由哪个DNS服务器解析
@ IN NS ns.openlab.com.
# A记录:IPv4地址映射,核心解析记录
ns IN A 192.168.48.130 # ns.openlab.com → 192.168.48.130
www IN A 192.168.48.130 # www.openlab.com → 192.168.48.130
ftp IN A 192.168.48.130 # ftp.openlab.com → 192.168.48.130
bbs IN A 192.168.48.130 # bbs.openlab.com → 192.168.48.130
# CNAME记录:别名记录,www1是www的别名
www1 IN CNAME www # www1.openlab.com → www.openlab.com
关键说明:
@:代表当前区域(openlab.com),等价于openlab.com.(末尾的点必须加,代表根域名);ns.openlab.com.:末尾的点不可省略,否则会被解析为ns.openlab.com.openlab.com;serial:序列号是增量更新的核心,每次修改数据文件后必须 + 1,否则从服务器不会同步。
步骤 4:权限检查与服务重启
# 检查数据文件权限(必须是named:named,否则BIND无法读取)
ls -l /var/named/openlab.com.zone
# 若权限不对,修改:
chown named:named /var/named/openlab.com.zone
# 检查配置文件语法(关键!语法错误会导致服务启动失败)
named-checkconf /etc/named.conf
named-checkzone openlab.com /var/named/openlab.com.zone
# 重启BIND服务
systemctl restart named
# 设置开机自启
systemctl enable named
# 检查服务状态(确保running)
systemctl status named
步骤 5:客户端测试(多种方式)
# 方式1:nslookup(最常用)
nslookup www.openlab.com
# 预期输出:
# Server: 192.168.48.130
# Address: 192.168.48.130#53
# Name: www.openlab.com
# Address: 192.168.48.130
# 方式2:dig(更详细)
dig www.openlab.com
# 重点看ANSWER SECTION:
# ;; ANSWER SECTION:
# www.openlab.com. 86400 IN A 192.168.48.130
# 方式3:host
host ftp.openlab.com
# 预期输出:
# ftp.openlab.com has address 192.168.48.130
# 方式4:测试别名
nslookup www1.openlab.com
# 预期输出:
# www1.openlab.com canonical name = www.openlab.com.
# Name: www.openlab.com
# Address: 192.168.48.130
2.3 反向解析配置(IP→域名)
反向解析核心:将192.168.48.130映射为www.openlab.com/ns.openlab.com等。
步骤 1:修改区域配置文件(/etc/named.rfc1912.zones)
vim /etc/named.rfc1912.zones
添加反向解析区域:
# 反向解析区域:192.168.48.0/24网段
# 区域名规则:IP段反向书写 + .in-addr.arpa
zone "48.168.192.in-addr.arpa" IN {
type master;
file "192.168.48.arpa"; # 反向解析数据文件
allow-update { none; };
};
步骤 2:创建反向解析数据文件
cd /var/named
# 拷贝反向解析模板(named.loopback)
cp -a named.loopback 192.168.48.arpa
# 编辑数据文件
vim 192.168.48.arpa
数据文件完整内容:
$TTL 1D
@ IN SOA ns.openlab.com. jenny.qq.com. (
2024052001 ; serial(序列号,需唯一)
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
# NS记录:指定反向解析的DNS服务器
@ IN NS ns.openlab.com.
# A记录:DNS服务器的IP(必须)
ns IN A 192.168.48.130
# PTR记录:反向解析核心,IP最后一段 → 域名
130 IN PTR ns.openlab.com. # 192.168.48.130 → ns.openlab.com
130 IN PTR www.openlab.com. # 192.168.48.130 → www.openlab.com
130 IN PTR ftp.openlab.com. # 192.168.48.130 → ftp.openlab.com
关键说明:
- 区域名
48.168.192.in-addr.arpa对应192.168.48.0/24网段; - PTR 记录中,
130是 IP 的最后一段(192.168.48.130),无需写完整 IP; - 域名末尾的点不可省略。
步骤 3:权限检查与服务重启
# 检查权限
ls -l /var/named/192.168.48.arpa
chown named:named /var/named/192.168.48.arpa
# 检查语法
named-checkzone 48.168.192.in-addr.arpa /var/named/192.168.48.arpa
# 重启服务
systemctl restart named
步骤 4:客户端测试反向解析
# 方式1:nslookup
nslookup 192.168.48.130
# 预期输出:
# Server: 192.168.48.130
# Address: 192.168.48.130#53
# 130.48.168.192.in-addr.arpa name = www.openlab.com.
# 130.48.168.192.in-addr.arpa name = ftp.openlab.com.
# 130.48.168.192.in-addr.arpa name = ns.openlab.com.
# 方式2:dig
dig -x 192.168.48.130
# 重点看ANSWER SECTION:
# ;; ANSWER SECTION:
# 130.48.168.192.in-addr.arpa. 86400 IN PTR www.openlab.com.
# 130.48.168.192.in-addr.arpa. 86400 IN PTR ftp.openlab.com.
三、DNS 主从服务器部署(高可用)
3.1 主从架构核心价值
- 高可用:主服务器宕机后,从服务器自动接替解析;
- 负载均衡:客户端可随机访问主 / 从服务器,分摊压力;
- 数据备份:从服务器同步主服务器的解析记录,避免数据丢失。
3.2 环境准备
| 角色 | IP 地址 | 服务器类型 |
|---|---|---|
| 主服务器 | 192.168.48.130 | Master |
| 从服务器 | 192.168.48.131 | Slave |
前置要求:
- 主从服务器时间同步(执行
ntpdate ntp.aliyun.com); - 主从服务器 BIND 版本一致;
- 主服务器已配置好正 / 反向解析。
3.3 主服务器配置(192.168.48.130)
步骤 1:修改主配置文件(允许从服务器访问)
vim /etc/named.conf
确保以下参数正确:
listen-on port 53 { any; };
allow-query { any; };
recursion yes;
步骤 2:修改区域配置文件(允许区域传送)
vim /etc/named.rfc1912.zones
修改正向 / 反向区域,添加allow-transfer(允许从服务器同步):
# 正向解析区域
zone "openlab.com" IN {
type master;
file "openlab.com.zone";
allow-transfer { 192.168.48.131; }; # 仅允许从服务器同步
};
# 反向解析区域
zone "48.168.192.in-addr.arpa" IN {
type master;
file "192.168.48.arpa";
allow-transfer { 192.168.48.131; }; # 从服务器IP
};
步骤 3:更新主服务器解析数据文件(添加从服务器记录)
vim /var/named/openlab.com.zone
新增从服务器的 NS 和 A 记录(关键!否则从服务器可能同步失败):
$TTL 1D
@ IN SOA ns.openlab.com. admin.openlab.com. (
2024052001 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
@ IN NS ns.openlab.com. # 主服务器NS
@ IN NS slave.openlab.com. # 从服务器NS
ns IN A 192.168.48.130 # 主服务器IP
slave IN A 192.168.48.131 # 从服务器IP
www IN A 192.168.48.130
ftp IN A 192.168.48.130
www1 IN CNAME www
步骤 4:重启主服务器服务
# 检查语法
named-checkconf
named-checkzone openlab.com /var/named/openlab.com.zone
# 重启服务
systemctl restart named
3.4 从服务器配置(192.168.48.131)
步骤 1:安装 BIND 并配置基础环境
# 关闭SELinux和防火墙
setenforce 0
systemctl stop firewalld
systemctl disable firewalld
# 安装BIND
yum install bind bind-utils -y
# 配置静态IP(同前,IP为192.168.48.131)
nmcli connection modify ens32 \
ipv4.method manual \
ipv4.addresses 192.168.48.131/24 \
ipv4.gateway 192.168.48.2 \
ipv4.dns 192.168.48.131
nmcli connection reload
nmcli connection up ens32
步骤 2:修改从服务器主配置文件
vim /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;
dnssec-validation no;
managed-keys-directory "/var/named/dynamic";
pid-file "/run/named/named.pid";
session-keyfile "/run/named/session.key";
};
logging {
channel default_debug {
file "data/named.run";
severity dynamic;
};
};
zone "." IN {
type hint;
file "named.ca";
};
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
步骤 3:修改从服务器区域配置文件
vim /etc/named.rfc1912.zones
清空原有内容,添加从服务器区域配置:
# 正向解析从区域
zone "openlab.com" IN {
type slave; # 服务器类型:slave(从)
masters { 192.168.48.130; }; # 主服务器IP
file "slaves/openlab.com.zone"; # 同步的数据文件存储位置(自动生成)
};
# 反向解析从区域
zone "48.168.192.in-addr.arpa" IN {
type slave;
masters { 192.168.48.130; };
file "slaves/192.168.48.arpa";
};
关键说明:
type slave:必须设为 slave,不可改;masters:指定主服务器 IP,可写多个(逗号分隔);file:同步的数据文件会自动保存到/var/named/slaves/下,无需手动创建。
步骤 4:启动从服务器 BIND 服务(自动同步)
# 检查语法
named-checkconf
# 启动服务(首次启动会自动从主服务器同步数据)
systemctl start named
systemctl enable named
# 查看同步结果(slaves目录下会出现同步的文件)
ls /var/named/slaves/
# 预期输出:openlab.com.zone 192.168.48.arpa
3.5 完全区域传送测试(从服务器)
# 测试正向解析
nslookup www.openlab.com 192.168.48.131
# 测试反向解析
nslookup 192.168.48.130 192.168.48.131
预期结果:从服务器返回与主服务器完全一致的解析结果。
3.6 增量区域传送(仅同步变化)
增量传送是主服务器数据修改后,从服务器仅同步变化的部分(无需全量同步),核心是序列号 + 1。
步骤 1:主服务器修改解析数据文件
vim /var/named/openlab.com.zone
修改内容(新增 MX 记录、调整序列号):
$TTL 1D
@ IN SOA ns.openlab.com. admin.openlab.com. (
2024052002 ; serial(必须+1,从2024052001→2024052002)
1H ; refresh(改小为1小时,加速同步)
1H ; retry
1W ; expire
3H ) ; minimum
@ IN NS ns.openlab.com.
@ IN NS slave.openlab.com.
@ IN MX 8 mail.openlab.com. # 新增MX记录(邮件服务器)
ns IN A 192.168.48.130
slave IN A 192.168.48.131
www IN A 192.168.48.130
ftp IN A 192.168.48.130
mail IN A 192.168.48.130 # 新增mail的A记录
www1 IN CNAME www
步骤 2:主服务器重启服务
systemctl restart named
步骤 3:从服务器重启服务(触发增量同步)
systemctl restart named
# 查看slaves目录下的文件时间(会更新)
ls -l /var/named/slaves/openlab.com.zone
步骤 4:从服务器测试增量同步结果
# 测试新增的mail记录
nslookup mail.openlab.com 192.168.48.131
# 预期输出:
# Server: 192.168.48.131
# Address: 192.168.48.131#53
# Name: mail.openlab.com
# Address: 192.168.48.130
四、常见问题与排错技巧
4.1 服务启动失败
- 原因 1:配置文件语法错误 → 解决:
named-checkconf检查语法,修正错误; - 原因 2:数据文件权限错误 → 解决:
chown named:named /var/named/xxx.zone; - 原因 3:端口 53 被占用 → 解决:
netstat -tulnp | grep 53查看占用进程,杀死或停止对应服务。
4.2 解析失败
- 原因 1:客户端 DNS 未指向服务器 → 解决:检查客户端
/etc/resolv.conf,确保 nameserver 是 DNS 服务器 IP; - 原因 2:SELinux 未关闭 → 解决:
setenforce 0,或添加 SELinux 规则; - 原因 3:数据文件中域名末尾缺 “.” → 解决:补全域名末尾的点(如
ns.openlab.com.); - 原因 4:从服务器序列号未 + 1 → 解决:主服务器数据文件的 serial 字段必须大于之前的值。
4.3 主从同步失败
- 原因 1:主服务器未配置
allow-transfer→ 解决:在主服务器区域配置中添加allow-transfer { 从服务器IP; };; - 原因 2:主服务器未添加从服务器的 NS/A 记录 → 解决:在主服务器数据文件中新增从服务器的 NS 和 A 记录;
- 原因 3:主从服务器网络不通 → 解决:ping 测试,确保 53 端口可访问(
telnet 主服务器IP 53)。
五、关键注意事项
- 数据文件中
serial序列号必须唯一且递增,增量更新时必须 + 1; - 所有域名末尾的点(.)不可省略,否则会导致解析错误;
- BIND 数据文件的属主必须是
named:named,否则服务无法读取; - 生产环境中建议开启 DNSSEC 加密(新手可先关闭);
- 主从服务器需保持时间同步,否则区域传送可能失败;
- 缓存时间(TTL)不宜设置过长(如 1 天),否则域名解析变更后,客户端需等待缓存过期才能生效。
更多推荐



所有评论(0)