DHCP与DNS服务器配置详解 - 通俗与专业双视角解析
想象场景:你去一个新的写字楼上班,每个员工都需要一个工位。传统方式(静态分配):管理员手工记录每个人坐哪,容易出错:两个人坐同一个位置?新人来了要挨个安排,很麻烦。智能方式(DHCP):办公楼有个"智能分配系统"(DHCP服务器),新员工一进门就自动分配一个空闲工位,还告诉他:电梯在哪、茶水间在哪、WiFi密码是多少。DHCP就是这个"智能分配系统",自动给网络设备分配IP地址和其他网络参数。电话
DHCP与DNS服务器配置详解 - 通俗与专业双视角解析
前言:学习路径建议
本文档采用双模式结构,适合不同学习阶段:
- 入门者:先看“通俗理解”部分,用生活化比喻掌握核心概念
- 进阶者:细读“专业原理”部分,理解技术细节和底层机制
- 实践者:按照案例步骤操作,通过注释理解每一步的意义
- 复习者:快速浏览专业原理部分,巩固知识体系
所有案例均保留原始内容并添加详细注释,帮助理解和记忆。
第一部分:DHCP服务器 - 自动分配IP地址的"地址管家"
DHCP服务介绍
通俗理解
想象场景:你去一个新的写字楼上班,每个员工都需要一个工位。
- 传统方式(静态分配):管理员手工记录每个人坐哪,容易出错:两个人坐同一个位置?新人来了要挨个安排,很麻烦。
- 智能方式(DHCP):办公楼有个"智能分配系统"(DHCP服务器),新员工一进门就自动分配一个空闲工位,还告诉他:电梯在哪、茶水间在哪、WiFi密码是多少。
DHCP就是这个"智能分配系统",自动给网络设备分配IP地址和其他网络参数。
专业原理
动态主机配置协议(DHCP,Dynamic Host Configuration Protocol)是一种网络管理协议,主要功能包括:
- 自动化配置:自动分配IP地址、子网掩码、默认网关、DNS服务器等网络参数
- 地址管理:集中管理IP地址池,避免地址冲突
- 租约机制:IP地址有使用期限,到期可续租或重新分配
- 两种版本:
- DHCPv4:用于IPv4网络(当前主流)
- DHCPv6:用于IPv6网络
解决的问题:
- 大规模网络中手工配置IP地址易出错、效率低
- 移动设备(笔记本、手机)频繁接入网络的需求
- 云环境中虚拟机自动获取网络配置
DHCP通信过程 - "找房子租房子"的比喻
通俗理解
租房四部曲:
- 广播找房(DHCPDISCOVER):你到小区里喊:“我想租房!”
- 房东报价(DHCPOFFER):几个房东回应:“我有房出租,地址是XX,月租XX”
- 选择房东(DHCPREQUEST):你选择其中一个,喊:“我要租张房东的房子!”
- 签约确认(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服务器
- 多服务器场景:
- 客户端收到多个DHCPOFFER,选择最先到达的
- 客户端广播DHCPREQUEST,包含选中服务器的标识
- 权威服务器:管理特定地址范围,会对非自己分配的IP地址发送DHCPNAK拒绝
- 非权威服务器:忽略未知地址的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)是:
- 分层分布式数据库:将域名和IP地址等资源信息分布在全球众多服务器上
- 命名系统:提供层次化的域名结构,方便人类记忆和使用
- 核心互联网服务:几乎所有网络应用都依赖DNS进行地址解析
DNS的三大功能:
- 域名解析:域名 → IP地址(正向解析)
- 反向解析:IP地址 → 域名(反向解析)
- 邮件路由:通过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查询类型 - “问路的方式”
通俗理解
两种问路方式:
- 递归查询(全权委托):你问门卫:"快递站在哪?"门卫帮你跑腿问清楚,然后告诉你详细地址。
- 迭代查询(自己跑腿):你问门卫,门卫说:“我不知道,你去问街道办”;街道办说:“我不知道,你去问社区”;你自己一个个问下去。
通常,客户端对本地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.4→4.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安全
- MAC地址过滤:只允许已知设备获取IP
- 静态绑定:服务器使用固定IP,不通过DHCP获取
- 监控日志:定期检查异常DHCP请求
- 防止 rogue DHCP:网络设备配置DHCP Snooping
DNS安全
- 关闭递归:权威服务器关闭递归查询
- 访问控制:限制区域传输和查询
- DNSSEC:启用DNS安全扩展,防止缓存投毒
- 隐藏版本:不显示BIND版本信息
- 日志监控:监控异常查询模式
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 |
实际应用场景
- 中小企业网络:
- DHCP:为员工电脑自动分配IP
- DNS:内部服务器域名解析(如oa.company.com)
- 数据中心:
- DHCP:为虚拟机自动配置网络
- DNS:服务发现、负载均衡
- 云环境:
- DHCP:云实例网络初始化
- DNS:域名映射、服务路由
进阶学习方向
- 高可用性:
- DHCP故障转移
- DNS主从复制、负载均衡
- 安全增强:
- DHCP Snooping
- DNSSEC部署
- DNS over HTTPS/TLS
- 高级功能:
- 动态DNS(DDNS)
- DNS视图(View)
- 智能DNS(基于地理位置解析)
- 监控与管理:
- 使用Prometheus监控DNS/DHCP
- 自动化配置管理(Ansible)
实践建议
- 搭建实验环境:使用VirtualBox创建多台虚拟机
- 分阶段实施:
- 阶段1:独立部署DHCP和DNS
- 阶段2:配置DHCP静态绑定
- 阶段3:配置DNS子域委派
- 阶段4:实现DHCP-DNS联动
- 故障模拟:故意制造故障并修复,加深理解
- 文档记录:记录配置过程和问题解决方法
通过本文档的双重解析结构,您可以根据自身水平选择学习路径。所有示例都经过详细注释,建议实际操作并观察执行效果,以加深理解。网络服务配置需要理论与实践结合,多动手操作是掌握的关键。
更多推荐
所有评论(0)