自学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 服务器!

相关推荐
大树884 小时前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠4 小时前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质4 小时前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
bush44 小时前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5204 小时前
Linux 11 动态监控指令top
linux
小宇宙Zz5 小时前
Maven依赖冲突
java·服务器·maven
Inhand陈工5 小时前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
酣大智6 小时前
ARP代理--工作原理
运维·网络·arp·arp代理
不会C语言的男孩6 小时前
Linux 系统编程 · 第 8 章:进程基础
linux·c语言
shushangyun_6 小时前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化