自学linux的二十天【DNS 服务从入门到实战】

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(主机名,比如 wwwmail
  • 主机名:dns(具体服务器的名称)

5. 域类型

  • 根域:.(所有域名的起点,全球 13 组根服务器)
  • 顶级域(TLD):比如 .com.cn
  • 二级域:比如 laozhangtou.com
  • 子域(三级域):比如 dns.laozhangtou.com

二、DNS 解析全过程(小白也能懂的 "查地址" 流程)

当你在浏览器输入 www.baidu.com 时,DNS 会按以下顺序帮你找 IP:

  1. 先查本地缓存:浏览器 / 操作系统会先查自己缓存的域名 - IP 映射(最近访问过的会存起来,快!)
  2. 再查本地 hosts 文件 :如果缓存没有,就看本地 C:\Windows\System32\drivers\etc\hosts(Windows)或 /etc/hosts(Linux),这是 DNS 诞生前的 "原始映射表"
  3. 最后查指向的 DNS 服务器:如果前两步都没有,就向你网络配置里的 DNS 服务器(比如 114.114.114.114)发起查询

查询分类(两种核心方式)

  • 递归查询 :客户机 ↔ 本地 DNS 服务器(你问本地 DNS"帮我找 www.baidu.com 的 IP",本地 DNS 直接给你最终结果,不用你自己跑遍全球服务器)
  • 迭代查询 :本地 DNS 服务器 ↔ 根 / 顶级 / 权限服务器(本地 DNS 找不到时,会问根服务器 "谁管 .com?",再问顶级域 "谁管 baidu.com?",一步步找到答案,再返回给你)

三、域名服务器分类(不同角色分工不同)

按 "层级作用" 分

  1. 根域名服务器:全球最高层次、最重要的服务器,知道所有顶级域服务器的域名和 IP,是所有查询的 "起点"
  2. 顶级域名服务器 :管理对应顶级域下的所有二级域(比如 .com 服务器管所有 xxx.com 域名)
  3. 权限域名服务器 :负责一个具体 "区域" 的解析(比如我们自己搭建的 DNS 服务器,管 laozhangtou.com 这个域)
  4. 本地域名服务器:我们日常网络配置里的 DNS(比如家里路由器的 DNS、运营商 DNS),帮我们转发查询请求,不属于层级结构但至关重要

按 "应用场景" 分

  1. 主服务器(Master):存储域名解析的 "原始数据",是提供解析的核心,所有修改都在主服务器上做
  2. 辅助服务器(Slave / 从服务器):从主服务器同步解析数据,当主服务器宕机时,顶替主服务器提供解析,保障服务高可用
  3. 高速缓存服务器:不存储原始解析数据,只缓存用户常用的域名 - 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.x111.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 解析(验证是否成功)

nslookupdig 命令测试(客户端需将 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.zhang192.168.111.zhang → 同步成功!

测试从服务器解析:

运行

复制代码
nslookup www.laozhangtou.com 192.168.111.15

能正常返回 IP → 从服务器搭建成功!


六、常见错误排查(小白避坑指南)

  1. named 服务启动失败

    • 原因:配置文件语法错误、区域文件权限不对、端口 53 被占用
    • 排查:journalctl -xeu named.service 看日志;ss -ulnp | grep :53 查端口占用;chown named:named 区域文件 改权限
  2. NS 记录报错:has no address records (A or AAAA)

    • 原因:NS 记录的域名没有对应的 A 记录(比如 dns.laozhangtou.com 没加 A 记录)
    • 解决:在正向区域文件中添加 dns A 主服务器IP
  3. 反向区域 NS 记录拼接错误(比如 dns.laozhangtou.com.111.168.192.in-addr.arpa)

    • 原因:NS 记录的域名结尾没加 .
    • 解决:把 NS 记录改成 NS dns.laozhangtou.com.(结尾带 .)
  4. 区域文件找不到(file not found)

    • 原因:区域配置文件里的 file 路径和实际区域文件名不一致
    • 解决:核对 /etc/named.rfc1912.zones 里的 file 字段和 /var/named/ 下的文件名

七、总结

DNS 是互联网的 "核心翻译官",核心就是把域名转 IP、IP 转域名。搭建 DNS 服务器的核心流程是:

  1. 安装 bind → 2. 改主配置(监听 IP、允许查询)→ 3. 改区域配置(定义要解析的域)→ 4. 写区域文件(存解析数据)→ 5. 启动服务 → 6. 测试解析

小白搭建时重点注意:配置文件语法、区域文件权限、NS 记录结尾的 .、serial 序列号递增,避开这几个坑,就能快速搭建出可用的 DNS 服务器!

相关推荐
成都极云科技2 小时前
成都GPU服务器托管 - 成都服务器idc托管
运维·服务器
wdfk_prog2 小时前
[Linux]学习笔记系列 -- [drivers][mmc]mmc_sd
linux·笔记·学习
这个软件需要设计一下2 小时前
ninedata安装磁盘不足问题解决
运维·bug
qinyia2 小时前
**使用AI助手在智慧运维中快速定位并修复服务异常:以Nginx配置错误导致502错误为例**
linux·运维·服务器·数据库·mysql·nginx·自动化
❀͜͡傀儡师2 小时前
CentOS 7部署FTP服务
linux·运维·centos·ftp
ONLYOFFICE2 小时前
ONLYOFFICE 自动化工具:宏和 AI 函数如何选择?
运维·自动化·编辑器·onlyoffice
济6172 小时前
ARM Linux 驱动开发篇----字符设备驱动开发(2)--字符设备驱动开发步骤---- Ubuntu20.04
linux·运维·服务器
Guheyunyi2 小时前
什么是安全监测预警系统?应用场景有哪些?
大数据·运维·人工智能·安全·音视频
hopsky2 小时前
Docker Desktop 报 500
运维·docker·容器