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 日志,监控解析请求和错误,便于问题排查。
相关推荐
SelectDB1 天前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维
XIAOHEZIcode2 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220703 天前
如何搭建本地yum源(上)
运维
大树886 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠6 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质6 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
Inhand陈工6 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
网络研究院6 天前
2026年网络安全
网络·安全·法律·法规·趋势·发展
酣大智6 天前
ARP代理--工作原理
运维·网络·arp·arp代理
treesforest6 天前
AI安全系统如何识别异常访问?IP风险识别正在成为关键能力
网络·人工智能·tcp/ip·安全·web安全