首页 > 编程笔记 > Linux笔记 阅读:35

DHCP是什么,DHCP安装部署教程(非常详细)

动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)是一个局域网的网络协议,使用 UDP 协议工作。

DHCP 是从 BOOTP(Bootstrap Protocol)演变而来的,在 BOOTP 协议的基础上引进了租约、续租等功能,成为现在的 DHCP。

DHCP 主要有两个用途,第一个是为企业/家庭内部网络自动分配 IP 地址;第二个是为企业中的 Linux 运维工程师提供集中管理网络的条件。

早期在电脑还未推广的时候,人们都是通过手动设置 IP 地址的方式上网,那时候,每到一个新地方,接入不同的网络,都得重新设置 IP 地址,十分麻烦。基于这种情况就出现了 BOOTP,BOOTP 被创造出来就是为连接到网络中的设备自动分配地址,经过一段时间的技术更新迭代,BOOTP 被 DHCP 取代。相比 BOOTP,DHC 功能更强大,而且引进了租约、续租等功能。

目前,基本上家家户户都在使用 DHCP 服务,互联网上能买到的所有路由器大都带有 DHCP 功能,而且还都是默认开机自启动的。为什么 DHCP 服务会如此受路由器厂商宠幸?这是因为它极大地简化了路由器的操作,调试简单,使用方便。

在企业中使用的路由器与家用的还是不同,因为企业中的员工太多,家用路由器的性能难以支撑,容易造成卡顿、连不上网等现象。那怎么办呢?进行路由器的功能分离:路由器专门用来提供网络连接和路由管理,DHCP 功能被单独剥离出来做成 DHCP 服务器,对外提供 DHCP 服务,这样就能够为更多的人提供上网服务。

DHCP 服务在企业中的应用也比较广泛,因为它能自动配置设备的网络参数,包括 IP 地址、子网掩码、网关地址、DNS 服务器等。DHCP 服务还统一了 IP 地址的分配,方便网络管理。

接下来简单介绍 DHCP 服务器在企业中的工作过程:
DHCP 协议报文采用 UDP 方式封装,服务器(DHCP Server)监听的端口号是 67,客户端(DHCP Client)的端口号是 68。服务器与客户端之间通过发送和接收 UDP 67 和 UDP 68 端口的报文进行协议交互。

服务器与客户端的通信协商过程如下图所示,具体可分为 4 个阶段,即发现阶段、提供阶段、请求阶段和确认阶段。


图 1 服务器(DHCP Server)与客户端(DHCP Client)的通信协商过程

1) 发现阶段。假设一台新电脑(客户端)开机后发现未设置 IP 地址等网络信息,那它就会在本地网络中广播一个 DHCP Discover 报文,目的是寻找能够分配 IP 地址的 DHCP 服务器。

2) 提供阶段。DHCP 服务器收到客户端广播的 DHCP Discover 报文后,会响应 DHCP Offer 报文,DHCP Offer 报文中包含了客户端 IP 地址、客户端 MAC 地址、租约过期时间、服务器的识别符及其他信息参数。客户端通过对比 DHCP Discover 报文和 DHCP Offer 报文中的 xid 字段是否相同来判断 DHCP Offer 报文是不是发给自己的。

3) 请求阶段。如果网络中有多个 DHCP 服务器存在,那么它们接收到客户端请求之后都会响应一个 DHCP Offer 报文,而客户端会全部接收这些响应报文,但是,客户端最终只会选择最先收到的 DHCP Offer 报文。

客户端接收到最先发送过来的 DHCP Offer 报文后,会广播 DHCP Request 报文,这个报文是为了告诉其他的 DHCP 服务:“我已经选择了某 DHCP 服务器,无须再响应了”。如果客户端并没有收到来自 DHCP 服务器的 DHCP Offer 报文,那它就会重新发送 DHCP Discover 报文。

4) 确认阶段。当 DHCP 服务器收到 DHCP Request 报文后,会发送 DHCP Ack 报文作为回应,DHCP Ack报文中包含关于客户端的网络参数。响应的DHCP Ack报文和之前发送的DHCP Offer 报文内的网络参数不能有冲突,若存在冲突,会发送一个 DHCP Nak 报文。

客户端收到了来自 DHCP 服务器的 DHCP Ack 报文,会再发送一个免费 ARP 报文进行探测,目的是确认这个 IP 地址有没有被别人使用,如果没有,就直接使用这个 IP 地址。

接下来介绍关于租约的问题。

从整个通信协商过程来看,DHCP 服务器拥有 IP 地址的所有权,而客户端只有 IP 地址的使用权,别忘了在响应的 DHCP Offer 报文中还有一个租约过期时间。IP 地址的租约时间默认都是 24h,这个时间可以自定义。在租期内,客户端可以使用此 IP 地址,租约到期后不能再使用,但是可以在还未到期时向 DHCP 服务器申请续租。

客户端申请续租一般会在两个时间内发起,第一次是租期一半的时候发起一次,若 DHCP 服务器未响应,则第二次会在租期到达 3/4 的时候再发起一次,如果直到租约到期还未收到 DHCP 服务器的响应报文,那客户端会停止使用原来的 IP 地址,再从发现阶段重新走一遍流程。

除了以上通信报文之外,再介绍几个常见的通信报文:
最后问一个问题:DHCP 报文交互过程的最后,终端为什么要对外发送一个免费 ARP 报文?

客户端最后对外进行一次免费 ARP 请求,对整个 VLAN 进行广播,告知网络中的各个终端,自己将要使用这个 IP 地址,如果有人回应了,那证明这个IP地址存在冲突的可能。如果没有回应,则证明在网络中这个 IP 地址是唯一的,可以正常使用。

当客户端收到回应后,发现 IP 地址可能冲突,就会释放自己已获取的 IP 地址,并通过 DHCP Decline 报文与服务器协商取消并重新获取新的 IP 地址以避免冲突。免费 ARP 在这里起到避免 IP 地址冲突的重要作用。

DHCP服务的安装部署

DHCP 服务器有 3 种给客户端分配 IP 地址的机制:
注意,在这 3 种地址分配方式中,只有动态分配方式可以重复性回收使用客户端不用的 IP 地址。

DHCP 的安装过程与 DNS、FTP 服务类似,都非常简单,通过 Yum/DNF 软件包管理器安装,只需要指定一条命令即可:
dnf -y install dhcp-server
yum -y install dhcp
接下来我们先安装 DHCP 服务,通过 Yum/DNF 软件包管理器安装时,要安装 dhcp-server 工具,工具安装完成后用 dhcpd(服务名称)来启动,示例如下:
[root@localhost ~]# dnf -y install dhcp-server
依赖关系解决
===========================================================================
软件包          架构        版本                        仓库        大小
===========================================================================
安装:
dhcp-server      x86_64      12:4.3.6-45.el8            baseos      529 k
安装依赖关系:
bind-export-libs x86_64      32:9.11.26-6.el8           baseos      1.1 M
dhcp-common      noarch      12:4.3.6-45.el8           baseos      206 k
dhcp-libs        x86_64      12:4.3.6-45.el8           baseos      147 k

事务概要
============================================================================
安装 4 软件包

----省略部分内容----
已安装:
  bind-export-libs-32:9.11.26-6.el8.x86_64  dhcp-common-12:4.3.6-45.el8.noarch
  dhcp-libs-12:4.3.6-45.el8.x86_64          dhcp-server-12:4.3.6-45.el8.x86_64

完毕!
[root@localhost ~]#

DHCP 服务安装完成后,其主要配置文件路径如下:
/etc/dhcp/dhcpd.conf:主配置文件(空);
/usr/share/doc/dhcp-server/dhcpd.conf.example:主配置文件的模板文件;
/usr/lib/systemd/system/dhcpd.service:启动命令文件。
/var/lib/dhcpd/dhcpd.leases:租约文件。

DHCP 服务安装完成后的第一件事就是配置主配置文件,先打开主配置文件:
[root@clinux ~]# cat /etc/dhcp/dhcpd.conf
#
# DHCP Server Configuration file.
#  see /usr/share/doc/dhcp-server/dhcpd.conf.example
#  see dhcpd.conf(5) man page
#
[root@clinux ~]#
可以看到主配置文件中除了一些注释信息之外什么都没有,其实“秘密”就在这几行注释信息中,通过注释信息可以获得主配置文件的配置模板文件的位置,我们只需要将这个模板文件拷贝过来覆盖现在的主配置文件,再在这个模板文件的基础上修改即可:
[root@clinux ~]# cp /usr/share/doc/dhcp-server/dhcpd.conf.example /etc/dhcp/dhcpd.conf
cp: 是否覆盖'/etc/dhcp/dhcpd.conf'? yes
[root@clinux ~]#

原有的空主配置文件被换成了模板配置文件,对这个模板文件进行修改:
[root@clinux ~]# vim /etc/dhcp/dhcpd.conf
##DNS 服务器的名称(全局)
option domain-name "example.org";
##配置 DNS 服务器地址(全局)
option domain-name-servers 114.114.114.114,223.5.5.5;

##默认租约时间,单位为秒(全局)
default-lease-time 600;
##最长租约时间,单位为秒(全局)
max-lease-time 7200;

##设置 DNS 更新方式
#dns-update-style none;

##表示权威服务器

#authoritative;

##指定日志设备
log-facility local7;

##注:从“{”开始到最后一个“}”结束表示子网属性。DHCP 服务主要是配置大括号中的内容。一个配置文件可以存在多个子网属性
##所分配的 IP 地址是 192.168.0.0 网段的,其子网掩码为 255.255.255.0
subnet 192.168.0.0 netmask 255.255.255.0 {
    range 192.168.0.10 192.168.0.254;    ##分配的 IP 地址范围为 192.168.0.10~192.168.0.254
    option routers 192.168.0.2;           ##默认网关
    option broadcast-address 192.168.0.255; ##广播地址
    default-lease-time 600;              ##默认租约时间,单位为秒(局部)
    max-lease-time 7200;                 ##最长租约时间,单位为秒(局部)
}

##为某一个机器分配固定的 IP 地址模板
## clinux-1 为主机名,随意命名
#host clinux-1 {
    ##绑定的客户端 MAC 地址
    # hardware ethernet 08:00:07:26:c0:a5;
    ##分配给客户端的固定 IP 地址
    # fixed-address 192.168.0.5;
#}
##意思是:我们给 mac 地址为 08:00:07:26:c0:a5 的客户端分配的固定 IP 地址为 192.168.0.5
注意,在主配置文件中设置的 IP 地址网段要与本机网段一致的情况下才能启动 DHCP 服务。

主配置文件修改完毕之后就可以启动 DHCP 服务了。

下图是 CentOS 7 系统的桌面网络设置界面,该主机与 DHCP 服务器处于同一个局域网中,按照图中的步骤将获取网络的方式改为通过 DHCP 获取,重启网卡。


图 2 CentOS 7桌面网络设置界面

这时客户端就会按照前面介绍的流程寻找 DHCP 服务器,经过一系列的报文协商后,客户端就获取到了 DHCP 服务器发过来的 IP 地址及其他网络信息,由下图可见,客户端获取了 IP 地址、网关地址(默认路由)、DNS 等信息。


图 3 客户端获取的 IP 地址及其他网络信息

注意看网卡的 MAC 地址,在 DHCP 服务器上存在一个租约文件,这个租约文件中记录了关于分配出去的 IP 地址及对应的客户端信息,查看这个文件中的内容:
[root@clinux ~]# cat /var/lib/dhcpd/dhcpd.leases
# The format of this file is documented in the dhcpd.leases(5) manual page.
# This lease file was written by isc-dhcp-4.3.6

# authorizing-byte-order entry is generated, DO NOT DELETE
authorizing-byte-order little-endian;

server-duid "\000\001\000\001*\240\303N\000\014)#Y\035";

lease 192.168.0.10 {    ##注意这里,这就是刚才分配出去的 IP 地址记录
    starts 2 2022/08/30 12:50:43;
    ends 2 2022/08/30 13:00:43;
    cltt 2 2022/08/30 12:50:43;
    binding state active;
    next binding state free;
    rewind binding state free;
    hardware ethernet 00:0c:29:d6:c5:d1;    ##重点在这里!记录了客户端网卡的 MAC 地址
                                           ##这里的 MAC 地址正好与图 23-2 中客户端的 MAC 地址对应
}
若使用 VMware 虚拟机进行实验需要注意一点,VMware 的网卡驱动是自带 DHCP 服务的,也就是说若再额外安装 1 个 DHCP 服务器,在一个局域网中就会出现 2 个 DHCP 服务器。为了排除影响实验过程的因素,保证实验的准确性,需要将 VMware 自带的 DHCP 服务关闭,关闭步骤如下图所示。


图 4 关闭VMware自带的DHCP服务

注意,实验中别忘了考虑 Linux 防火墙因素。

相关文章