一、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 服务器之间)
    1. 本地 DNS 向根服务器发送查询请求:“请问www.openlab.com的 IP 是多少?”;
    2. 根服务器返回:“我不知,但.com 顶级域名服务器地址是 XXX,你问它”;
    3. 本地 DNS 向 **.com 顶级服务器 ** 发送请求;
    4. 顶级服务器返回:“openlab.com的权威 DNS 服务器是 XXX,你问它”;
    5. 本地 DNS 向openlab.com权威服务器发送请求;
    6. 权威服务器返回:“www.openlab.com的 IP 是 192.168.48.130”;
    7. 本地 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 Google 全球通用 访问国外网站

二、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)。

五、关键注意事项

  1. 数据文件中serial序列号必须唯一且递增,增量更新时必须 + 1;
  2. 所有域名末尾的点(.)不可省略,否则会导致解析错误;
  3. BIND 数据文件的属主必须是named:named,否则服务无法读取;
  4. 生产环境中建议开启 DNSSEC 加密(新手可先关闭);
  5. 主从服务器需保持时间同步,否则区域传送可能失败;
  6. 缓存时间(TTL)不宜设置过长(如 1 天),否则域名解析变更后,客户端需等待缓存过期才能生效。
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐