DNS 服务从入门到实战:小白也能看懂的完整教程
一、DNS 是什么?(先搞懂核心概念)
1. 基本概念
DNS(Domain Name Service,域名服务)是一套分布式的域名解析系统 ,就像互联网的 "电话簿"------ 把好记的域名(比如 www.baidu.com)转换成机器能识别的 IP 地址(比如 192.168.1.1),让我们不用记复杂的数字就能访问网站。
它的特点是:全球分布多台服务器,每台存储部分域名 - IP 映射,且数据动态更新,所有网络客户端都靠它查询目标主机 IP。
2. 核心作用
- 正向解析:把已知域名 → 解析成对应 IP(最常用,比如输入域名访问网站)
- 反向解析:把已知 IP → 解析成对应域名(比如邮件服务器验证发件人真实性)
3. 关键基础信息
- 监听端口:53(UDP 用于普通查询,TCP 用于大数据传输 / 区域同步)
- 默认运行用户 :
named(服务启动后以此用户运行,保障权限安全) - FQDN(完全限定域名) :完整的域名格式,比如
dns.laozhangtou.com.(结尾带.表示绝对域名,避免系统自动拼接)
4. 域名组成(从右往左读)
一个完整 FQDN 由 4 部分组成:主机名.三级域.二级域.顶级域.例:dns.laozhangtou.com.
- 顶级域:
.com(商业域名,还有.cn(中国)、.org(组织)等) - 二级域:
laozhangtou(我们自己注册的域名) - 三级域:
dns(主机名,比如www、mail) - 主机名:
dns(具体服务器的名称)
5. 域类型
- 根域:
.(所有域名的起点,全球 13 组根服务器) - 顶级域(TLD):比如
.com、.cn - 二级域:比如
laozhangtou.com - 子域(三级域):比如
dns.laozhangtou.com
二、DNS 解析全过程(小白也能懂的 "查地址" 流程)
当你在浏览器输入 www.baidu.com 时,DNS 会按以下顺序帮你找 IP:
- 先查本地缓存:浏览器 / 操作系统会先查自己缓存的域名 - IP 映射(最近访问过的会存起来,快!)
- 再查本地 hosts 文件 :如果缓存没有,就看本地
C:\Windows\System32\drivers\etc\hosts(Windows)或/etc/hosts(Linux),这是 DNS 诞生前的 "原始映射表" - 最后查指向的 DNS 服务器:如果前两步都没有,就向你网络配置里的 DNS 服务器(比如 114.114.114.114)发起查询
查询分类(两种核心方式)
- 递归查询 :客户机 ↔ 本地 DNS 服务器(你问本地 DNS"帮我找
www.baidu.com的 IP",本地 DNS 直接给你最终结果,不用你自己跑遍全球服务器) - 迭代查询 :本地 DNS 服务器 ↔ 根 / 顶级 / 权限服务器(本地 DNS 找不到时,会问根服务器 "谁管
.com?",再问顶级域 "谁管baidu.com?",一步步找到答案,再返回给你)
三、域名服务器分类(不同角色分工不同)
按 "层级作用" 分
- 根域名服务器:全球最高层次、最重要的服务器,知道所有顶级域服务器的域名和 IP,是所有查询的 "起点"
- 顶级域名服务器 :管理对应顶级域下的所有二级域(比如
.com服务器管所有xxx.com域名) - 权限域名服务器 :负责一个具体 "区域" 的解析(比如我们自己搭建的 DNS 服务器,管
laozhangtou.com这个域) - 本地域名服务器:我们日常网络配置里的 DNS(比如家里路由器的 DNS、运营商 DNS),帮我们转发查询请求,不属于层级结构但至关重要
按 "应用场景" 分
- 主服务器(Master):存储域名解析的 "原始数据",是提供解析的核心,所有修改都在主服务器上做
- 辅助服务器(Slave / 从服务器):从主服务器同步解析数据,当主服务器宕机时,顶替主服务器提供解析,保障服务高可用
- 高速缓存服务器:不存储原始解析数据,只缓存用户常用的域名 - IP 映射,提升下次解析速度(比如运营商的公共 DNS 大多是缓存服务器)
四、实战:搭建 DNS 主服务器(小白一步一步跟着做)
前置准备
- 系统:CentOS/RHEL 系列(本文以 CentOS 7 为例)
- 目标:搭建主 DNS 服务器,实现
laozhangtou.com域名的正向解析,以及192.168.111.x网段的反向解析 - 服务器 IP:
192.168.111.137(主服务器)
步骤 1:安装 bind 软件包(DNS 服务的核心程序)
bind 是 Linux 下最常用的 DNS 服务程序,直接用 yum 安装:
运行
yum install -y bind
安装后核心文件(必看!)
执行 rpm -ql bind 查看所有文件,重点记住这几个:
| 文件路径 | 作用 |
|---|---|
/etc/named.conf |
DNS 服务主配置文件(全局配置,比如监听 IP、允许查询的范围) |
/etc/named.rfc1912.zones |
区域配置文件(定义要解析的域名 / 反向网段,以及对应的区域文件) |
/var/named/ |
区域文件存储目录(存放具体的域名 - IP 映射数据) |
/var/named/named.ca |
可信根域名服务器列表(不要改!) |
/var/named/named.empty |
区域文件模板(复制它来创建自己的区域文件) |
/var/named/slaves |
从服务器同步数据的存储目录 |
步骤 2:修改主配置文件 /etc/named.conf
用 vim 编辑主配置文件:
运行
vim /etc/named.conf
关键修改点(对照下面示例改)
运行
options {
# 1. 监听端口 53 的 IP:改成主服务器自己的 IP(192.168.111.137)
listen-on port 53 { 192.168.111.137; };
listen-on-v6 port 53 { ::1; }; # IPv6 监听,默认即可
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";
recursing-file "/var/named/data/named.recursing";
secroots-file "/var/named/data/named.secroots";
# 2. 允许查询的范围:把 localhost 改成 any(允许所有客户端查询)
allow-query { any; };
recursion yes; # 开启递归查询(默认开启)
dnssec-enable yes;
dnssec-validation yes;
bindkeys-file "/etc/named.root.key";
managed-keys-directory "/var/named/dynamic";
pid-file "/run/named/named.pid";
session-keyfile "/run/named/session.key";
};
检查主配置文件语法(避免写错!)
运行
named-checkconf
- 没有输出 → 语法正确
- 有报错 → 按提示修改配置文件
步骤 3:修改区域配置文件 /etc/named.rfc1912.zones
这个文件用来定义 "要解析哪些域名 / 网段",以及 "对应的区域文件放在哪"。
先备份原文件(可选,防止改错):
运行
cp /etc/named.rfc1912.zones /etc/named.rfc1912.zones.bak
编辑文件:
运行
vim /etc/named.rfc1912.zones
添加正向解析区域(laozhangtou.com)
在文件末尾添加以下内容(注释掉其他无关模板):
运行
zone "laozhangtou.com" IN {
type master; # 类型:主服务器
file "laozhangtou.com.zhang"; # 区域文件名(存放在 /var/named/ 下)
allow-transfer { 192.168.111.15; }; # 允许从服务器(192.168.111.15)同步数据(后续搭从服务器用)
};
添加反向解析区域(192.168.111.x 网段)
反向区域的命名规则:网段倒序 + .in-addr.arpa ,比如 192.168.111.x → 111.168.192.in-addr.arpa继续在文件末尾添加:
运行
zone "111.168.192.in-addr.arpa" IN {
type master; # 类型:主服务器
file "192.168.111.zhang"; # 反向区域文件名(存放在 /var/named/ 下)
allow-transfer { 192.168.111.15; }; # 允许从服务器同步
};
检查区域配置文件语法
运行
# 检查正向区域
named-checkzone laozhangtou.com /var/named/laozhangtou.com.zhang
# 检查反向区域
named-checkzone 111.168.192.in-addr.arpa /var/named/192.168.111.zhang
- 输出
OK→ 语法正确 - 有报错 → 按提示修改区域配置
步骤 4:创建区域文件(核心解析数据)
区域文件是真正存储 "域名 - IP" 映射的地方,我们用模板文件复制,保留权限(避免权限错误)。
1. 进入区域文件目录
运行
cd /var/named/
2. 创建正向区域文件(laozhangtou.com.zhang)
复制模板文件(保留权限,-p 很重要!):
运行
cp -p named.empty laozhangtou.com.zhang
编辑正向区域文件:
运行
vim laozhangtou.com.zhang
写入以下内容(小白直接照抄,改对应 IP 即可):
运行
$TTL 3H # 缓存时间:3小时
@ IN SOA laozhangtou.com. admin.laozhangtou.com. (
2026020501 ; serial(序列号,主从同步用,每次修改+1,建议用日期+版本号)
1D ; refresh(从服务器刷新时间:1天)
1H ; retry(刷新失败重试时间:1小时)
1W ; expire(从服务器数据过期时间:1周)
3H ) ; minimum(最小缓存时间:3小时)
@ NS dns.laozhangtou.com. # NS 记录:指定该域的 DNS 服务器(结尾带 .)
dns A 192.168.111.137 # A 记录:dns.laozhangtou.com → 192.168.111.137(主服务器 IP)
www A 192.168.111.138 # A 记录:www.laozhangtou.com → 192.168.111.138(示例网站 IP)
mail A 192.168.111.139 # A 记录:mail.laozhangtou.com → 192.168.111.139(示例邮件服务器 IP)
3. 创建反向区域文件(192.168.111.zhang)
同样复制模板:
运行
cp -p named.empty 192.168.111.zhang
编辑反向区域文件:
运行
vim 192.168.111.zhang
写入以下内容(实现 IP → 域名的反向解析):
运行
$TTL 3H
@ IN SOA laozhangtou.com. admin.laozhangtou.com. (
2026020501 ; serial(和正向区域保持一致)
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
@ NS dns.laozhangtou.com. # NS 记录:和正向区域一致
137 PTR dns.laozhangtou.com. # PTR 记录:192.168.111.137 → dns.laozhangtou.com
138 PTR www.laozhangtou.com. # PTR 记录:192.168.111.138 → www.laozhangtou.com
139 PTR mail.laozhangtou.com. # PTR 记录:192.168.111.139 → mail.laozhangtou.com
关键注意事项(小白必看,避免踩坑)
- NS 记录、PTR 记录的域名结尾必须带
.(否则系统会自动拼接反向区域名,导致错误) - serial(序列号)必须是递增的数字(主从同步时,从服务器靠它判断是否需要更新数据)
- 区域文件的所有者必须是 named:named (复制时用
-p保留权限,或手动改:chown named:named 文件名)
步骤 5:再次检查所有配置(最后一步校验)
运行
# 1. 检查主配置文件
named-checkconf
# 2. 检查正向区域文件
named-checkzone laozhangtou.com /var/named/laozhangtou.com.zhang
# 3. 检查反向区域文件
named-checkzone 111.168.192.in-addr.arpa /var/named/192.168.111.zhang
全部无报错 → 准备启动服务!
步骤 6:启动 DNS 服务
运行
# 立即启动并设置开机自启
systemctl enable --now named.service
# 查看服务状态(确保 running)
systemctl status named.service
如果启动失败,用以下命令查看日志找原因:
运行
journalctl -xeu named.service
步骤 7:测试 DNS 解析(验证是否成功)
用 nslookup 或 dig 命令测试(客户端需将 DNS 指向主服务器 IP:192.168.111.137)
1. 正向解析测试(域名 → IP)
运行
nslookup www.laozhangtou.com 192.168.111.137
预期结果:返回 192.168.111.138
2. 反向解析测试(IP → 域名)
运行
nslookup 192.168.111.137 192.168.111.137
预期结果:返回 dns.laozhangtou.com
五、进阶:搭建 DNS 从服务器(保障高可用)
当主服务器宕机时,从服务器可以顶替它提供解析,步骤如下:
前置准备
- 从服务器 IP:
192.168.111.15 - 已完成主服务器配置(主服务器已允许从服务器同步数据)
步骤 1:从服务器安装 bind 软件包
运行
yum install -y bind
步骤 2:修改从服务器主配置文件 /etc/named.conf
和主服务器修改方式一致:
listen-on port 53 { 192.168.111.15; };(改成从服务器自己的 IP)allow-query { any; };(允许所有客户端查询)- 检查语法:
named-checkconf
步骤 3:修改从服务器区域配置文件 /etc/named.rfc1912.zones
编辑文件:
运行
vim /etc/named.rfc1912.zones
添加正向解析区域(从服务器类型为 slave)
运行
zone "laozhangtou.com" IN {
type slave; # 类型:从服务器
file "slaves/laozhangtou.com.zhang"; # 同步数据存储路径(存到 slaves 目录)
masters { 192.168.111.137; }; # 指定主服务器 IP
};
添加反向解析区域
运行
zone "111.168.192.in-addr.arpa" IN {
type slave;
file "slaves/192.168.111.zhang";
masters { 192.168.111.137; };
};
步骤 4:启动从服务器服务
运行
systemctl enable --now named.service
步骤 5:验证主从同步
在从服务器上查看同步的区域文件:
运行
ls -l /var/named/slaves/
如果能看到 laozhangtou.com.zhang 和 192.168.111.zhang → 同步成功!
测试从服务器解析:
运行
nslookup www.laozhangtou.com 192.168.111.15
能正常返回 IP → 从服务器搭建成功!
六、常见错误排查(小白避坑指南)
-
named 服务启动失败
- 原因:配置文件语法错误、区域文件权限不对、端口 53 被占用
- 排查:
journalctl -xeu named.service看日志;ss -ulnp | grep :53查端口占用;chown named:named 区域文件改权限
-
NS 记录报错:has no address records (A or AAAA)
- 原因:NS 记录的域名没有对应的 A 记录(比如
dns.laozhangtou.com没加 A 记录) - 解决:在正向区域文件中添加
dns A 主服务器IP
- 原因:NS 记录的域名没有对应的 A 记录(比如
-
反向区域 NS 记录拼接错误(比如 dns.laozhangtou.com.111.168.192.in-addr.arpa)
- 原因:NS 记录的域名结尾没加
. - 解决:把 NS 记录改成
NS dns.laozhangtou.com.(结尾带 .)
- 原因:NS 记录的域名结尾没加
-
区域文件找不到(file not found)
- 原因:区域配置文件里的
file路径和实际区域文件名不一致 - 解决:核对
/etc/named.rfc1912.zones里的file字段和/var/named/下的文件名
- 原因:区域配置文件里的
七、总结
DNS 是互联网的 "核心翻译官",核心就是把域名转 IP、IP 转域名。搭建 DNS 服务器的核心流程是:
- 安装 bind → 2. 改主配置(监听 IP、允许查询)→ 3. 改区域配置(定义要解析的域)→ 4. 写区域文件(存解析数据)→ 5. 启动服务 → 6. 测试解析
小白搭建时重点注意:配置文件语法、区域文件权限、NS 记录结尾的 .、serial 序列号递增,避开这几个坑,就能快速搭建出可用的 DNS 服务器!