1. DHCP 服务器
前文,我们介绍了DHCP客户端和DHCP服务器在同一个广播域中时,DHCP的工作机制。如果DHCP客户端与DHCP服务器不处于同一个广播域,那么DHCP客户端广播的DHCP Discover报文,会被网络中的三层设备丢弃,无法被DHCP服务器接收,此时,就需要DHCP中继代理(DHCP Relay Agent)。DHCP中继可以实现在不同广播域(如子网、Vlan)之间处理和转发DHCP工作时的广播
DHCP 服务器
DHCP 服务介绍
DHCP 动态主机配置协议(DHCP-Dynamic Host Configuration Protocol)提供了一种自动配置网络参数的方法 ‘’
==DHCP(动态主机配置协议)==自动分配 IP 地址及子网掩码、网关等网络参数;
优势:减少人工配置错误、避免 IP 冲突、便于集中管理。
在大型网络中,系统静态分配IP地址面临问题:
- 确保不要同时在多个系统上使用同一个地址。
- 部署新系统通常需要手动分配其IP地址。在云环境中,实例的网络是自动化配置的。
DHCP有两种协议:
- 用于IPv4网络的 DHCPv4。
- 用于IPv6网络的 DHCPv6。
本课程只介绍DHCPv4。
DHCP 通信过程
过程
① 发现(Discover):客户端广播请求 IP;
② 提供(Offer):服务器回应可用 IP;
③ 请求(Request):客户端选择 IP;
④ 确认(Acknowledge):服务器确认分配。
⑤请求( Request(renew) ):重新向DHCP服务器续约
⑥确认( Acknowledge(renew) ):DHCP服务器同意客户端续约


- 客户端使用DHCPv4配置网络接口时,网卡将 DHCPDISCOVER 数据包发送到 255.255.255.255 广播目标。因为路由器通常不转发该广播地址,所以必须将DHCP服务器与客户端安装在同一物理网络上,以便它可以接收DHCPDISCOVER数据包。您也可以将路由器配置为DHCP中继代理,转发DHCP消息到其他网络。
- DHCP服务器收到 DHCPDISCOVER 数据包后,响应 DHCPOFFER 数据包,该数据包包含其自己的IP地址和客户端应使用的IP地址。该数据包还包括一个租用期限,以指示所提供的IP地址有效的时间,以及其他网络参数,例如默认网关和DNS服务器。
- 客户端收到DHCP服务器 DHCPOFFER 数据包后,发送 DHCPREQUEST 广播数据包,请求DHCP服务器提供的IP地址。这似乎很多余,但是网络上可能有多个DHCP服务器,或者路由器可能会将DHCPOFFER转发到多个网络。因此,客户端可能会从不同的DHCP服务器收到响应。客户端的DHCPREQUEST数据包包括接受请求的DHCP服务器的IP地址。
- DHCP服务器收到DHCPREQUEST数据包后,会发送 DHCPACK 数据包,确认客户端对客户端IP地址具有独占权限,直到租约到期为止。

-
租约到期后,重新向DHCP服务器续约。
-
DHCP服务器,同意客户端续约。
在DHCP服务器上,可以使用journalctl --unit= dhcpd.service命令来访问客户端与服务端通信消息。 以下摘录显示了客户端通过DHCP请求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
在租约到期之前,客户端会定期向服务器发送 DHCPREQUEST 数据包,以确保服务器不会收回IP地址。
多个 DHCP 服务器
尽管DHCP支持在物理网络上运行多个DHCP服务器,但不建议这么做。正常情况下,同一个物理网络中只需要一台DHCP服务器应回答客户端的请求即可。
在同一网络上运行多个服务器的情况下,当新客户端发送 DHCPDISCOVER 数据包以获取地址时,它可能会收到多个 DHCPOFFER 数据包。客户端仅接受其中一台服务器提供的配置,并广播包含该服务器IP地址的 DHCPREQUEST 数据包。其他DHCP服务器释放它们为客户端准备的IP地址。
但是,当客户端使用 DHCPREQUEST 数据包更新其IP地址时,服务器行为取决于服务器是否具有权威性。 ==非权威的DHCP服务器会忽略DHCPREQUEST数据包中不知道的地址。==当客户端发送的IP地址在权威DHCP服务器管理的地址范围内,但服务器以前不知道该IP地址时,它将拒绝该请求并发回DHCPNAK数据包。这可能意味着客户端最初是从网络上的另一台非权威的DHCP服务器获得其地址的。任何收到DHCPNAK数据包的客户端都不能再使用该地址,而必须请求一个新的地址。
使用默认配置启动DHCP服务器时,服务器不是权威服务器, 这样可以防止非权威DHCP服务器接管权威服务器提供的地址。
部署 DHCP 服务器
要配置DHCPv4服务器,请首先使用==ip addr==命令确认您的网络接口配置是否指定了BROADCAST地址。
[root@server ~ ]# ip addr
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
服务器必须具有静态IP地址。
安装 DHCP 软件
# 安装软件包
[root@server ~]# yum install -y dhcp
# 配置防火墙,放行dhcp服务
[root@server ~]# firewall-cmd --add-service=dhcp
[root@server ~]# firewall-cmd --add-service=dhcp --permanent
配置 DHCP 服务器
dhcpd服务使用/etc/dhcp/dhcpd.conf配置文件。 dhcp软件包提供/usr/share/doc/dhcp-*/dhcpd.conf.example 配置文件示例。
注意注释 :
🔒 /usr/share/doc/ : 是 Linux 系统的 ==“标准文档目录”==之一。
安装时不会自动将示例写入 /etc/dhcp/dhcpd.conf,核心是包管理器保护用户配置、示例属文档而非默认配置、避免直接启动失败,需手动复制并适配。
[root@server ~]# cp /usr/share/doc/dhcp-*/dhcpd.conf.example /etc/dhcp/dhcpd.conf
典型的DHCP配置示例:
[root@server ~]# vim /etc/dhcp/dhcpd.conf
#subnet:子网 ; netmask:子网掩码
subnet 10.1.8.0 netmask 255.255.255.0 {
range 10.1.8.101 10.1.8.130; #地址池:动态分配
option routers 10.1.8.2; #网关:默认路由
option broadcast-address 10.1.8.255; #广播:广播地址
option domain-name-servers 223.5.5.5; #DNS:解析服务器
option domain-name "lzh.cloud"; #域名:主机域名后缀
default-lease-time 600; #常规租期
max-lease-time 7200; #最长续租
}
配置说明:
-
子网定义:
subnet 10.1.8.0 netmask 255.255.255.0定义了一个子网。其中10.1.8.0是子网的网络地址,255.255.255.0是子网掩码3。根据子网掩码,该子网的可用主机地址范围是10.1.8.1到10.1.8.254。 -
IP 地址范围:
range 10.1.8.101 10.1.8.130指定了 DHCP 服务器可分配的 IP 地址范围,在此子网中,客户端可从这个范围内获取 IP 地址。 -
默认网关:
option routers 10.1.8.2设置了子网内客户端的默认网关地址为10.1.8.20,客户端通过该网关与其他网络进行通信。 -
广播地址:
option broadcast-address 10.1.8.255定义了子网的广播地址6。发送到这个地址的数据包会被该子网内的所有主机接收。 -
域名服务器:
option domain-name-servers 223.5.5.5指定了 DNS 服务器的地址2。223.5.5.5是阿里云提供的公共 DNS 服务器地址,用于将域名解析为 IP 地址。 -
域名搜索域:
option domain-search "lzh.cloud"设置了域名搜索域。客户端在进行域名解析时,如果输入的是相对域名,系统会自动在该域名后加上此搜索域再进行解析。
#最佳实践:同时配置(域名可相同),既保证客户端有明确的身份标识(FQDN),又能通过 domain-search 优化解析体验,若需多域解析,仅扩展 domain-search 即可。
option domain-name "lzh.cloud"; # 主域名(身份标识)
option domain-search "lzh.cloud"; # 搜索域(解析优先)
- 租约时间:
default-lease-time 600设置了 IP 地址的默认租用时间为 600 秒(10 分钟)4。max-lease-time 7200设置了 IP 地址的最大租用时间为 7200 秒(2 小时)4。客户端获取 IP 地址后,租约到期前会尝试续约,租约时间不会超过最大租用时间。
客户端系统上的NetworkManager使用domain-name-servers和domain-search更新resolv.conf文件中的nameserver和search参数。
验证 DHCP 配置
# 验证配置文件语法
[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
# 查看服务状态
[root@server ~]# systemctl status dhcpd
配置 DHCP 客户端
# 添加一个自动获取ip连接,假设网卡设备名为ens32
[root@client ~]# nmcli connection add con-name ens32-auto type ethernet ifname ens32
[root@client ~]# nmcli connection up ens32-auto
# 验证
[root@client ~]# ip addr show ens32
2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:1c:a4:51 brd ff:ff:ff:ff:ff:ff
#ip地址的范围在设定的100~110之间
inet 10.1.8.100/24 brd 10.1.8.255 scope global noprefixroute dynamic ens32
valid_lft 485sec preferred_lft 485sec
inet6 fe80::d074:ee83:49a1:784b/64 scope link noprefixroute
valid_lft forever preferred_lft forever
基于 MAC 地址预留IP地址
在配置文件中,host声明可以将MAC地址绑定到IP地址。 此配置对于始终为特定系统的网络接口提供相同的IP地址特别有用,尤其是Web或数据库系统之类的服务器。
客户端MAC地址查看
[root@client ~]# ip link show ens32
2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
link/ether 00:0c:29:1c:a4:51 brd ff:ff:ff:ff:ff:ff
在以下示例中,服务器始终为MAC地址是00:0c:29:26:13:b5的系统分配10.1.8.20地址。
在/etc/dhcp/dhcpd.conf最后添加如下内容:
[root@server ~]# vim /etc/dhcp/dhcpd.confc
host client.lzh.cloud {
hardware ethernet 00:0c:29:26:13:b5;
fixed-address 10.1.8.30;
}
重启服务
[root@server ~]# systemctl restart dhcpd
客户端验证
# 激活连接
[root@client ~]# nmcli connection up ens32-auto
# 验证
[root@client ~]# ip addr show ens32
3: ens32: <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 ens32
valid_lft 245sec preferred_lft 245sec
inet6 fe80::95db:2216:1a36:615/64 scope link noprefixroute
valid_lft forever preferred_lft forever
DHCP 中继服务器(扩展-自学)
DHCP 中继介绍
前文,我们介绍了DHCP客户端和DHCP服务器在同一个广播域中时,DHCP的工作机制。
如果DHCP客户端与DHCP服务器不处于同一个广播域,那么DHCP客户端广播的DHCP Discover报文,会被网络中的三层设备丢弃,无法被DHCP服务器接收,此时,就需要DHCP中继代理(DHCP Relay Agent)。
DHCP中继可以实现在不同广播域(如子网、Vlan)之间处理和转发DHCP工作时的广播报文,使得DHCP客户端可以跨网段获取IP地址及相关参数。
DHCP 中继工作原理
有DHCP中继的场景中,DHCP中继在DHCP服务器和DHCP客户端之间转发DHCP报文,以保证DHCP服务器和DHCP客户端可以正常交互,下图示意了中继情形下,DHCP客户端与DHCP服务器的报文交互过程。

在有中继的情形下,DHCP客户端申请IP地址仍然分为四个阶段:发现、提供、请求和确认(否认)。只是客户端发送的报文会被同广播域内的DHCP中继收到,然后由DHCP中继将DHCP报文以单播的形式转发给服务器。同样,服务器响应的DHCP报文以单播形式发给DHCP中继,然后再由中继转发给客户端。
DHCP 中继实践
实验主机
| 主机名 | IP 地址 | 虚拟网络 |
|---|---|---|
| dhcp-server.lzh.cloud | 10.1.8.10/24 | vmnet8 |
| dhcp-relay.lzh.cloud | 10.1.8.20/24 | vmnet8 |
| dhcp-relay.lzh.cloud | 10.1.1.20/24 | vmnet1 |
| dhcp-client.lzh.cloud | 自动获取 | vmnet1 |
vmnet1和vmnet8关闭dhcp功能。
实验拓扑

配置 dhcp-server
配置 dhcp
# 安装软件包
[root@dhcp-server ~]# yum install -y dhcp
# 配置防火墙,放行dhcp服务
[root@dhcp-server ~]# firewall-cmd --add-service=dhcp
[root@dhcp-server ~]# firewall-cmd --add-service=dhcp --permanent
[root@dhcp-server ~]# /bin/cp /usr/share/doc/dhcp-*/dhcpd.conf.example /etc/dhcp/dhcpd.conf
[root@dhcp-server ~]# vim /etc/dhcp/dhcpd.conf
subnet 10.1.8.0 netmask 255.255.255.0 {
range 10.1.8.101 10.1.8.200;
option routers 10.1.8.20;
option broadcast-address 10.1.8.255;
option domain-name-servers 223.5.5.5;
option domain-search "lzh.cloud";
default-lease-time 600;
max-lease-time 7200;
}
# 新增一个地址池
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 "lzh.cloud";
default-lease-time 600;
max-lease-time 7200;
}
# 启用并启动服务
[root@dhcp-server ~]# systemctl enable dhcpd --now
# 查看服务状态
[root@dhcp-server ~]# systemctl status dhcpd
配置路由
DHCP server必须配置一个到达 DHCP relay 接收 DHCP 广播网卡的路由。
如果不配置该路由,dhcp server 无法将数据包返回给 10.1.1.20 服务器,最终导致无法提供dhcp给 dhcp-client。
# 当前实验环境: DHCP relay的第二个网卡,地址是:10.1.1.20/24 。
# dhcp-server 去往 10.1.1.20/32 路由下一跳是 10.1.8.20
[root@dhcp-server ~]# nmcli connection modify ens32 ipv4.routes '10.1.1.20/24 10.1.8.20'
[root@dhcp-server ~]# nmcli connection up ens32
配置 dhcp-relay
配置 dhcp relay
[root@dhcp-relay ~]# yum install -y dhcp
[root@dhcp-relay ~]# cp /usr/lib/systemd/system/dhcrelay.service /etc/systemd/system/dhcrelay.service
[root@dhcp-relay ~]# vim /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
# 在 ExecStart 参数末尾添加 DHCP 服务器 IP 地址
ExecStart=/usr/sbin/dhcrelay -d --no-pid 10.1.8.10
StandardError=null
[Install]
WantedBy=multi-user.target
[root@dhcp-relay ~]# systemctl enable dhcrelay.service --now
配置解析
| 段 | 配置项 | 作用 | 备注 |
|---|---|---|---|
| [Unit] | Description | 服务描述 | 便于识别 |
| [Unit] | Documentation | 文档参考 | 可通过 man:dhcrelay(8) 查看 |
| [Unit] | Wants/After | 依赖与顺序 | 网络就绪后再启动,弱依赖 |
| [Service] | Type=notify | 就绪通知 | 服务就绪后向 systemd 发信号 |
| [Service] | ExecStart | 启动命令 | -d 调试输出;–no-pid 不写 PID;末尾为 DHCP 服务器 |
| [Service] | StandardError=null | 错误输出 | 丢弃 stderr,生产建议改为 journal |
| [Install] | WantedBy | 安装目标 | 多用户模式下开机自启 |
配置路由转发
# 开启路由转发
[root@dhcp-relay ~]# echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
[root@dhcp-relay ~]# sysctl -p /etc/sysctl.conf
net.ipv4.ip_forward = 1
客户端测试
[root@client ~]# nmcli connection add type ethernet ifname ens160 con-name dynamic
[root@client ~]# nmcli connection up dynamic
DHCP 服务器-Dnsmasq(扩展-自学)
Dnsmasq 介绍
Dnsmasq 是一个集 DNS 缓存、**DHCP **、DHCP 中继、PXE一体的软件。多个功能即可以同时实施,也可以独立实施。
- 作为 DNS 缓存服务器,可以通过缓存 DNS 请求来提高对访问过的网址的连接速度。
- 作为 DHCP 服务器,可用于为局域网电脑分配内网ip地址和提供路由。
- 作为 DHCP 中继服务器,为局域网提供 DHCP 中继服务。
- 作为 TFTP 服务器,提供网络 PXE 网络引导。
Dnsmasq 轻量且易配置,适用于个人用户或小型网络。
接下来我们分别介绍这些功能。
dnsmasq 安装
[root@server ~]# yum install -y dnsmasq
dnsmasq 配置
/etc/dnsmasq.conf 配置文件提供大量的注释说明。
比较重要参数:
- listen-address,定义监听的地址,默认是监控本机的所有网卡上。
- dhcp-authoritative,DHCP 权威服务器。
- dhcp-range,IP 地址池范围。可以配置多个。
- dhcp-host,给特定 MAC 地址主机分配主机名和IP地址。
- dhcp-lease-max,DHCP 租约最长时间。
- dhcp-option,定义 dhcp 选项。
- 设置网关:
dhcp-option=option:router,1.2.3.4 - 设置域名服务器:
dhcp-option=option:dns-server,1.2.3.4,1.2.3.5 - 设置查找域:
dhcp-option=option:domain-search,lzh.cloud,example.com - 设置对时服务器:
dhcp-option=option:ntp-server,1.2.3.4,1.2.3.5
- 设置网关:
配置示例:
# IP地址范围是10.1.8.50-150,掩码24位,租约时间是12小时
dhcp-range=10.1.8.50,10.1.8.101,255.255.255.0,12h
# 给Mac地址是00:0c:29:26:13:b5的主机分配
# IP地址:10.1.8.30
# 租约时间:45分钟
dhcp-host=00:0c:29:26:13:b5,10.1.8.30,45m
# 设置网关
dhcp-option=option:router,10.1.8.2
# 设置DNS
dhcp-option=option:dns-server,218.2.135.1
dnsmasq 启用
客户端测试
# 添加一个自动获取ip连接
[root@client ~]# nmcli connection add con-name dynamic type ethernet ifname ens192
[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 597sec preferred_lft 597sec
inet6 fe80::95db:2216:1a36:615/64 scope link noprefixroute
valid_lft forever preferred_lft forever
[root@client ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.1.8.2 0.0.0.0 UG 103 0 0 ens192
10.1.8.0 0.0.0.0 255.255.255.0 U 102 0 0 ens160
10.1.8.0 0.0.0.0 255.255.255.0 U 103 0 0 ens192
[root@client ~]# cat /etc/resolv.conf
# Generated by NetworkManager
search lzh.cloud example.com
nameserver 218.2.135.1
DHCP 中继服务器-Dnsmasq(扩展-自学)
这里采用上文中的环境,中继服务通过Dnsmasq实现。
配置 dnsmasq
[root@dhcp-relay ~]# yum install -y dnsmasq
[root@dhcp-relay ~]# vim /etc/dnsmasq.conf
# 在末尾增加一条记录
# 作用:来自于网卡10.1.1.20的dhcp请求转发到10.1.8.10
dhcp-relay=10.1.1.20,10.1.8.10
# dhcp-relay可多次使用,为不同网段提供relay功能
[root@dhcp-relay ~]# systemctl enable dnsmasq.service --now
配置路由转发
# 开启路由转发
[root@dhcp-relay ~]# echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
[root@dhcp-relay ~]# sysctl -p /etc/sysctl.conf
net.ipv4.ip_forward = 1
客户端测试
[root@client ~]# nmcli connection add type ethernet ifname ens160 con-name dynamic
[root@client ~]# nmcli connection up dynamic
在末尾增加一条记录
作用:来自于网卡10.1.1.20的dhcp请求转发到10.1.8.10
dhcp-relay=10.1.1.20,10.1.8.10
dhcp-relay可多次使用,为不同网段提供relay功能
```bash
[root@dhcp-relay ~]# systemctl enable dnsmasq.service --now
配置路由转发
# 开启路由转发
[root@dhcp-relay ~]# echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
[root@dhcp-relay ~]# sysctl -p /etc/sysctl.conf
net.ipv4.ip_forward = 1
客户端测试
[root@client ~]# nmcli connection add type ethernet ifname ens160 con-name dynamic
[root@client ~]# nmcli connection up dynamic
更多推荐

所有评论(0)