DHCP与DNS服务器配置详解 - 通俗与专业双视角解析

前言:学习路径建议

本文档采用双模式结构,适合不同学习阶段:

  • 入门者:先看“通俗理解”部分,用生活化比喻掌握核心概念
  • 进阶者:细读“专业原理”部分,理解技术细节和底层机制
  • 实践者:按照案例步骤操作,通过注释理解每一步的意义
  • 复习者:快速浏览专业原理部分,巩固知识体系

所有案例均保留原始内容并添加详细注释,帮助理解和记忆。


第一部分:DHCP服务器 - 自动分配IP地址的"地址管家"

DHCP服务介绍

通俗理解

想象场景:你去一个新的写字楼上班,每个员工都需要一个工位。

  • 传统方式(静态分配):管理员手工记录每个人坐哪,容易出错:两个人坐同一个位置?新人来了要挨个安排,很麻烦。
  • 智能方式(DHCP):办公楼有个"智能分配系统"(DHCP服务器),新员工一进门就自动分配一个空闲工位,还告诉他:电梯在哪、茶水间在哪、WiFi密码是多少。

DHCP就是这个"智能分配系统",自动给网络设备分配IP地址和其他网络参数。

专业原理

动态主机配置协议(DHCP,Dynamic Host Configuration Protocol)是一种网络管理协议,主要功能包括:

  1. 自动化配置:自动分配IP地址、子网掩码、默认网关、DNS服务器等网络参数
  2. 地址管理:集中管理IP地址池,避免地址冲突
  3. 租约机制:IP地址有使用期限,到期可续租或重新分配
  4. 两种版本
    • DHCPv4:用于IPv4网络(当前主流)
    • DHCPv6:用于IPv6网络

解决的问题

  • 大规模网络中手工配置IP地址易出错、效率低
  • 移动设备(笔记本、手机)频繁接入网络的需求
  • 云环境中虚拟机自动获取网络配置

DHCP通信过程 - "找房子租房子"的比喻

通俗理解

租房四部曲

  1. 广播找房(DHCPDISCOVER):你到小区里喊:“我想租房!”
  2. 房东报价(DHCPOFFER):几个房东回应:“我有房出租,地址是XX,月租XX”
  3. 选择房东(DHCPREQUEST):你选择其中一个,喊:“我要租张房东的房子!”
  4. 签约确认(DHCPACK):张房东确认:“好的,租给你了,租期6个月”

租约快到期时,你要续租(再次发送DHCPREQUEST),房东同意就继续住。

专业原理

DHCP采用客户端-服务器模型,通过四个报文完成地址分配:

详细过程分析

1. DHCPDISCOVER(发现阶段)
  • 客户端行为:以广播方式(目标地址255.255.255.255)发送
  • 目的:寻找网络中的DHCP服务器
  • 内容:包含客户端MAC地址、请求参数列表
  • 网络要求:路由器默认不转发255.255.255.255广播,因此:
    • DHCP服务器需与客户端在同一子网,或
    • 配置DHCP中继代理(转发DHCP报文)
2. DHCPOFFER(提供阶段)
  • 服务器行为:广播(或单播)回应
  • 内容包含
    • 分配的IP地址
    • 租约期限(默认8天)
    • 其他网络参数(网关、DNS、域名等)
  • 注意:可能有多个服务器响应,客户端选择最先收到的
3. DHCPREQUEST(请求阶段)
  • 客户端行为:广播选择结果
  • 关键作用
    • 通知选中的服务器:“我接受你的报价”
    • 通知其他服务器:“我不需要你们的报价”
  • 包含:选中的服务器标识符(IP地址)
4. DHCPACK(确认阶段)
  • 服务器行为:确认分配
  • 作用:正式分配IP地址,客户端可以开始使用
  • 租约开始计时:从此时计算租约期限

租约续期机制

  • T1时间(50%租期):客户端尝试续租,向原服务器发送DHCPREQUEST(单播)
  • T2时间(87.5%租期):如果续租失败,客户端广播寻找其他服务器
  • 租约到期:停止使用IP地址,重新开始DHCP过程
多个DHCP服务器的特殊情况

专业原理

  • 正常情况:同一物理网络只应有一个DHCP服务器
  • 多服务器场景
    1. 客户端收到多个DHCPOFFER,选择最先到达的
    2. 客户端广播DHCPREQUEST,包含选中服务器的标识
    3. 权威服务器:管理特定地址范围,会对非自己分配的IP地址发送DHCPNAK拒绝
    4. 非权威服务器:忽略未知地址的DHCPREQUEST

默认配置:DHCP服务器默认是非权威的,避免接管其他服务器分配的地址。

部署DHCP服务器 - 实战指南

环境准备

检查网络接口配置

bash

# 查看网络接口,确认有BROADCAST地址
[root@server ~]# ip addr show ens160
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:e5:be:0f brd ff:ff:ff:ff:ff:ff
    inet 10.1.8.10/24 brd 10.1.8.255 scope global ens160
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fee5:be0f/64 scope link 
       valid_lft forever preferred_lft forever
# 注释:DHCP服务器必须有静态IP地址(这里是10.1.8.10/24)
# BROADCAST地址为10.1.8.255,这是DHCP广播需要的
安装DHCP软件

bash

# 安装DHCP服务器软件
[root@server ~]# yum install -y dhcp
# 注释:安装ISC DHCP服务器,这是最常用的开源DHCP实现

# 配置防火墙放行DHCP服务
[root@server ~]# firewall-cmd --add-service=dhcp
[root@server ~]# firewall-cmd --add-service=dhcp --permanent
# 注释:
# DHCP服务使用UDP端口67(服务器)和68(客户端)
# firewall-cmd --add-service=dhcp会自动放行这些端口
配置DHCP服务器

通俗理解:编写"租房规则手册",告诉DHCP服务器:

  • 哪些地址可以出租(地址池)
  • 租期多长
  • 还要提供哪些"配套设施"(网关、DNS等)

专业原理:主要配置文件/etc/dhcp/dhcpd.conf,结构分为全局参数和子网声明。

bash

# 使用示例配置文件作为模板
[root@server ~]# /bin/cp /usr/share/doc/dhcp-*/dhcpd.conf.example /etc/dhcp/dhcpd.conf
[root@server ~]# vim /etc/dhcp/dhcpd.conf

# 典型配置示例(添加到配置文件中)
subnet 10.1.8.0 netmask 255.255.255.0 {
  # 注释:定义子网10.1.8.0/24
  
  range 10.1.8.101 10.1.8.130;
  # 注释:可分配的IP地址范围(地址池)
  # 注意:服务器自己的IP(10.1.8.10)不能在range中
  
  option domain-name-servers 223.5.5.5;
  # 注释:提供给客户端的DNS服务器地址
  
  option domain-name "whisky.cloud";
  # 注释:域名后缀,客户端会使用hostname.whisky.cloud格式
  
  option routers 10.1.8.2;
  # 注释:默认网关地址
  
  option broadcast-address 10.1.8.255;
  # 注释:广播地址
  
  default-lease-time 600;
  # 注释:默认租约时间(秒),10分钟
  # 如果客户端未指定租期,使用此值
  
  max-lease-time 7200;
  # 注释:最大租约时间(秒),2小时
  # 客户端请求的租期不能超过此值
  
  authoritative;
  # 注释:声明本服务器对此子网具有权威性
  # 权威服务器会对非法租约发送DHCPNAK
}

配置参数详解

参数 作用 示例 备注
subnet 定义要服务的子网 10.1.8.0 netmask 255.255.255.0 必须与服务器接口在同一子网
range 可分配的IP地址范围 10.1.8.101 10.1.8.130 最多30个地址可用
option routers 默认网关 10.1.8.2 客户端路由表的默认路由
option domain-name-servers DNS服务器 223.5.5.5 可指定多个,用逗号分隔
option domain-name 域名后缀 "whisky.cloud" 用于主机名解析
default-lease-time 默认租期 600(10分钟) 单位:秒
max-lease-time 最大租期 7200(2小时) 单位:秒
authoritative 权威声明 - 服务器对子网有控制权
验证和启动服务

bash

# 验证配置文件语法
[root@server ~]# dhcpd -t
Internet Systems Consortium DHCP Server 4.2.5
Copyright 2004-2013 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/
Not searching LDAP since ldap-server, ldap-port and ldap-base-dn were not specified in the config file
# 注释:没有错误输出表示语法正确
# 如果有错误会显示具体行号和错误信息

# 启用并启动服务
[root@server ~]# systemctl enable dhcpd --now
# 注释:--now参数表示同时启动服务

# 查看服务状态
[root@server ~]# systemctl status dhcpd
● dhcpd.service - DHCPv4 Server Daemon
   Loaded: loaded (/usr/lib/systemd/system/dhcpd.service; enabled; vendor preset: disabled)
   Active: active (running) since Thu 2023-10-05 14:30:00 CST; 5s ago
   # 注释:Active: active (running) 表示服务正常运行
查看DHCP日志

bash

# 查看DHCP服务的详细日志
[root@server ~]# journalctl --unit=dhcpd.service -f
# 按Ctrl+C退出

# 示例日志输出(客户端获取IP过程):
# DHCPDISCOVER from 00:0c:29:26:13:b5 via eth0
# DHCPOFFER on 10.1.8.101 to 00:0c:29:26:13:b5 (hosta) via eth0
# DHCPREQUEST for 10.1.8.101 (10.1.8.2) from 00:0c:29:26:13:b5 (hosta) via eth0
# DHCPACK on 10.1.8.101 to 00:0c:29:26:13:b5 (hosta) via eth0

配置DHCP客户端

通俗理解

告诉你的电脑:“不要自己设定地址,去自动获取一个”

专业原理

使用NetworkManager配置动态IP获取:

bash

# 添加一个自动获取IP的网络连接
[root@client ~]# nmcli connection add con-name dynamic type ethernet ifname ens192
# 注释:
# con-name dynamic: 连接名称为"dynamic"
# type ethernet: 连接类型为以太网
# ifname ens192: 网卡设备名为ens192
# 默认情况下,新连接使用DHCP自动获取IP

# 激活连接
[root@client ~]# nmcli connection up dynamic

# 验证获取的IP地址
[root@client ~]# ip addr show ens192
3: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:26:13:b5 brd ff:ff:ff:ff:ff:ff
    altname enp11s0
    inet 10.1.8.101/24 brd 10.1.8.255 scope global dynamic noprefixroute ens192
       valid_lft 597sec preferred_lft 597sec
    # 注释:
    # dynamic: 表示通过DHCP获取的地址
    # valid_lft 597sec: 剩余有效时间597秒
    # preferred_lft 597sec: 优选生存时间597秒
    
    inet6 fe80::95db:2216:1a36:615/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

基于MAC地址预留IP地址

通俗理解

VIP固定座位:给重要员工预留固定工位,每次来都坐同一个位置。

通过MAC地址(网络设备的"身份证号")绑定特定IP地址。

专业原理

使用host声明实现IP-MAC绑定,适用于:

  • 服务器需要固定IP地址
  • 网络设备需要永久地址
  • 特定服务需要稳定网络标识

bash

# 1. 查看客户端的MAC地址
[root@client ~]# ip link show ens192
3: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
    link/ether 00:0c:29:26:13:b5 brd ff:ff:ff:ff:ff:ff
    altname enp11s0
# 注释:MAC地址是00:0c:29:26:13:b5
# MAC地址是网卡的唯一硬件标识

# 2. 在DHCP服务器配置静态绑定
[root@server ~]# vim /etc/dhcp/dhcpd.conf
# 在文件末尾添加:
host client.linux.fun {
  # 注释:host声明定义一个主机
  # client.linux.fun: 主机标识符(任意名称,用于识别)
  
  hardware ethernet 00:0c:29:26:13:b5;
  # 注释:绑定MAC地址
  
  fixed-address 10.1.8.30;
  # 注释:固定的IP地址
  # 注意:这个地址不能在range范围内
}

# 3. 重启DHCP服务使配置生效
[root@server ~]# systemctl restart dhcpd

# 4. 客户端验证(释放并重新获取IP)
[root@client ~]# nmcli connection down dynamic
[root@client ~]# nmcli connection up dynamic
[root@client ~]# ip addr show ens192
3: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:26:13:b5 brd ff:ff:ff:ff:ff:ff
    altname enp11s0
    inet 10.1.8.30/24 brd 10.1.8.255 scope global dynamic noprefixroute ens192
       valid_lft 245sec preferred_lft 245sec
    # 注释:成功获取到固定的IP地址10.1.8.30

高级用法:可以为静态绑定主机设置特定选项

bash

host server1 {
  hardware ethernet 00:0c:29:aa:bb:cc;
  fixed-address 10.1.8.50;
  option host-name "web-server";
  option domain-name-servers 8.8.8.8;
  # 注释:为这台主机单独指定主机名和DNS
}

第二部分:DNS服务器 - 互联网的"电话簿系统"

DNS服务介绍

通俗理解

电话簿比喻

  • 没有DNS:你想打电话给朋友,必须记住他的11位手机号(IP地址),难记易错。
  • 有DNS:你只需要记住朋友的名字(域名),电话簿(DNS)自动帮你查找到号码。

DNS就是互联网的"超级电话簿",把域名(如www.baidu.com)转换成IP地址(如39.156.66.10)。

专业原理

域名系统(DNS,Domain Name System)是:

  1. 分层分布式数据库:将域名和IP地址等资源信息分布在全球众多服务器上
  2. 命名系统:提供层次化的域名结构,方便人类记忆和使用
  3. 核心互联网服务:几乎所有网络应用都依赖DNS进行地址解析

DNS的三大功能

  1. 域名解析:域名 → IP地址(正向解析)
  2. 反向解析:IP地址 → 域名(反向解析)
  3. 邮件路由:通过MX记录指导邮件投递

DNS层次结构 - “倒置的树”

通俗理解

全球地址系统

  • 根域(.):像世界地图的索引,指向各大洲
  • 顶级域(.com, .cn):像国家/地区,如".com"商业区、".edu"教育区
  • 二级域(baidu.com:像城市,如"百度市"
  • 子域(www.baidu.com:像街道,如"百度市的网站街道"

查询时从右向左:先找世界地图,再找国家,再找城市,最后找到具体地址。

专业原理

DNS层次结构图

text

根域(.)
├── 顶级域(TLD)
│   ├── 通用顶级域(gTLD):.com, .org, .net, .edu
│   └── 国家代码顶级域(ccTLD):.cn, .us, .uk, .jp
│
└── 二级域(example.com, baidu.com)
    └── 子域(www.example.com, mail.example.com)
        └── 主机(server1.www.example.com)

关键术语

术语 定义 示例 说明
域(Domain) 资源记录的集合,以通用名结尾 whisky.cloud 整个子树,包含所有子域
顶级域(TLD) 根域的下一级 .com, .cn, .org 由IANA管理分配
子域(Subdomain) 另一个域的子集 lab.whisky.cloud whisky.cloud的子域
区域(Zone) 名称服务器直接负责的域部分 whisky.cloud区域 可能包含或不包含所有子域

区域(Zone)的重要性

  • 权威区域:名称服务器对该区域有最终解释权
  • 区域委派:父区域可以将子区域的管理权交给其他名称服务器
  • 区域文件:存储区域所有资源记录的文本文件

DNS查询类型 - “问路的方式”

通俗理解

两种问路方式

  1. 递归查询(全权委托):你问门卫:"快递站在哪?"门卫帮你跑腿问清楚,然后告诉你详细地址。
  2. 迭代查询(自己跑腿):你问门卫,门卫说:“我不知道,你去问街道办”;街道办说:“我不知道,你去问社区”;你自己一个个问下去。

通常,客户端对本地DNS使用递归查询,本地DNS对上级使用迭代查询。

专业原理
递归查询(Recursive Query)
  • 特征:查询方要求得到最终答案(是或否)
  • 过程:DNS服务器承担全部查询工作,直到获得最终结果
  • 使用场景:客户端 → 本地DNS服务器
  • 报文标志:RD(Recursion Desired)位=1

递归查询流程图

text

客户端 → 本地DNS服务器(递归查询)
本地DNS服务器 → 根服务器(迭代查询)
本地DNS服务器 → TLD服务器(迭代查询)  
本地DNS服务器 → 权威服务器(迭代查询)
本地DNS服务器 → 客户端(返回结果)
迭代查询(Iterative Query)
  • 特征:查询方接受部分答案或参考信息
  • 过程:被问服务器只告诉"下一步该问谁",不代为查询
  • 使用场景:本地DNS服务器 → 根/TLD/权威服务器
  • 报文标志:RD位=0

迭代查询流程图

text

客户端 → 根服务器:"www.example.com在哪?"
根服务器 → 客户端:"不知道,问.com服务器(地址是A.B.C.D)"
客户端 → .com服务器:"www.example.com在哪?"
.com服务器 → 客户端:"不知道,问example.com服务器(地址是E.F.G.H)"
客户端 → example.com服务器:"www.example.com在哪?"
example.com服务器 → 客户端:"IP是X.X.X.X"
实际查询示例

以查询www.example.com为例:

递归查询过程(客户端视角)

bash

# 客户端执行(实际发生的过程)
客户端 → 本地DNS:递归查询"www.example.com的IP?"
(等待...)
本地DNS → 客户端:"IP是93.184.216.34"
# 客户端只发出一次请求,收到最终答案

迭代查询过程(本地DNS视角)

bash

# 使用dig命令模拟迭代查询
[root@client ~]# dig +trace www.example.com

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.9 <<>> +trace www.example.com
;; global options: +cmd
.                       518400  IN      NS      a.root-servers.net.
.                       518400  IN      NS      b.root-servers.net.
...(列出所有根服务器)
;; Received 525 bytes from 10.1.8.10#53(10.1.8.10) in 5 ms

com.                    172800  IN      NS      a.gtld-servers.net.
com.                    172800  IN      NS      b.gtld-servers.net.
...(列出.com的TLD服务器)
;; Received 1174 bytes from 198.41.0.4#53(a.root-servers.net) in 30 ms

example.com.            172800  IN      NS      ns1.example.com.
example.com.            172800  IN      NS      ns2.example.com.
;; Received 800 bytes from 192.5.6.30#53(a.gtld-servers.net) in 50 ms

www.example.com.        300     IN      A       93.184.216.34
;; Received 60 bytes from 192.0.2.1#53(ns1.example.com) in 70 ms
# 注释:+trace选项显示完整的迭代查询路径

DNS资源记录 - “电话簿的条目类型”

通俗理解

不同类型的联系人信息

  • A记录:手机号(IPv4地址)
  • AAAA记录:新式手机号(IPv6地址)
  • CNAME记录:别名(“张总"也是"张三”)
  • MX记录:邮件地址(公司邮箱服务器)
  • NS记录:问讯处地址(该找谁问更多信息)
  • PTR记录:反向查找(用号码查姓名)
专业原理

资源记录(Resource Record,RR)是DNS数据库的基本单元,通用格式:

text

owner-name    TTL   class   type   data
────────────────────────────────────────────
www.example.com.  300   IN    A     192.0.2.1

字段说明

  • owner-name:记录所有者的域名
  • TTL:生存时间(秒),缓存有效期
  • class:记录类别,几乎总是IN(Internet)
  • type:记录类型(A、AAAA、CNAME等)
  • data:记录数据(格式因类型而异)
重要资源记录类型详解
1. A记录(地址记录)

功能:将主机名映射到IPv4地址

text

server.whisky.cloud.    86400   IN    A     172.25.254.254

用途:基本的主机名到IP地址映射

2. AAAA记录(IPv6地址记录)

功能:将主机名映射到IPv6地址

text

a.root-servers.net.    604800  IN    AAAA  2001:503:ba3e::2:30
3. CNAME记录(规范名称记录)

功能:创建别名,一个域名指向另一个域名

text

www-dev.whisky.cloud.   30      IN    CNAME lab.whisky.cloud.

重要规则

  • CNAME不能与其他记录类型共存
  • MX和NS记录不能指向CNAME
  • CNAME链最终必须指向A或AAAA记录
4. PTR记录(指针记录)

功能:反向解析,IP地址映射到主机名

text

4.0.41.198.in-addr.arpa.  785   IN    PTR   a.root-servers.net.

反向域格式

  • IPv4:IP反向.in-addr.arpa(如1.2.3.44.3.2.1.in-addr.arpa
  • IPv6:十六进制反转.ip6.arpa
5. NS记录(名称服务器记录)

功能:指定区域的权威名称服务器

text

whisky.cloud.           86400   IN    NS    classroom.whisky.cloud.

要求:NS记录指向的主机必须有A或AAAA记录

6. SOA记录(起始授权记录)

功能:定义区域的基本属性和参数

text

whisky.cloud.  86400  IN  SOA  dns.whisky.cloud.  admin.whisky.cloud. (
  2023100501  ; serial number
  3600        ; refresh (1 hour)
  300         ; retry (5 minutes)
  604800      ; expire (1 week)
  60          ; minimum (1 minute)
)

参数详解

参数 含义 示例值 说明
MNAME 主名称服务器 dns.whisky.cloud. 区域的主要服务器
RNAME 管理员邮箱 admin.whisky.cloud. @替换为点
SERIAL 序列号 2023100501 区域版本,修改时必须增加
REFRESH 刷新间隔 3600 从服务器检查更新的频率
RETRY 重试间隔 300 刷新失败后的重试间隔
EXPIRE 过期时间 604800 从服务器数据失效时间
MINIMUM 最小TTL 60 否定缓存时间
7. MX记录(邮件交换记录)

功能:指定域的邮件服务器

text

whisky.cloud.   86400   IN    MX    10   mail.whisky.cloud.
whisky.cloud.   86400   IN    MX    20   mail2.whisky.cloud.

特点

  • 优先级数字越小优先级越高
  • 支持邮件服务器冗余和负载均衡
8. TXT记录(文本记录)

功能:存储任意文本信息

text

whisky.cloud.   27272   IN    TXT   "v=spf1 a mx -all"

用途:SPF、DKIM、DMARC邮件验证,域名所有权验证

9. SRV记录(服务定位记录)

功能:定位提供特定服务的服务器

text

_ldap._tcp.whisky.cloud.  86400  IN  SRV  0 100 389  server0.whisky.cloud.

格式_服务._协议.域名.优先级 权重 端口 目标

配置权威名称服务器

通俗理解

建立自己的电话簿服务中心

  • 主服务器(Primary):总店,掌握原始数据
  • 从服务器(Secondary):分店,定期从总店同步数据
  • 缓存服务器(Caching):咨询点,只缓存不保存

你要建立whisky.cloud的"电话簿服务中心",管理所有*.whisky.cloud的查询。

专业原理

BIND(Berkeley Internet Name Domain):最常用的DNS服务器软件

服务器角色

  • 主服务器(Master):维护原始区域文件,可读写
  • 从服务器(Slave):从主服务器同步区域文件,只读
  • 缓存服务器(Caching):仅缓存查询结果,无权威数据

建议架构

text

                    +-------------------+
                    |   根/TLD服务器    |
                    +-------------------+
                            |
                    +-------------------+
                    |  公共从服务器     | ← 对外服务
                    |  (secondary)      |
                    +-------------------+
                            ^
                            | 区域传输
                    +-------------------+
                    |  私有主服务器     | ← 内部管理
                    |  (primary)        |
                    +-------------------+
安装BIND

bash

# 安装BIND DNS服务器
[root@server ~]# yum install -y bind bind-utils
# 注释:
# bind: DNS服务器软件包
# bind-utils: DNS客户端工具(dig, host, nslookup等)
配置BIND主配置文件

主要配置文件/etc/named.conf

bash

# 编辑主配置文件
[root@server ~]# vim /etc/named.conf

# 以下是关键配置部分,原文件中有很多注释和默认配置
# 我们主要修改以下部分:

options {
    # 监听地址和端口
    listen-on port 53 { 127.0.0.1; 10.1.8.10; };
    # 注释:监听本地回环和10.1.8.10的53端口
    # 53端口是DNS标准端口
    
    listen-on-v6 port 53 { ::1; };
    # 注释:监听IPv6回环地址
    
    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";
    
    allow-query     { any; };
    # 注释:允许谁查询(any表示任何人)
    # 生产环境应限制为特定网络
    
    recursion no;
    # 注释:关闭递归查询
    # 权威服务器通常关闭递归,防止被用于DNS放大攻击
    
    # 其他保持默认...
};

# 在文件末尾添加区域定义
zone "whisky.cloud" IN {
    # 注释:定义正向区域whisky.cloud
    
    type master;
    # 注释:服务器类型为主服务器
    
    file "whisky.cloud.zone";
    # 注释:区域文件名(相对路径,相对于/var/named)
    
    allow-update { none; };
    # 注释:不允许动态更新(安全考虑)
};

zone "8.1.10.in-addr.arpa" IN {
    # 注释:定义反向区域(对应10.1.8.0/24网络)
    # 反向域名格式:网络部分反转.in-addr.arpa
    
    type master;
    file "10.1.8.zone";
    allow-update { none; };
};
创建区域文件

区域文件位置/var/named/

创建正向区域文件

bash

# 创建正向区域文件
[root@server ~]# vim /var/named/whisky.cloud.zone

# 文件内容:
$TTL 3600
; 注释:默认TTL为1小时
; $TTL指令设置未明确指定TTL的记录默认值

@ IN SOA dns.whisky.cloud. root.whisky.cloud. (
    2023100501  ; serial number (YYYYMMDDNN)
    3H          ; refresh (3 hours)
    15M         ; retry (15 minutes)
    1W          ; expire (1 week)
    15M         ; minimum TTL for negative answers
)
; 注释:SOA记录,每个区域必须有且只有一个
; @表示区域名称(whisky.cloud.)
; dns.whisky.cloud.: 主名称服务器
; root.whisky.cloud.: 管理员邮箱(root@whisky.cloud.)

; 名称服务器记录
            IN NS    dns.whisky.cloud.
; 注释:指定区域的权威名称服务器
; 如果有多台NS服务器,每台都需要NS记录

; A记录(主机名到IPv4地址)
dns         IN A     10.1.8.10
; 注释:dns.whisky.cloud.的IP地址
; 注意:NS记录指向的dns必须有A记录

server      IN A     10.1.8.10
; server.whisky.cloud. → 10.1.8.10

client      IN A     10.1.8.11
; client.whisky.cloud. → 10.1.8.11

; CNAME记录(别名)
student     IN CNAME client.whisky.cloud.
; 注释:student.whisky.cloud.是client.whisky.cloud.的别名
; 实际IP还是10.1.8.11

; 带TTL的A记录
www      30 IN A     10.1.8.200
; 注释:www.whisky.cloud. → 10.1.8.200
; TTL为30秒(覆盖默认的3600秒)

; MX记录(邮件交换)
@           IN MX 10 mail.whisky.cloud.
; 注释:whisky.cloud.域的邮件服务器
; 优先级为10(数值越小优先级越高)

mail        IN A     10.1.8.253
; mail.whisky.cloud.的IP地址
创建反向区域文件

bash

# 创建反向区域文件
[root@server ~]# vim /var/named/10.1.8.zone

# 文件内容:
$TTL 3600
@ IN SOA dns.whisky.cloud. root.whisky.cloud. (
    2023100501  ; serial
    3H          ; refresh
    15M         ; retry
    1W          ; expire
    15M         ; minimum
)

; 名称服务器记录
            IN NS    dns.whisky.cloud.

; PTR记录(IP地址到主机名)
10          IN PTR   server.whisky.cloud.
; 注释:10.1.8.10 → server.whisky.cloud.
; 只写主机部分(10),自动补全为10.1.8.10

10          IN PTR   dns.whisky.cloud.
; 注释:一个IP可以有多个PTR记录
; 10.1.8.10也指向dns.whisky.cloud.

11          IN PTR   client.whisky.cloud.
11          IN PTR   student.whisky.cloud.
; 注释:client和student共享IP 10.1.8.11

100         IN PTR   ns1.whisky.cloud.
200         IN PTR   www.whisky.cloud.
253         IN PTR   mail.whisky.cloud.
设置文件权限和SELinux上下文

bash

# 设置正确的权限
[root@server ~]# chmod 640 /var/named/*.zone
[root@server ~]# chown root:named /var/named/*.zone
# 注释:
# 640权限:所有者可读写,组成员可读,其他人无权限
# root:named:所有者root,所属组named(BIND服务运行用户组)

# 设置SELinux上下文(如果SELinux开启)
[root@server ~]# chcon -t named_zone_t /var/named/*.zone
# 注释:设置正确的SELinux文件类型
# 如果不设置,SELinux可能阻止named服务读取文件

# 检查SELinux上下文
[root@server ~]# ls -Z /var/named/*.zone
-rw-r-----. root named system_u:object_r:named_zone_t:s0 /var/named/10.1.8.zone
-rw-r-----. root named system_u:object_r:named_zone_t:s0 /var/named/whisky.cloud.zone
验证配置

bash

# 验证主配置文件语法
[root@server ~]# named-checkconf
# 注释:无输出表示语法正确

# 验证正向区域文件
[root@server ~]# named-checkzone whisky.cloud /var/named/whisky.cloud.zone
zone whisky.cloud/IN: loaded serial 2023100501
OK
# 注释:显示加载成功,序列号为2023100501

# 验证反向区域文件  
[root@server ~]# named-checkzone 8.1.10.in-addr.arpa /var/named/10.1.8.zone
zone 8.1.10.in-addr.arpa/IN: loaded serial 2023100501
OK
启动BIND服务

bash

# 启动named服务
[root@server ~]# systemctl enable named --now
# 注释:--now表示同时启动服务

# 查看服务状态
[root@server ~]# systemctl status named
● named.service - Berkeley Internet Name Domain (DNS)
   Loaded: loaded (/usr/lib/systemd/system/named.service; enabled; vendor preset: disabled)
   Active: active (running) since Thu 2023-10-05 15:00:00 CST; 10s ago
   # Active: active (running) 表示服务正常运行

# 查看启动日志
[root@server ~]# journalctl -u named -f
# 按Ctrl+C退出
# 应该看到类似信息:
# zone whisky.cloud/IN: loaded serial 2023100501
# zone 8.1.10.in-addr.arpa/IN: loaded serial 2023100501
# all zones loaded
# running

# 配置防火墙放行DNS服务
[root@server ~]# firewall-cmd --add-service=dns
[root@server ~]# firewall-cmd --add-service=dns --permanent
# 注释:DNS使用UDP/TCP端口53
客户端测试DNS解析
方法1:配置客户端使用DNS服务器

bash

# 配置客户端使用我们的DNS服务器
[root@client ~]# nmcli connection modify ens32 ipv4.dns 10.1.8.10
[root@client ~]# nmcli connection up ens32
# 注释:将DNS服务器设置为10.1.8.10

# 使用ping测试
[root@client ~]# ping -c 3 student.whisky.cloud
PING student.whisky.cloud (10.1.8.11) 56(84) bytes of data.
64 bytes from client.whisky.cloud (10.1.8.11): icmp_seq=1 ttl=64 time=0.5 ms
# 注释:成功解析student.whisky.cloud为10.1.8.11

[root@client ~]# ping -c 3 dns.whisky.cloud
PING dns.whisky.cloud (10.1.8.10) 56(84) bytes of data.
64 bytes from server.whisky.cloud (10.1.8.10): icmp_seq=1 ttl=64 time=0.3 ms
方法2:使用host命令

bash

[root@client ~]# host student.whisky.cloud
student.whisky.cloud is an alias for client.whisky.cloud.
client.whisky.cloud has address 10.1.8.11
# 注释:显示student是client的别名,IP是10.1.8.11

[root@client ~]# host 10.1.8.11
11.8.1.10.in-addr.arpa domain name pointer client.whisky.cloud.
11.8.1.10.in-addr.arpa domain name pointer student.whisky.cloud.
# 注释:反向解析成功,IP 10.1.8.11对应client和student
方法3:使用dig命令(专业工具)

bash

# 安装dig工具
[root@client ~]# yum install -y bind-utils

# 查询A记录
[root@client ~]# dig @10.1.8.10 student.whisky.cloud

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.9 <<>> @10.1.8.10 student.whisky.cloud
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 12345
;; flags: qr aa rd; QUERY: 1, ANSWER: 2, AUTHORITY: 1, ADDITIONAL: 2
;; WARNING: recursion requested but not available

;; QUESTION SECTION:
;student.whisky.cloud.       IN      A

;; ANSWER SECTION:
student.whisky.cloud. 3600   IN      CNAME   client.whisky.cloud.
client.whisky.cloud.  3600   IN      A       10.1.8.11

;; AUTHORITY SECTION:
whisky.cloud.         3600   IN      NS      dns.whisky.cloud.

;; ADDITIONAL SECTION:
dns.whisky.cloud.     3600   IN      A       10.1.8.10

;; Query time: 1 msec
;; SERVER: 10.1.8.10#53(10.1.8.10)
;; WHEN: Thu Oct 05 15:10:00 CST 2023
;; MSG SIZE  rcvd: 108
# 注释:
# @10.1.8.10:指定查询的DNS服务器
# qr aa:响应报文,权威答案
# ANSWER SECTION:回答部分,显示CNAME和A记录
# AUTHORITY SECTION:权威部分,显示区域的NS记录
# ADDITIONAL SECTION:额外部分,显示NS记录的A记录

# 查询NS记录
[root@client ~]# dig @10.1.8.10 whisky.cloud NS

# 查询MX记录
[root@client ~]# dig @10.1.8.10 whisky.cloud MX

# 查询PTR记录(反向解析)
[root@client ~]# dig @10.1.8.10 -x 10.1.8.100
# 注释:-x参数用于反向解析
方法4:测试递归查询

bash

# 测试递归查询(服务器关闭递归时应该失败)
[root@client ~]# dig @10.1.8.10 www.baidu.com
;; WARNING: recursion requested but not available
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: REFUSED, id: 12346
# 注释:REFUSED表示服务器拒绝递归查询
# 这是正确的,因为我们配置了recursion no
方法5:测试迭代查询

bash

# 使用+trace选项显示完整查询路径
[root@client ~]# dig +trace @10.1.8.10 www.baidu.com
# 注释:+trace显示从根开始的完整迭代查询过程
# 由于我们的服务器关闭递归,可能无法完成查询

区域委派 - 建立"分支机构"

通俗理解

总公司与分公司

  • 总公司(whisky.cloud)管理所有业务
  • 业务增长后,设立开发部(dev.whisky.cloud)独立管理
  • 总公司的通讯录上写:“开发部事宜,请联系开发部负责人”
  • 开发部有自己的通讯录和负责人
专业原理

区域委派(Zone Delegation)将子域的管理权交给其他名称服务器。

配置子域委派

bash

# 在父区域(whisky.cloud)中添加委派记录
[root@server ~]# vim /var/named/whisky.cloud.zone
# 在文件末尾添加:

; 委派子域 dev.whisky.cloud 给其他名称服务器
dev.whisky.cloud.    IN  NS  ns1.dev.whisky.cloud.
dev.whisky.cloud.    IN  NS  ns2.dev.whisky.cloud.

; 粘合记录(Glue Records)
; 为子域的名称服务器提供IP地址
ns1.dev.whisky.cloud.  IN  A  10.1.8.150
ns2.dev.whisky.cloud.  IN  A  10.1.8.151

# 注释:
# NS记录:指定子域的权威名称服务器
# 粘合记录:提供子域NS服务器的IP地址
# 如果没有粘合记录,查询会陷入循环:
# 问:"dev.whisky.cloud的NS记录?"
# 答:"ns1.dev.whisky.cloud"
# 问:"ns1.dev.whisky.cloud的IP是多少?"
# 需要问dev.whisky.cloud的服务器... 循环!
子域服务器的配置

bash

# 在子域服务器(10.1.8.150)上配置
[root@ns1 ~]# vim /etc/named.conf
# 添加区域定义:
zone "dev.whisky.cloud" IN {
    type master;
    file "dev.whisky.cloud.zone";
};

# 创建区域文件
[root@ns1 ~]# vim /var/named/dev.whisky.cloud.zone

$TTL 3600
@ IN SOA ns1.dev.whisky.cloud. admin.dev.whisky.cloud. (
    2023100501
    3H
    15M
    1W
    15M
)

            IN NS    ns1.dev.whisky.cloud.
            IN NS    ns2.dev.whisky.cloud.

ns1         IN A     10.1.8.150
ns2         IN A     10.1.8.151

web         IN A     10.1.8.152
db          IN A     10.1.8.153

第三部分:综合应用与故障排除

DHCP与DNS协同工作

通俗理解

酒店入住系统

  • DHCP:前台,给客人分配房间号(IP地址)
  • DNS:电话总机,告诉别人"王先生在302房间"

客人入住(DHCP分配IP)后,电话总机(DNS)就知道他在哪个房间了。

专业原理

动态DNS(DDNS):DHCP服务器在分配IP地址后,自动更新DNS记录。

配置DHCP更新DNS(高级功能):

bash

# 在DHCP服务器配置中启用DNS更新
[root@server ~]# vim /etc/dhcp/dhcpd.conf

ddns-update-style interim;
# 注释:启用动态DNS更新

zone whisky.cloud. {
    primary 10.1.8.10;
    # 注释:指定更新哪个DNS区域
}

subnet 10.1.8.0 netmask 255.255.255.0 {
    # ...其他配置...
    
    ddns-domainname "whisky.cloud.";
    ddns-rev-domainname "in-addr.arpa.";
    # 注释:设置域名
    
    # 为客户端设置主机名
    option host-name = concat("host-", binary-to-ascii(10, 8, "-", leased-address));
}

常见故障排除

DHCP故障排查

bash

# 1. 检查DHCP服务状态
[root@server ~]# systemctl status dhcpd

# 2. 检查DHCP日志
[root@server ~]# journalctl -u dhcpd -f

# 3. 客户端释放并重新获取IP
[root@client ~]# dhclient -r ens192  # 释放IP
[root@client ~]# dhclient ens192     # 重新获取IP

# 4. 检查DHCP端口是否监听
[root@server ~]# netstat -tulnp | grep :67
udp        0      0 0.0.0.0:67       0.0.0.0:*       1234/dhcpd
# 注释:DHCP服务器监听UDP 67端口

# 5. 使用tcpdump抓包分析
[root@server ~]# tcpdump -i ens160 port 67 or port 68 -v
# 注释:捕获DHCP报文(客户端68,服务器67)
DNS故障排查

bash

# 1. 检查DNS服务状态
[root@server ~]# systemctl status named

# 2. 检查DNS日志
[root@server ~]# journalctl -u named -f

# 3. 验证配置文件语法
[root@server ~]# named-checkconf
[root@server ~]# named-checkzone whisky.cloud /var/named/whisky.cloud.zone

# 4. 检查DNS端口是否监听
[root@server ~]# netstat -tulnp | grep :53
tcp        0      0 10.1.8.10:53       0.0.0.0:*       1235/named
udp        0      0 10.1.8.10:53       0.0.0.0:*       1235/named
# 注释:DNS监听TCP/UDP 53端口

# 5. 使用dig逐步排查
# 检查根服务器
[root@client ~]# dig @a.root-servers.net . NS

# 检查本地解析
[root@client ~]# dig @127.0.0.1 www.baidu.com

# 检查权威解析
[root@client ~]# dig @10.1.8.10 whisky.cloud SOA

# 6. 使用nslookup交互模式
[root@client ~]# nslookup
> server 10.1.8.10
> student.whisky.cloud
> set type=MX
> whisky.cloud
> exit

安全最佳实践

DHCP安全
  1. MAC地址过滤:只允许已知设备获取IP
  2. 静态绑定:服务器使用固定IP,不通过DHCP获取
  3. 监控日志:定期检查异常DHCP请求
  4. 防止 rogue DHCP:网络设备配置DHCP Snooping
DNS安全
  1. 关闭递归:权威服务器关闭递归查询
  2. 访问控制:限制区域传输和查询
  3. DNSSEC:启用DNS安全扩展,防止缓存投毒
  4. 隐藏版本:不显示BIND版本信息
  5. 日志监控:监控异常查询模式

bash

# BIND安全配置示例
options {
    # 隐藏版本信息
    version "Not disclosed";
    
    # 限制区域传输
    allow-transfer { 10.1.8.150; };  # 只允许从服务器
    
    # 限制查询
    allow-query { 10.1.8.0/24; localhost; };
    
    # 关闭递归
    recursion no;
    
    # 启用DNSSEC验证
    dnssec-enable yes;
    dnssec-validation yes;
};

总结与进阶学习

关键知识点回顾

服务 核心功能 关键概念 配置文件
DHCP 自动分配IP地址 租约、地址池、MAC绑定 /etc/dhcp/dhcpd.conf
DNS 域名解析 区域、资源记录、递归/迭代 /etc/named.conf/var/named/*.zone

实际应用场景

  1. 中小企业网络
    • DHCP:为员工电脑自动分配IP
    • DNS:内部服务器域名解析(如oa.company.com
  2. 数据中心
    • DHCP:为虚拟机自动配置网络
    • DNS:服务发现、负载均衡
  3. 云环境
    • DHCP:云实例网络初始化
    • DNS:域名映射、服务路由

进阶学习方向

  1. 高可用性
    • DHCP故障转移
    • DNS主从复制、负载均衡
  2. 安全增强
    • DHCP Snooping
    • DNSSEC部署
    • DNS over HTTPS/TLS
  3. 高级功能
    • 动态DNS(DDNS)
    • DNS视图(View)
    • 智能DNS(基于地理位置解析)
  4. 监控与管理
    • 使用Prometheus监控DNS/DHCP
    • 自动化配置管理(Ansible)

实践建议

  1. 搭建实验环境:使用VirtualBox创建多台虚拟机
  2. 分阶段实施
    • 阶段1:独立部署DHCP和DNS
    • 阶段2:配置DHCP静态绑定
    • 阶段3:配置DNS子域委派
    • 阶段4:实现DHCP-DNS联动
  3. 故障模拟:故意制造故障并修复,加深理解
  4. 文档记录:记录配置过程和问题解决方法

通过本文档的双重解析结构,您可以根据自身水平选择学习路径。所有示例都经过详细注释,建议实际操作并观察执行效果,以加深理解。网络服务配置需要理论与实践结合,多动手操作是掌握的关键。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐