实验目标
在指定虚拟机(IP `192.168.66.135`)上搭建 BIND DNS 服务,实现三个域名的正向解析:
-
`www.test.com` → `192.168.66.135`
-
`www.exam.com` → `192.168.66.135`
-
`www.https.com` → `192.168.66.135`
同时支持对应 NS 记录的解析,最终客户端可通过该 DNS 服务器解析域名并访问 Web 服务。
前置条件
-
虚拟机 IP 固定为 `192.168.66.135`,网络正常
-
已配置 YUM 仓库(使用本地 ISO 或网络源)
-
建议关闭防火墙对 DNS 端口的限制(后续会开放 53 端口)
实验步骤及讲解
1. 安装 DNS 服务(BIND)
dnf install -y bind bind-utils
bind:DNS 服务主程序(named)
bind-utils:提供 `dig`、`nslookup` 等测试工具
扩展:`bind` 包安装后,主配置文件位于 `/etc/named.conf`,区域文件默认存放于 `/var/named/`。
2. 修改主配置文件 `/etc/named.conf`
备份原始配置(可选)
cp /etc/named.conf /etc/named.conf.bak
编辑配置文件
vim /etc/named.conf
将内容修改为(IP 替换为实际 IP):
options {
listen-on port 53 { 127.0.0.1; 192.168.66.135; };
directory "/var/named";
allow-query { any; };
recursion yes;
dnssec-validation no; # 实验环境关闭 DNSSEC 验证
};
zone "test.com" IN {
type master;
file "test.com.named";
};
zone "exam.com" IN {
type master;
file "exam.com.named";
};
zone "https.com" IN {
type master;
file "https.com.named";
};
配置项解释:
-
`listen-on`:指定 named 监听的 IP 和端口,必须包含本机 IP,否则外部无法访问。
-
`directory`:区域文件存放目录。
-
`allow-query`:允许查询的客户端,`any` 表示所有。
-
`recursion`:允许递归查询(DNS 会向根域迭代查询)。
-
`dnssec-validation`:DNSSEC 验证,实验环境可关闭避免密钥问题。
-
`zone`:定义区域,`type master` 表示主 DNS,`file` 指定区域文件名(位于 `/var/named/`)。
3. 创建正向区域文件
cd /var/named/
创建三个区域文件
touch test.com.named exam.com.named https.com.named
设置属主和权限(重要!)
chown named:named *.com.named
chmod 640 *.com.named
编写 `test.com.named`(其他文件类似,仅域名不同)
vim test.com.named
内容:
$TTL 1D
@ IN SOA ns.test.com. admin.test.com. (
2025032701 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
IN NS ns.test.com.
ns IN A 192.168.66.135
www IN A 192.168.66.135
区域文件格式说明:
-
`$TTL`:默认生存时间,1D 表示一天。
-
`SOA`:起始授权记录,包含域名、管理员邮箱、序列号等。序列号每次修改区域文件应递增,用于主从同步。
-
`NS`:名称服务器记录,指明该区域的权威 DNS。
-
`A`:地址记录,将域名映射到 IPv4 地址。
-
注意:管理员邮箱中的 `@` 用 `.` 代替,如 `admin.test.com` 表示 `admin@test.com`。
同样方式编辑 `exam.com.named` 和 `https.com.named`,将域名和 NS 记录中的域名替换为对应值。
4. 检查配置并启动服务
检查主配置语法
named-checkconf /etc/named.conf
检查每个区域文件语法
named-checkzone test.com /var/named/test.com.named
named-checkzone exam.com /var/named/exam.com.named
named-checkzone https.com /var/named/https.com.named
启动 named 并设置开机自启
systemctl enable --now named
查看状态
systemctl status named
可能遇到的错误:
-
`recursion redefined`:配置文件中 `recursion` 指令重复出现,删除多余的行即可。
-
`zone has no NS records`:区域文件中缺少 `NS` 记录,必须添加。
-
`could not find file`:区域文件路径错误或不存在,检查文件名和路径。
-
`permission denied`:区域文件权限错误,使用 `chown named:named` 修复。
验证:`systemctl status named` 应显示 `active (running)`。
5. 防火墙与 SELinux 配置
防火墙(开放 DNS 端口)
firewall-cmd --permanent --add-service=dns
firewall-cmd --reload
- DNS 服务对应 TCP 和 UDP 的 53 端口。
SELinux
恢复区域文件默认上下文(通常已正确)
restorecon -R /var/named
SELinux 策略允许 named 读取 `/var/named` 下标记为 `named_zone_t` 的文件,使用 `restorecon` 可修复上下文。
6. 本地测试 DNS 解析
使用 dig 指定 DNS 服务器查询
dig @192.168.66.135 www.test.com
dig @192.168.66.135 www.exam.com
dig @192.168.66.135 www.https.com
使用 nslookup
nslookup www.test.com 192.168.66.135
预期输出应包含 `ANSWER SECTION`,显示 `www.test.com. 86400 IN A 192.168.66.135`。
7. 配置客户端使用该 DNS 服务器
在需要解析的客户端(如另一台虚拟机)上:
临时修改(重启网络后失效)
echo "nameserver 192.168.66.135" > /etc/resolv.conf
永久修改(通过 NetworkManager)
查看网卡名称
nmcli connection show
修改 DNS
nmcli connection modify ens160 ipv4.dns 192.168.66.135
nmcli connection modify ens160 ipv4.ignore-auto-dns yes
nmcli connection up ens160
验证客户端解析:
dig www.test.com # 应解析为 192.168.66.135
curl http://www.test.com # 如果 Web 服务已配置,应正常访问
常见问题与解决
| 错误现象 | 可能原因 | 解决方法 |
|---------|----------|----------|
| `named.service: failed`,日志显示 `recursion redefined` | `/etc/named.conf` 中有重复的 `recursion` 指令 | 删除多余的 `recursion` 行 |
| `named-checkzone` 报 `has no NS records` | 区域文件缺少 `NS` 记录 | 添加 `IN NS ns.domain.com.` 行 |
| 客户端 `dig` 返回 `REFUSED` | `allow-query` 未允许客户端 IP | 将 `allow-query` 改为 `any` 或包含客户端 IP |
| `dig` 返回 `SERVFAIL` | 区域文件语法错误或 SOA 序列号未更新 | 检查区域文件,用 `named-checkzone` 验证 |
| 客户端无法连接 Web 服务但 DNS 解析正常 | Web 服务(nginx)未运行或防火墙未放行 80 端口 | 检查 `systemctl status nginx`,开放 http 服务 |
| 客户端解析仍使用旧 hosts 记录 | `/etc/hosts` 优先级高于 DNS | 注释或删除 hosts 中的相关域名 |
扩展命令与目录
| 类别 | 目录/文件 | 常用命令 |
|------|-----------|----------|
| 主配置 | `/etc/named.conf` | `named-checkconf` 检查语法 |
| 区域文件 | `/var/named/` | `named-checkzone` 检查区域文件 |
| 日志 | `/var/log/messages` 或 `journalctl -u named` | `journalctl -u named -n 20` 查看最近日志 |
| 服务管理 | - | `systemctl {start\|stop\|restart\|status} named` |
| 测试工具 | - | `dig @dns_ip domain`,`nslookup domain dns_ip` |
| 防火墙 | - | `firewall-cmd --add-service=dns` |
| SELinux | - | `restorecon -R /var/named`,`semanage port -l \| grep 53` |
| 动态加载 | - | `rndc reload`(需配置 rndc 密钥) |
与之前 Web 实验的关联
-
DNS 服务为 Web 站点提供域名解析,使客户端可通过域名访问。
-
Web 服务(nginx)需要监听 80/443 端口,且 `server_name` 应与 DNS 解析的域名匹配。
-
客户端需将 DNS 服务器指向本实验搭建的 DNS 服务器(或修改 `/etc/hosts`),才能通过域名访问。
-
两者可独立运行,但需协调配置(如防火墙开放 80/443/53 端口,SELinux 分别允许 httpd 和 named 相应操作)。
实验总结
本实验完整演示了:
-
BIND 的基本安装与配置
-
正向区域文件的编写与语法
-
配置检查与启动服务
-
防火墙与 SELinux 对 DNS 服务的影响
-
客户端 DNS 设置与验证
通过这些步骤,可搭建一个简单的权威 DNS 服务器,为内网提供域名解析服务。后续可扩展配置反向解析、主从同步、DNSSEC 等高级功能。