nslookup
与dig
命令验证域名与IP映射关系,实验Linux 下 DNS 实验报告
本实验旨在通过搭建基于 Linux 系统的 DNS 服务器,深入理解域名系统(Domain Name System, DNS)的工作原理与配置方法,实验涵盖主 DNS 服务器、从 DNS 服务器的部署,以及正向/反向区域解析的实现,通过实际操作,掌握 BIND(Berkeley Internet Name Domain)软件的使用,熟悉相关配置文件的编写与调试技巧,提升网络运维能力。
实验目的
- 理论目标:理解 DNS 分层查询机制、递归与迭代查询的区别,掌握 A 记录、AAAA 记录、PTR 记录等常见资源记录类型。
- 实践目标:能够在 Linux 环境下独立完成主/从 DNS 服务器的搭建与配置,实现域名到 IP 地址的正向解析及 IP 到域名的反向解析。
- 扩展目标:验证 DNS 缓存机制,测试负载均衡场景下的轮询策略,培养故障排查能力。
实验环境
组件 | 详细信息 |
---|---|
操作系统 | Ubuntu Server 20.04 LTS |
DNS 软件 | BIND 9 (默认安装) |
虚拟机工具 | VirtualBox + NAT 模式 |
网络拓扑 | 三台虚拟主机:Client(192.168.1.10) → Master(192.168.1.20) ↔ Slave(192.168.1.30) |
测试工具 | nslookup , dig , host |
域名规划 | 自建域 example.com,子域 sub.example.com |
实验步骤详解
1 主 DNS 服务器配置(Master)
1.1 基础环境准备
sudo apt update && sudo apt install bind9 y
编辑主配置文件 /etc/bind/named.conf.local
,添加以下内容:
zone "example.com" { type master; file "/etc/bind/db.example.com"; }; zone "1.168.192.inaddr.arpa" { type master; file "/etc/bind/db.192.168.1"; };
1.2 创建区域文件
正向解析文件 /etc/bind/db.example.com
:
| STTL | @ IN SOA ns.example.com. admin.example.com. (
|||
| | 2023120101 ;Serial Number | 7200 ;Refresh |
| | 3600 ;Retry | 1209600 ;Expire |
| | 86400 ) ;Minimum TTL | NS ns.example.com. |
| | A ns 192.168.1.20 | A www 192.168.1.20 |
| | AAAA ns ::1 | CNAME webserver www.example.com. |
反向解析文件 /etc/bind/db.192.168.1
:
| PTR 20.168.192.inaddr.arpa. IN PTR ns.example.com. |
| 30.168.192.inaddr.arpa. IN PTR slave.example.com. |
1.3 启动服务并校验
sudo systemctl restart named sudo namedcheckconf # 语法检查 sudo namedcheckzone example.com /etc/bind/db.example.com # 区域校验
2 从 DNS 服务器配置(Slave)
2.1 基础配置
修改 /etc/bind/named.conf.local
:
zone "example.com" { type slave; masters { 192.168.1.20; }; file "slave/db.example.com"; }; zone "1.168.192.inaddr.arpa" { type slave; masters { 192.168.1.20; }; file "slave/db.192.168.1"; };
创建目录并设置权限:
sudo mkdir /var/cache/bind/slave sudo chown bind:bind /var/cache/bind/slave
2.2 触发区域传输
在主服务器执行:
rndc reload example.com # 强制重新加载区域
从服务器日志应显示 transfer of 'example.com/IN' from 192.168.1.20#53
。
3 客户端测试
测试命令 | 预期结果 | 实际结果 |
---|---|---|
nslookup www.example.com |
Can't find www.example.com: No answer | 168.1.20 |
dig x 192.168.1.20 |
No PTR record found | ns.example.com. |
host www.example.com |
www.example.com has address 192.168.1.20 |
关键问题与解决方案
现象 | 原因分析 | 解决方法 |
---|---|---|
客户端返回 SERVFAIL | 区域文件语法错误 | 使用 namedcheckzone 定位错误行 |
从服务器未同步数据 | 防火墙阻断 TCP/UDP 53 端口 | 开放主服务器 53 端口,重启服务 |
反向解析失败 | 缺少 ARPA 区域声明 | 补充 zone "1.168.192.inaddr.arpa" |
跨网段解析延迟高 | 未启用 EDNS Client Subnet | 在 named.conf.options 中添加 ednsclientsubnet; } |
本次实验成功构建了完整的 DNS 服务体系,关键点包括:
- 区域文件规范:严格遵循 TTL 层级结构和分号结尾规则;
- 主从同步机制:通过 AXFR 协议实现增量更新,需保持序列号递增;
- 安全加固:建议禁用递归查询(
recursion no;
),限制允许查询的客户端 IP 范围; - 性能优化:启用 DNSSEC 签名可提升安全性,但会增加响应时间。
相关问题与解答
Q1: 为什么 DNS 查询有时会经历多次跳转?
答:这是由于 DNS 采用分布式数据库架构,当本地服务器无缓存时,会逐级向上查询根域名服务器→顶级域(.com)→权威域名服务器,此过程称为"迭代查询",若开启递归查询,则由当前服务器代替客户端完成整个查询链。
Q2: 如何实现同一域名对应多个 IP 的负载均衡?
答:在区域文件中为同一主机名定义多个 A 记录,并设置相同的优先级,DNS 服务器会根据轮询算法(Round Robin)将请求分散到不同 IP,适用于 Web 集群等场景,示例:
www IN A 192.168.1.20 www IN A 192.168.1.21 www IN A 192.168.1.