DHCP服务器部署
DHCP(Dynamic Host Configuration Protocol) 是一种网络管理协议,其主要目的是自动分配 IP 地址和其他相关的网络配置参数给客户端;
DHCP 客户端获取 IP 地址和配置信息的过程遵循一个标准的四步交互,通常被称为 DORA 过程(Discover, Offer, Request, Acknowledgement);这个过程主要使用 UDP 协议,客户端使用端口 68,服务器使用端口 67;
DORA过程分为四个步骤:
- DHCP Discover:DHCP 客户端在启动时没有 IP 地址,它会在本地物理网络上广播一个 DHCP Discover 消息,该消息的目标IP为255.255.255.255;内容包含了客户端的 MAC 地址和一个随机生成的事务 ID;
- DHCP Offer:收到 DHCP Discover 广播消息的 DHCP 服务器会做出响应;服务器从它的可用地址池中选择一个未分配的 IP 地址,然后向客户端发送一个 DHCP Offer 消息;如果客户端能接受单播,且服务器知道其链路层地址,那么服务器会进行单播;如果客户端在 Discover 中未设置广播标志,或服务器不确定,那么服务器会广播消息;
- DHCP Request:客户端收到 DHCP Offer,如果网络中有多个 DHCP 服务器响应,客户端会收到多个 DHCP Offer;客户端通常会选择它收到的第一个 Offer 广播一个 DHCP Request 消息(目标IP同样为255.255.255.255);该消息的目的是通知被选中的服务器接受它提供的配置,并通知没有被选中的服务器释放保留的 IP 地址;
- DHCP Acknowledgement: 被选中的 DHCP 服务器收到 DHCP Request 广播消息;服务器确认该 IP 地址依然可以分配给该客户端,然后向客户端发送一个 DHCP ACK 消息;如果服务器发现它不能再提供该 IP 地址,它会发送 DHCP NAK 消息,客户端收到 NAK 后必须重新启动整个 DORA 过程;DHCP NAK 消息的目的是正式确认租约生效,并提供完整的配置参数,成功后客户端IP配置完成;
DHCPv4和DHCPv6分别是用于IPv4网络和IPv6网络的两种协议;
dhcpd服务使用/etc/dhcp/dhcpd.conf进行配置;
[root@server ~]# cat /etc/dhcp/dhcpd.conf
authoritative;
# 以下为主作用域
subnet 10.1.8.0 netmask 255.255.255.0 {
range 10.1.8.101 10.1.8.130;
option domain-name-servers 223.5.5.5;
option domain-name "gc.cloud";
option routers 10.1.8.1;
option subnet-mask 255.255.255.0;
option broadcast-address 10.1.8.255;
default-lease-time 28800;
max-lease-time 86400;
}
# 配置防火墙放行DHCP
[root@server ~]# firewall-cmd --add-service=dhcp --permanent
- subnet / netmask:网段IP及掩码;用于声明一个 DHCP 作用域,服务器只会向与该子网直接或中继相连的网络接口提供服务;
- range:IP 地址池;前一个IP代表地址池第一个IP,后一个IP代表最后一个,服务器只会从地址池中选取地址进行分配;如果想要配置多段不相连的地址池,可以使用多个range;
- option domain-name-servers:指定客户端应该使用的 DNS 服务器;
- option domain-name:为客户机指定默认的搜索域名;
- option routers:指定客户端的默认网关;
- option subnet-mask:指定客户端应该使用的子网掩码;必须与 subnet 声明中定义的掩码一致;
- option broadcast-address:广播地址;客户端会使用这个地址发送广播包;
- default-lease-time:租约时间,单位秒;如果客户端在请求时没有指定租期,就使用该值;
- max-lease-time:最大租约时间,单位秒;即使客户端请求更长的租期,也不允许超过该值;
在主作用域之前,还有一个全局配置:authoritative,该配置表示该服务器是该子网或所拥有的地址池的权威服务器;
在同一子网内,特别是存在多个DHCP服务器时,可能导致地址冲突或静默忽略等问题;authoritative配置的作用就是为了解决冲突;
想理解权威服务器、地址冲突和静默忽略,首先要理解租约的概念;
租约是DHCP服务器对客户端临时使用IP地址和其他网络配置参数的授权;它主要表明IP的使用期限,服务器和客户端都会记录租约信息到数据库:
- 服务器端租约文件:
/var/lib/dhcp/dhcpd.lease - 客户端租约文件:
/var/lib/dhclient/dhclient.leases
[root@server ~]# cat /var/lib/dhcp/dhcpd.lease
lease 192.168.1.100 {
starts 2025/11/24 10:00:00;
ends 2025/11/24 18:00:00;
hardware ethernet 00:0c:29:8e:d3:14;
client-hostname "client.gc.cloud";
}
比如,当一台客户端在一个临时的 DHCP 服务器获得了一个 IP 地址,它在租约文件中记下了这个IP;之后,这个客户端接入了一个新的子网,并尝试续租它之前使用的IP;
假设服务器没有配置authoritative,这时服务器的响应是静默忽略;因为新服务器的租约文件中没有客户端租用IP的记录,如果它不是权威,它会认为客户端在向其他服务器进行询问;而长时间没有收到回应的客户端会误认为它成功续租了IP,如果IP实际被占用,会造成地址冲突;
但如果新服务器配置了authoritative,新服务器会检查租约文件并发现客户端没有租约记录,因此向客户端发送DHCPNAK消息拒绝连接;这样客户端就必须重新进行DORA过程,从而避免上文中的问题;
配置单一authoritative保证子网中即使存在多个 DHCP 服务器,网络也能维持正常的秩序;
但也可以故意部署多台权威服务器,为它们划分互不重叠的地址池;这种方式下,多台服务器各自管理一部分IP资源,可以起到负载分担和备份的作用;
配置完成并启动服务后,就可以使用DHCP服务器了;之后需要配置客户端网卡为自动获取 IP,静态配置的网卡不会发起DHCP请求;
[root@client ~]# nmcli connection modify type ethernet ifname ens36 con-name ens36-auto ipv4.method auto
[root@client ~]# nmcli connection up ens36-auto
也可以将客户端的信息配置在dhcpd的配置文件中;这样DHCP服务器会为该客户端预留IP,以保证该客户端每次都能成功连接DHCP服务器;
[root@server ~]# cat /etc/dhcp/dhcpd.conf | tail -n 5
host client.gc.cloud {
hardware ethernet 08:00:27:DE:AD:BE; # 客户端MAC地址
fixed-address 10.1.8.201; # 预留IP
option dhcp-lease-time infinite; # 无限租期
}
DHCP中继代理
DHCP中继代理(DHCP Relay Agent)在不同子网之间转发DHCP消息,使得单个DHCP服务器可以为多个子网提供服务;这样就无需在每个子网都部署DHCP服务器;
存在DHCP中继代理参与的DORA 过程与原始的DORA并没有太大区别,只是每次服务器和客户端之间传递消息都需要经过中继代理;且中继代理会将客户端的广播包封装为单播包发送给服务器,并在转发时设置网关字段,DHCP服务器根据该字段确定客户端所属子网;
使用DHCP中继代理时,最需要注意的是三方的网卡配置:
- 客户端:除必须配置为自动获取模式外,无特殊要求;客户端感知不到中继代理存在;
- 中继代理:有两种方法配置中继代理,配置文件分别为
/etc/default/isc-dhcp-relay和/etc/systemd/system/dhcrelay.service;这两个文件都需要手动创建,因为很多系统默认不安装中继代理软件包;
第一种方法更简单,只需配置少量参数:
# 第一种方法需先安装isc-dhcp-relay
[root@relay ~]# yum install -y isc-dhcp-relay
[root@relay ~]# cat /etc/default/isc-dhcp-relay
SERVERS="10.1.8.10" # DHCP服务器IP(可有多个)
INTERFACES="eth0" # 监听客户端DHCP请求的网络接口
OPTIONS="" # 其他选项(可选)
[root@relay ~]# systemctl start isc-dhcp-relay
[root@relay ~]# systemctl enable isc-dhcp-relay
第二种方法实际上绕过了中间配置文件,直接告诉程序该如何运行;无需下载任何软件包;
[root@relay ~]# cat /etc/systemd/system/dhcrelay.service
[Unit]
Description=DHCP Relay Agent Daemon
Documentation=man:dhcrelay(8)
Wants=network-online.target
After=network-online.target
[Service]
Type=notify
# DHCP服务器IP
ExecStart=/usr/sbin/dhcrelay -d --no-pid -i eth0 10.1.8.10
# -d: 在前台运行
# --no-pid: 不创建PID文件
[Install]
WantedBy=multi-user.target
[root@relay ~]# systemctl daemon-reload
[root@relay ~]# systemctl start dhcrelay
- DHCP服务器:由于通过中继代理的客户端是来自其它子网,所以需要在配置文件中添加适用于该子网的作用域;
# 专用于10.1.1网段
subnet 10.1.1.0 netmask 255.255.255.0 {
range 10.1.1.101 10.1.1.200;
option routers 10.1.1.20;
option broadcast-address 10.1.1.255;
option domain-name-servers 223.5.5.5;
option domain-search "gc.cloud";
default-lease-time 600;
max-lease-time 7200;
}
DNS服务器部署
DNS(域名系统)负责将人类易于记忆的域名(如 www.example.com)转换成计算机用于路由通信的IP地址(如 192.0.2.1 或 2001:db8::1);DNS 服务器是一种运行特殊软件的网络服务器,主要用于响应 DNS 查询、解析域名、管理域名区域等;
当用户在浏览器中输入 www.example.com 并按下回车后,DNS会按下列步骤进行工作:
- 查询本地缓存:首先检查本地 DNS 缓存,看是否最近查询过 www.example.com 并缓存了其 IP 地址;如果缓存有效,直接使用缓存的 IP 地址,无需进行后续步骤;
- 查询递归解析器:如果本地缓存没有,则向递归 DNS 解析器发送一个 DNS 查询请求;该查询通常为递归查询,递归解析器首先检查自己的缓存是否有 www.example.com 的记录;如果有且有效,直接返回给客户端;如果没有缓存,则开始下列步骤;
- 递归解析器查询根域名服务器:递归解析器知道全球有 13 组根域名服务器,它向其中一个根服务器发送一个迭代查询,询问 www.example.com 的地址;根服务器查看请求的域名后缀(.com),回复一个指向负责 .com 顶级域的顶级域名服务器的列表;
- 递归解析器查询顶级域名服务器:递归解析器收到根服务器的回复,它选择其中一个 .com TLD 服务器,向其发送一个迭代查询,询问 www.example.com 的地址;.com TLD 服务器查看请求的二级域名(example),回复一个指向负责 example.com 域的权威 DNS 服务器的列表;
- 递归解析器查询权威域名服务器:递归解析器收到 TLD 服务器的回复,选择其中一个 example.com 的权威 DNS 服务器,向其发送一个迭代查询,询问 www.example.com 的地址;example.com 的权威 DNS 服务器在其区域文件中查找 www.example.com 的记录,如果找到了记录,则将这个 IP 地址作为最终答案回复给递归解析器;
- 递归解析器回复客户端并缓存结果:递归解析器将这个 IP 地址作为 DNS 响应回复给客户端;然后缓存这个查询结果;
- 客户端建立连接:浏览器使用这个 IP 地址建立连接;
以下以BIND为例说明如何搭建一个DNS服务器:
[root@server ~]# yum install -y bind bind-utils
安装完成后,BIND 的服务名通常是 named 或 bind9;
BIND 的主要配置文件包括:
- /etc/named.conf或/etc/bind/named.conf:主配置文件,通过 include 语句将其他配置文件引入;
- /etc/bind/named.conf.options:定义全局选项,如监听地址、允许查询的客户端、转发规则等;
- /etc/bind/named.conf.local:定义本地管理的权威区域;用于配置权威服务器;
- /var/named/或/var/cache/bind/:存放区域文件的目录,这些文件包含了域名到 IP 的实际映射记录;
一般情况下,配置工作主要集中在named.conf.options和named.conf.local;低版本的bind可能没有这两个文件,那么就直接写在/etc/named.conf里也可以;
/etc/bind/named.conf.options配置的是BIND服务器的全局行为;对整个 DNS 服务器进程生效;
options {
# 使用 any 表示监听所有IPv4和IPv6接口。
listen-on port 53 { any; };
listen-on-v6 port 53 { any; };
directory "/var/cache/bind";
allow-query { localnets; };
allow-recursion { localnets; };
recursion yes;
dnssec-validation auto;
forwarders {
8.8.8.8;
1.1.1.1;
};
};
- listen-on port:服务器监听 IP 和端口;
- directory:数据文件默认存放目录;
- allow-query:允许哪些客户端/IP 段来查询;
- allow-recursion:允许哪些客户端使用递归查询;localnets表示允许同一局域网内的客户端;通常与 allow-query 范围一致;
- recursion:是否开启递归解析;如果为yes,本服务器就是递归解析器;
- dnssec-validation:DNS安全扩展;
- forwarders:服务器不是权威服务器或缓存中没有时,把查询转发到哪些IP;
/etc/bind/named.conf.local配置的是服务器管理的特定域名区域;用于声明这个DNS 服务器是哪些域名的权威服务器;
# 正向区域 (域名解析为IP)
zone "example.com" {
type master;
file "/etc/bind/db.example.com";
allow-transfer { 192.168.1.20; };
};
# 反向区域 (IP解析为域名)
zone "1.168.192.in-addr.arpa" {
type master;
file "/etc/bind/db.192.168.1";
};
每个 zone 声明只影响它定义的那个特定域名或IP段;服务器可以同时管理多个不相关的域;
- zone:定义这个服务器是哪个域名的权威服务器;example.com表示该域名下所有子域,即所有以example.com结尾的域名;1.168.192.in-addr.arpa表示服务器是 IP 段 192.168.2.0/24的反向解析(根据IP找域名) 的权威服务器;
- type master;:主权威服务器;还有type slave; 表示从权威服务器,从主服务器同步数据;
- file:指定存储该域名所有具体 DNS 记录(A, AAAA, MX, NS, CNAME 等)的文件位置,真正存放域名IP对应关系的文件;
- allow-transfer:指定哪些服务器可以请求复制这个区域的完整数据;
配置完成后,需要创建区域文件;这是实际的 DNS 记录;
示例:正向区域文件/etc/bind/db.example.com;反向区域文件/etc/bind/db.192.168.1;
$TTL 604800 ; 默认生存时间(1周)
@ IN SOA ns1.example.com. admin.example.com. (
2024112501 ; 序列号 (格式:年月日版本号,每次修改需增加)
86400 ; 刷新时间 (从服务器检查更新的间隔,秒)
7200 ; 重试时间 (更新失败后重试间隔,秒)
3600000 ; 过期时间 (从服务器无法联系主服务器时,数据有效期,秒)
86400 ) ; 否定答案的TTL (秒)
; 名称服务器记录 (NS Records) - 指定该域的权威DNS服务器
@ IN NS ns1.example.com.
@ IN NS ns2.example.com.
; 地址记录 (A Records) - 将主机名映射到IPv4地址
@ IN A 192.168.1.10 ; 裸域名 example.com -> 192.168.1.10
ns1 IN A 192.168.1.10 ; ns1.example.com -> 192.168.1.10
ns2 IN A 192.168.1.20 ; ns2.example.com -> 192.168.1.20
www IN A 192.168.1.100 ; www.example.com -> 192.168.1.100
mail IN A 192.168.1.150 ; mail.example.com -> 192.168.1.150
ftp IN CNAME www.example.com. ; ftp.example.com 是 www.example.com 的别名
$TTL 604800
@ IN SOA ns1.example.com. admin.example.com. (
2024112501
86400
7200
3600000
86400 )
; NS 记录
@ IN NS ns1.example.com.
@ IN NS ns2.example.com.
; 指针记录 (PTR Records) - 将IP地址映射到主机名
10 IN PTR example.com. ; 192.168.1.10 -> example.com
100 IN PTR www.example.com. ; 192.168.1.100 -> www.example.com
150 IN PTR mail.example.com.; 192.168.1.150 -> mail.example.com
必须确保 BIND 用户(通常是 bind 或 named)有权读取这些文件;
在启动服务之前,需要用named-checkconf和named-checkzone进行语法检查,named-checkconf没有输出表示语法没有错误;
[root@server ~]# named-checkconf
# 检查正向和反向区域文件
[root@server ~]# named-checkzone example.com /etc/bind/db.example.com
[root@server ~]# named-checkzone 1.168.192.in-addr.arpa /etc/bind/db.192.168.1
之后就可以启动并启用 BIND 服务了;
DHCP与DNS服务器部署指南
998

被折叠的 条评论
为什么被折叠?



