第一部分:最简操作步骤(可快速复现)
环境说明
-
DNS/Web 服务器:IP `192.168.66.135`,主机名任意
-
客户端:另一台虚拟机(如 `192.168.66.139`)
-
目标:DNS 解析 `www.test.com`、`www.exam.com`、`www.https.com` 到 `192.168.66.135`,Web 服务分别返回对应的域名文本
一、DNS 服务配置(在 192.168.66.135 上执行)
- 安装 BIND
dnf install -y bind bind-utils
2. 编辑主配置文件 `/etc/named.conf`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;
};
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"; };
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` 为例,编辑内容:
$TTL 1D
@ IN SOA ns.test.com. admin.test.com. (2025032701 1D 1H 1W 3H)
IN NS ns.test.com.
ns IN A 192.168.66.135
www IN A 192.168.66.135
其他两个区域文件内容相同,只需将 `test.com` 替换为 `exam.com` 或 `https.com`。
4. 检查配置并启动服务named-checkconf /etc/named.conf
named-checkzone test.com /var/named/test.com.named
systemctl enable --now named
5. 开放防火墙和 SELinuxfirewall-cmd --permanent --add-service=dns
firewall-cmd --reload
restorecon -R /var/named
二、Web 服务配置(仍在 192.168.66.135 上执行)
- 安装 Nginx
dnf install -y nginx
- 创建 SSL 证书(为 HTTPS 准备)
mkdir -p /etc/nginx/ssl
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout /etc/nginx/ssl/www.https.com.key \
-out /etc/nginx/ssl/www.https.com.crt \
-subj "/C=CN/ST=Beijing/L=Beijing/O=Exam/CN=www.https.com"
- 配置 Nginx 站点(新建 `/etc/nginx/conf.d/sites.conf`)
www.test.com
server {
listen 80;
server_name www.test.com;
return 200 "www.test.com\n";
}
www.exam.com
server {
listen 80;
server_name www.exam.com;
return 200 "www.exam.com\n";
}
将 http 的 www.https.com 重定向到 https
server {
listen 80;
server_name www.https.com;
return 301 https://hostrequest_uri;
}
https 站点
server {
listen 443 ssl;
server_name www.https.com;
ssl_certificate /etc/nginx/ssl/www.https.com.crt;
ssl_certificate_key /etc/nginx/ssl/www.https.com.key;
return 200 "www.https.com\n";
}
- 测试并启动 Nginx
nginx -t
systemctl enable --now nginx
- 防火墙放行 HTTP/HTTPS
firewall-cmd --permanent --add-service={http,https}
firewall-cmd --reload
三、客户端配置(在另一台虚拟机 192.168.66.139 上执行)
- 设置 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 +short # 应输出 192.168.66.135
- 测试 Web 访问
curl http://www.test.com # 输出 www.test.com
curl http://www.exam.com # 输出 www.exam.com
curl -k https://www.https.com # 输出 www.https.com
第二部分:常见错误及解决方法(失败经历总结)
错误 1:YUM 仓库未配置,无法安装软件
现象:`dnf install` 报 `Error: There are no enabled repositories`
原因:RHEL 未注册订阅,且未配置本地/网络仓库。
解决:挂载安装 ISO 并创建本地 `.repo` 文件,或使用公网镜像。
错误 2:DNS 启动失败,日志显示 `recursion redefined`
现象:`systemctl status named` 显示 `failed`,日志中 `recursion redefined`
原因:`/etc/named.conf` 中 `recursion` 指令出现两次。
解决:删除多余的 `recursion` 行,只保留一个。
错误 3:区域文件权限错误导致 named 无法读取
现象:named 启动失败,日志 `permission denied` 或 `could not find file`
原因:区域文件属主不是 `named` 或权限过宽。
解决:`chown named:named /var/named/*.com.named`,`chmod 640`。
错误 4:防火墙未放行 DNS 端口,客户端无法解析
现象:`dig` 返回 `connection timed out` 或 `REFUSED`
原因:UDP/TCP 53 端口被防火墙拦截。
解决:`firewall-cmd --add-service=dns` 并重载。
错误 5:Nginx 启动失败,提示 SSL 证书不存在
现象:`nginx -t` 报 `cannot load certificate... No such file or directory`
原因:配置中引用了证书,但未生成。
解决:执行 `openssl req` 生成自签名证书。
错误 6:访问 `www.exam.com` 返回了 `www.test.com` 的内容
现象:`curl http://www.exam.com` 输出 `www.test.com`
原因:Nginx 没有为 `www.exam.com` 单独配置 server 块,请求被默认 server 块处理。
解决:为每个域名创建独立的 server 块,明确指定 `server_name`。
错误 7:HTTPS 站点无法连接,但 DNS 解析正常
现象:`curl -k https://www.https.com` 报 `Failed to connect`
原因:防火墙未放行 443 端口,或 Nginx 未监听 443。
解决:`firewall-cmd --add-service=https`,检查 `ss -tulnp | grep 443`。
错误 8:客户端仍使用 `/etc/hosts` 解析,不查询 DNS
现象:`dig` 正确,但 `curl` 直接使用 hosts 中的旧 IP。
原因:hosts 文件优先级高于 DNS。
解决:临时注释 hosts 中的相关行,或使用 `dig` 指定 DNS 验证。
附录:关键检查命令速查
| 检查项 | 命令 |
|--------|------|
| DNS 服务状态 | `systemctl status named` |
| DNS 配置语法 | `named-checkconf`、`named-checkzone` |
| 防火墙开放端口 | `firewall-cmd --list-all` |
| SELinux 上下文 | `ls -Z /var/named` |
| Nginx 配置测试 | `nginx -t` |
| Nginx 监听端口 | `ss -tulnp \| grep nginx` |
| 域名解析测试 | `dig @192.168.66.135 www.test.com` |
| Web 访问测试 | `curl -v http://www.test.com` |
通过以上步骤和错误总结,可以快速搭建并排错一个完整的 DNS+Web 服务集成环境。