DNS + Web 服务集成实验

第一部分:最简操作步骤(可快速复现)

环境说明

  • 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 上执行)

  1. 安装 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. 开放防火墙和 SELinux

firewall-cmd --permanent --add-service=dns

firewall-cmd --reload

restorecon -R /var/named


二、Web 服务配置(仍在 192.168.66.135 上执行)

  1. 安装 Nginx

dnf install -y nginx

  1. 创建 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"

  1. 配置 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";

}

  1. 测试并启动 Nginx

nginx -t

systemctl enable --now nginx

  1. 防火墙放行 HTTP/HTTPS

firewall-cmd --permanent --add-service={http,https}

firewall-cmd --reload


三、客户端配置(在另一台虚拟机 192.168.66.139 上执行)

  1. 设置 DNS 服务器

nmcli connection modify ens160 ipv4.dns 192.168.66.135

nmcli connection modify ens160 ipv4.ignore-auto-dns yes

nmcli connection up ens160

  1. 验证解析

dig www.test.com +short # 应输出 192.168.66.135

  1. 测试 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 服务集成环境。

相关推荐
小王码农记5 小时前
el-input限制只能输入价格格式
前端·vue.js
云霄IT5 小时前
安卓apk逆向之crc32检测打补丁包crc32_patcher.py
java·前端·python
小句5 小时前
Java Web 技术演进:Servlet → Spring → Spring Boot
java·前端·spring
ljt27249606615 小时前
Flutter笔记--popUntilWithResult
前端·笔记·flutter
树獭非懒5 小时前
Google A2UI:让 AI 智能体「开口说界面」
前端·人工智能·后端
Wect5 小时前
LeetCode 4. 寻找两个正序数组的中位数:二分优化思路详解
前端·算法·typescript
李剑一5 小时前
纯干货,前端字体极致优化!谷歌、阿里、字节、腾讯都在用的终极解决方案,Vue3 + Vite 直接抄,页面提速不妥协!
前端·vue.js·面试
memeflyfly5 小时前
Vercel 自动部署完全指南:从配置到问题排查
前端·前端工程化
星辰徐哥5 小时前
C语言Web开发:CGI、FastCGI、Nginx深度解析
c语言·前端·nginx