DNS分离解析案例

一、分离解析核心原理

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(避免主机名冲突);
  • 克隆后建议重置每台虚拟机的 UUIDMAC 地址(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:named640chown 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

  1. 检查客户机 DNS 配置:cat /etc/resolv.conf 确认 DNS 指向 ns1;
  2. 检查 ns1 防火墙:firewall-cmd --list-services 确认 dns 服务已放行;
  3. 检查 view 视图的 match-clients:确认客户机 IP 在匹配网段内;
  4. 检查解析库文件:named-checkzone 验证语法,确保 www 记录存在。

3. 客户机解析正确但无法访问 Web 服务器

  1. ping 目标 IP(如 172.25.16.102):确认网络连通;
  2. 检查 Web 服务器防火墙:firewall-cmd --list-services 确认 http 或 80 端口已放行;
  3. 检查 ns1 IP 转发:cat /proc/sys/net/ipv4/ip_forward 确认输出 1;
  4. 检查 Web 服务器状态:systemctl status nginx 确认已启动。

六、总结

核心流程回顾

  1. 环境准备:双网卡配置(ns1)、网络模式区分(仅主机 = 外网,NAT = 内网);
  2. 服务部署:Web 服务器(web1/web2)提供差异化服务,ns1 安装 Bind;
  3. 核心配置:named.conf 定义 view 视图(匹配网段),解析库文件定义域名 - IP 映射;
  4. 验证测试:本机测试 → 客户机测试,确保内外网解析结果不同且能访问对应 Web 服务器。

生产环境扩展建议

  1. 开启 DNSSEC:生产环境需启用 dnssec-validation yes,提升解析安全性;
  2. 配置主从 DNS:避免单节点故障,从服务器同步 ns1 的解析配置;
  3. 限制递归查询:外网视图可关闭递归(recursion no),避免 DNS 放大攻击;
  4. 日志监控:开启 Bind 日志,监控解析请求和错误,便于问题排查。
相关推荐
Y淑滢潇潇2 小时前
RHCE Day2 时间管理服务器 NFS服务器
linux·运维·服务器
铭哥的编程日记2 小时前
【Linux网络】五种IO模型与非阻塞IO
linux·服务器·网络·tcp/ip·udp
半熟的皮皮虾3 小时前
因需写了个内网运维专用的IP地址管理工具,有点不同
运维·服务器·tcp/ip
snakecy3 小时前
常用命令记录
linux·运维·github
minglie13 小时前
Wireshark抓HTTPS协议包
网络·测试工具·wireshark
刘一说3 小时前
深入理解 Spring Boot Actuator:构建可观测性与运维友好的应用
运维·spring boot·后端
kyle~4 小时前
计算机网络---安全外壳协议(SSH,Secure Shell)
运维·计算机网络·安全·ssh
Macbethad4 小时前
EtherCAT、Ethernet/IP、ModbusTCP等几种工控以太网协议对比
网络·网络协议·tcp/ip