一、分离解析核心原理
DNS 分离解析(Split DNS)是指 DNS 服务器根据客户端的来源网段(内网 / 外网),返回不同的域名 - IP 映射结果,核心价值在于:
- 内网用户访问
www.exam.com时,解析到内网 Web 服务器(192.168.72.102),访问速度快且不占用公网带宽; - 外网用户访问同一域名时,解析到外网 Web 服务器(
172.25.16.102),实现内外网资源隔离访问; - 依赖 Bind 服务的
view视图功能,按match-clients匹配客户端网段,不同视图加载独立解析库文件。
二、实验环境总览
| 主机名 | 角色 | 系统版本 | IP 配置(关键) | 网络模式 | 核心作用 |
|---|---|---|---|---|---|
| web1 | 外网 Web 服务器 | RedHat 9.6 | 外网 IP:172.25.16.102/24,DNS 指向 ns1 |
仅主机模式 | 对外提供 www.exam.com 服务 |
| web2 | 内网 Web 服务器 | RedHat 9.6 | 内网 IP:192.168.72.102/24,DNS 指向 ns1 |
NAT 模式 | 对内提供 www.exam.com 服务 |
| ns1 | DNS 分离服务器 | RedHat 9.6 | 内网 IP:192.168.72.101/24(NAT 网卡)外网 IP:172.25.16.101/24(仅主机网卡) |
双网卡(NAT + 仅主机) | 核心:按客户端网段返回不同解析结果 |
| client1 | 外网客户机 | RedHat 9.6 | 外网 IP:172.25.16.106/24,DNS 指向 ns1 |
仅主机模式 | 测试外网解析结果 |
| client2 | 内网客户机 | RedHat 9.6 | 内网 IP:192.168.72.106/24,DNS 指向 ns1 |
NAT 模式 | 测试内网解析结果 |
网络环境说明
- 仅主机模式 :模拟 "外网" 网段(
172.25.16.0/24),仅主机与虚拟机互通,不接入真实外网; - NAT 模式 :模拟 "内网" 网段(
192.168.72.0/24),虚拟机可通过物理机上网,内网主机互通; - ns1 双网卡:必须同时接入两个网段,才能接收内网 / 外网客户端的 DNS 查询请求。
三、详细部署步骤(含补充说明 + 原理注解)
3.1 环境准备(基础操作,决定实验成败)
1. 虚拟机克隆与命名
- 克隆 5 台虚拟机,分别命名为 web1、web2、ns1、client1、client2(避免主机名冲突);
- 克隆后建议重置每台虚拟机的
UUID和MAC地址(RedHat 9.6 克隆后自动重置,无需手动操作)。
2. 网络模式配置
- web1、client1:虚拟机设置 → 网络适配器 → 选择 "仅主机模式"(断开 NAT 模式连接);
- web2、client2:保持 "NAT 模式"(接入内网网段);
- ns1:添加第二块网卡 → 虚拟机设置 → 网络适配器 → 点击 "添加" → 选择 "网络适配器" → 配置为 "仅主机模式"(第一块网卡保持 NAT 模式)。
3. 关键前提:关闭 SELinux(避免权限拦截)
所有主机(尤其是 ns1)需关闭 SELinux(否则 Bind 可能无法读取解析库文件):
# 临时关闭(立即生效)
setenforce 0
# 永久关闭(重启生效,推荐)
sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
# 验证:输出 Permissive 或 Disabled 即可
getenforce
3.2 配置外网 Web 服务器(web1)
1. 修改主机名(便于识别)
hostnamectl hostname web1
# 验证:重启终端后生效,或执行 bash 刷新
hostname
2. 配置静态 IP(仅主机模式,外网网段)
# nmcli 配置静态 IP(ens160 为网卡名,需按实际调整)
nmcli c modify ens160 \
ipv4.method manual \
ipv4.addresses 172.25.16.102/24 \
ipv4.dns 172.25.16.101 \ # DNS 指向分离服务器 ns1,确保解析域名
connection.autoconnect yes
# 激活配置(立即生效)
nmcli c up ens160
# 验证 IP 配置
ip addr show ens160 | grep inet
3. 安装并配置 Nginx(提供 Web 服务)
# 安装 Nginx(RedHat 9.6 默认 yum 源包含)
dnf install nginx -y
# 自定义首页内容(便于区分内外网访问结果)
echo "$(hostname) $(hostname -I)" > /usr/share/nginx/html/index.html
# 启动 Nginx 并设置开机自启
systemctl start nginx
systemctl enable nginx
# 防火墙放行 HTTP 服务(80 端口,否则客户机无法访问)
firewall-cmd --permanent --add-service=http
firewall-cmd --reload
# 本地验证:确保 Nginx 正常响应
curl localhost
# 预期输出:web1 172.25.16.102
3.3 配置内网 Web 服务器(web2)
步骤与 web1 一致,仅 IP 网段和网络模式不同,核心是 "内网网段配置":
1. 修改主机名
hostnamectl hostname web2
2. 配置静态 IP(NAT 模式,内网网段)
nmcli c modify ens160 \
ipv4.method manual \
ipv4.addresses 192.168.72.102/24 \
ipv4.gateway 192.168.72.2 \ # NAT 模式默认网关(按 VMware 虚拟网络编辑器配置)
ipv4.dns 192.168.72.101 \ # DNS 指向 ns1
connection.autoconnect yes
nmcli c up ens160
3. 安装 Nginx 并自定义首页
dnf install nginx -y
echo "$(hostname) $(hostname -I)" > /usr/share/nginx/html/index.html
systemctl start nginx
systemctl enable nginx
# 防火墙放行 80 端口
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --reload
# 本地验证
curl localhost
# 预期输出:web2 192.168.72.102
3.4 配置 DNS 分离服务器(ns1,核心步骤)
ns1 是实验核心,需配置双网卡、安装 Bind 服务、定义视图和解析库文件。
1. 修改主机名
hostnamectl hostname ns1
2. 配置双网卡(内网 + 外网)
首先确认网卡名称(新添加的仅主机网卡可能命名为 ens224):
# 查看所有网络连接(获取网卡名称和连接名)
nmcli c show
2.1 配置外网网卡(仅主机模式,172.25.16.0/24)
# 修改连接名称为 ens224(便于识别)
nmcli c modify "Wired connection 1" connection.id ens224
# 配置静态 IP
nmcli c modify ens224 \
ipv4.method manual \
ipv4.addresses 172.25.16.101/24 \
ipv4.dns 223.5.5.5 \ # 公网 DNS(备用,用于解析非 exam.com 域名)
connection.autoconnect yes
# 激活配置
nmcli c up ens224
2.2 配置内网网卡(NAT 模式,192.168.72.0/24)
nmcli c modify ens160 \
ipv4.method manual \
ipv4.addresses 192.168.72.101/24 \
ipv4.gateway 192.168.72.2 \ # NAT 网关(与 web2 一致)
ipv4.dns 223.5.5.5 \
connection.autoconnect yes
nmcli c up ens160
2.3 开启 IP 转发(关键!客户机访问 Web 服务器必需)
ns1 作为双网卡服务器,需开启 IP 转发,否则客户机(client1/client2)只能解析域名,无法访问 Web 服务器:
# 临时开启 IP 转发(立即生效)
echo 1 > /proc/sys/net/ipv4/ip_forward
# 永久开启 IP 转发(重启生效)
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p # 加载配置
3. 安装 Bind 服务(DNS 核心服务)
dnf install bind -y
# 验证安装:查看 Bind 版本
named -v
# 预期输出:BIND 9.16.23-RH(或类似版本)
4. 修改主配置文件(/etc/named.conf)
核心是 启用 view 视图功能,按客户端网段匹配视图,关键修改项已标注:
vim /etc/named.conf
最终配置文件内容(注释说明核心作用):
options {
listen-on port 53 { any; }; # 监听所有网卡的 53 端口(接收内网/外网查询)
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";
secroots-file "/var/named/data/named.secroots";
recursing-file "/var/named/data/named.recursing";
allow-query { any; }; # 允许所有客户端查询(内网+外网)
recursion yes; # 允许递归查询(客户端解析非 exam.com 域名时需用到)
dnssec-validation no; # 关闭 DNSSEC(测试环境简化配置,避免解析失败)
managed-keys-directory "/var/named/dynamic";
geoip-directory "/usr/share/GeoIP";
pid-file "/run/named/named.pid";
session-keyfile "/run/named/session.key";
include "/etc/crypto-policies/back-ends/bind.config";
};
logging {
channel default_debug {
file "data/named.run";
severity dynamic;
};
};
# 注释默认的根区域(view 模式下,根区域需放在每个视图内)
/*
zone "." IN {
type hint;
file "named.ca";
};
*/
# ==================== 外网视图(WAN)====================
view "WAN" {
match-clients { 172.25.16.0/24; }; # 匹配外网客户端网段
allow-query { 172.25.16.0/24; }; # 仅允许外网网段查询该视图
# 外网 exam.com 区域解析(指向 web1)
zone "exam.com" IN {
type master;
file "wan.exam.com.zone"; # 外网解析库文件
};
# 根区域(必需!否则外网客户端无法解析非 exam.com 域名)
zone "." IN {
type hint;
file "named.ca"; # 根服务器列表文件
};
};
# ==================== 内网视图(LAN)====================
view "LAN" {
match-clients { 192.168.72.0/24; }; # 匹配内网客户端网段
allow-query { 192.168.72.0/24; }; # 仅允许内网网段查询该视图
# 内网 exam.com 区域解析(指向 web2)
zone "exam.com" IN {
type master;
file "lan.exam.com.zone"; # 内网解析库文件
};
# 根区域(必需!否则内网客户端无法解析非 exam.com 域名)
zone "." IN {
type hint;
file "named.ca";
};
};
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
5. 创建解析库文件(核心:不同视图的域名 - IP 映射)
解析库文件存放于 /var/named/,需基于系统默认模板 named.localhost 复制(保留权限):
5.1 外网解析库文件(wan.exam.com.zone,指向 web1)
cd /var/named/
# -p:保留原文件权限(关键!避免 named 无法读取)
cp -p named.localhost wan.exam.com.zone
# 编辑外网解析库文件
vim wan.exam.com.zone
配置内容(注释说明字段含义):
$TTL 1D # 域名缓存时间(1天)
@ IN SOA exam.com. admin.exam.com. (
2025110801 ; serial(序列号,每次修改+1,用于主从同步)
1D ; refresh(刷新时间,从服务器同步主服务器配置的间隔)
1H ; retry(重试时间,同步失败后重试间隔)
1W ; expire(过期时间,从服务器同步失败后多久失效)
3H ) ; minimum(否定缓存时间,域名不存在时的缓存时长)
NS ns.exam.com. # 域名服务器记录(指定 DNS 服务器主机名)
ns A 172.25.16.101 # DNS 服务器 IP(ns1 的外网 IP)
www A 172.25.16.102 # 外网解析:www.exam.com → web1 的外网 IP
5.2 内网解析库文件(lan.exam.com.zone,指向 web2)
# 复制外网解析库文件,修改 IP 即可
cp -p wan.exam.com.zone lan.exam.com.zone
# 编辑内网解析库文件
vim lan.exam.com.zone
配置内容(仅修改 NS 和 www 记录的 IP):
$TTL 1D
@ IN SOA exam.com. admin.exam.com. (
2025110801 ; serial(与外网文件保持一致或+1)
1D
1H
1W
3H )
NS ns.exam.com.
ns A 192.168.72.101 # DNS 服务器 IP(ns1 的内网 IP)
www A 192.168.72.102 # 内网解析:www.exam.com → web2 的内网 IP
6. 验证解析库文件权限(关键避坑!)
Bind 服务默认以 named 用户运行,必须确保解析库文件的权限让 named 能读取:
# 查看权限(需满足:所有者 root,组 named,组有读权限 r)
ls -l /var/named/wan.exam.com.zone /var/named/lan.exam.com.zone
# 若权限不正确,手动修改
chown root:named /var/named/wan.exam.com.zone /var/named/lan.exam.com.zone
chmod 640 /var/named/wan.exam.com.zone /var/named/lan.exam.com.zone
7. 启动 Bind 服务并验证
# 启动 named 服务并设置开机自启
systemctl start named
systemctl enable named
# 验证服务状态(active (running) 为正常)
systemctl status named
# 防火墙放行 DNS 服务(53 端口,UDP+TCP 均需放行)
firewall-cmd --permanent --add-service=dns
firewall-cmd --reload
# 语法检查(无输出则语法正确,有报错按提示修改)
named-checkconf /etc/named.conf # 检查主配置
named-checkzone "exam.com" /var/named/wan.exam.com.zone # 检查外网解析库
named-checkzone "exam.com" /var/named/lan.exam.com.zone # 检查内网解析库
8. 本地解析验证(ns1 本机测试)
# 测试内网解析(指定 ns1 内网 IP)
dig -t A www.exam.com @192.168.72.101
# 预期结果:ANSWER SECTION 显示 192.168.72.102
# 测试外网解析(指定 ns1 外网 IP)
dig -t A www.exam.com @172.25.16.101
# 预期结果:ANSWER SECTION 显示 172.25.16.102
3.5 配置外网客户机(client1)
1. 修改主机名
hostnamectl hostname client1
2. 配置静态 IP(仅主机模式,外网网段)
nmcli c modify ens160 \
ipv4.method manual \
ipv4.addresses 172.25.16.106/24 \
ipv4.dns 172.25.16.101 \ # DNS 指向 ns1(外网 IP)
ipv4.gateway 172.25.16.101 \ # 网关指向 ns1(依赖 ns1 的 IP 转发)
connection.autoconnect yes
nmcli c up ens160
3. 解析与访问测试
# 1. 解析测试(验证 DNS 返回外网 IP)
nslookup www.exam.com
# 预期输出:Address: 172.25.16.102
# 2. Web 访问测试(验证能访问 web1)
curl www.exam.com
# 预期输出:web1 172.25.16.102
# 3. 若访问失败,排查步骤:
# - ping 172.25.16.102(web1 IP),确认网络连通
# - 检查 ns1 的 IP 转发是否开启(cat /proc/sys/net/ipv4/ip_forward)
# - 检查 web1 的防火墙是否放行 80 端口
3.6 配置内网客户机(client2)
1. 修改主机名
hostnamectl hostname client2
2. 配置静态 IP(NAT 模式,内网网段)
nmcli c modify ens160 \
ipv4.method manual \
ipv4.addresses 192.168.72.106/24 \
ipv4.dns 192.168.72.101 \ # DNS 指向 ns1(内网 IP)
ipv4.gateway 192.168.72.101 \ # 网关指向 ns1
connection.autoconnect yes
nmcli c up ens160
3. 解析与访问测试
# 1. 解析测试(验证 DNS 返回内网 IP)
nslookup www.exam.com
# 预期输出:Address: 192.168.72.102
# 2. Web 访问测试(验证能访问 web2)
curl www.exam.com
# 预期输出:web2 192.168.72.102
四、关键避坑指南(90% 新手会踩的坑)
1. ns1 双网卡配置错误
- 问题:仅主机网卡未激活,导致外网客户端无法连接 ns1;
- 解决:
nmcli c up ens224激活网卡,ip addr确认双 IP 均正常配置。
2. 解析库文件权限错误
- 问题:
named-checkzone报错permission denied,或 named 服务启动失败; - 解决:确保解析库文件权限为
root:named且640(chown root:named 文件名+chmod 640 文件名)。
3. 未开启 IP 转发
- 问题:客户机能解析域名,但
curl www.exam.com超时; - 解决:在 ns1 上执行
echo 1 > /proc/sys/net/ipv4/ip_forward临时开启,或配置永久转发。
4. view 视图中缺少根区域
- 问题:客户机只能解析
www.exam.com,无法解析www.baidu.com等公网域名; - 解决:在每个
view块中添加根区域配置(zone "." IN { type hint; file "named.ca"; })。
5. serial 序列号未更新
- 问题:修改了解析库文件,但解析结果仍为旧 IP;
- 解决:每次修改解析库文件后,将
SOA记录中的serial字段 + 1(如从 2025110801 改为 2025110802)。
五、常见问题排查流程
1. named 服务启动失败
# 查看错误日志(关键!按日志提示定位问题)
journalctl -u named -f
# 常见错误:权限不足(解析库文件权限)、语法错误(括号不匹配、路径错误)
2. 客户机解析失败(nslookup 报错 server can't find www.exam.com)
- 检查客户机 DNS 配置:
cat /etc/resolv.conf确认 DNS 指向 ns1; - 检查 ns1 防火墙:
firewall-cmd --list-services确认 dns 服务已放行; - 检查 view 视图的
match-clients:确认客户机 IP 在匹配网段内; - 检查解析库文件:
named-checkzone验证语法,确保 www 记录存在。
3. 客户机解析正确但无法访问 Web 服务器
- ping 目标 IP(如 172.25.16.102):确认网络连通;
- 检查 Web 服务器防火墙:
firewall-cmd --list-services确认 http 或 80 端口已放行; - 检查 ns1 IP 转发:
cat /proc/sys/net/ipv4/ip_forward确认输出 1; - 检查 Web 服务器状态:
systemctl status nginx确认已启动。
六、总结
核心流程回顾
- 环境准备:双网卡配置(ns1)、网络模式区分(仅主机 = 外网,NAT = 内网);
- 服务部署:Web 服务器(web1/web2)提供差异化服务,ns1 安装 Bind;
- 核心配置:named.conf 定义 view 视图(匹配网段),解析库文件定义域名 - IP 映射;
- 验证测试:本机测试 → 客户机测试,确保内外网解析结果不同且能访问对应 Web 服务器。
生产环境扩展建议
- 开启 DNSSEC:生产环境需启用
dnssec-validation yes,提升解析安全性; - 配置主从 DNS:避免单节点故障,从服务器同步 ns1 的解析配置;
- 限制递归查询:外网视图可关闭递归(
recursion no),避免 DNS 放大攻击; - 日志监控:开启 Bind 日志,监控解析请求和错误,便于问题排查。