一、引言

二、DHCP工作流程

三、DHCP安装配置



一、引言


在之前的一篇《Linux网络属性配置详解》中有提到,要把一台主机接入TCP/IP网络中,要为其配置的网络参数至少应该有IP地址(IP/Mask)、默认网关(Gateway)和DNS Server指向。除此之外,如果是接入Windows网络并期望基于主机名通信时还需配置Wins Server指向。另外,有时也需要配置NTP Server指向等。


这些网络参数的配置方式有两种,分别是静态指定动态分配。静态指定方式需要由管理员手动配置网络参数,但当需要接入局域网中的主机较多时,每台主机都要静态指定的话就造成麻烦了,因此需要使用动态分配的方式。动态分配方式则由服务器自动为每一客户端分配IP地址(包括其他参数)。在动态分配这种方式中,主要有BOOTP和DHCP这两种协议。


1.1 BOOTP


BOOTP全称为Bootstrap Protocol,是一种引导协议,是DHCP的前身,早期应用于无盘工作站中,BOOTP可以让每个无盘工作站到中心服务器(BOOTP Server)上获取IP地址。这里的“无盘”指的是无硬盘,使用BOOTP时,每个无盘客户端的网卡ROM上的一段代码能扮演成BOOTP Server的客户端从而能够获取一个IP地址,获取之前是随机的,获取IP地址后就与该无盘客户端主机绑定起来了,而BOOTP Server能够根据客户端IP获取信息,并发送一份与之对应的操作系统文件资源给客户端。因此,在客户端主机工作过程时,整个操作系统是运行在内存中的。


1.2 DHCP


DHCP全称为Dynamic Host Configuration Protocol,即动态主机配置协议。DHCP是基于UDP的协议,DHCP Server监听在67/UDP,DHCP Client监听在68/UDP。DHCP与BOOTP一样,都能够动态地分配IP地址给局域网内的主机。但与BOOTP不同的是,DHCP是引入了“租约”的BOOTP,能够从地址池中临时分配IP地址给客户端,也能在客户端主机关机时收回地址,再分配给其他主机重复利用。为了兼容BOOTP,DHCP也可以实现为特定主机保留某固定地址。



二、DHCP工作流程


DHCP采用C/S结构,其工作流程如下。

1、Client:dhcp discover

客户端向局域网发送dhcp discover包(即rarp请求),询问是否有dhcp服务器可以给自己分配一个IP地址。


2、Server:dhcp offer

dhcp服务器收到请求报文后,先根据客户端的MAC地址决定是为此客户端新分配一个IP地址还是续租已经分配给客户端的IP地址,然后向客户端发送带有租约的dhcp offer包。


3、Client:dhcp request

由于局域网内可能不只有一台dhcp服务器,因此客户端仍然以广播的方式告知局域网内所有dhcp服务器它所选择的dhcp服务器,没有被选中的dhcp服务器会收回IP租约。


4、Server:dhcp ack

被选中的dhcp服务器回送dhcp ack包,并告知客户端租约的期限,同时开始计算租用倒计时。


关于续租:

默认情况下,客户端会在租约期限到达之前续租,即向dhcp服务器提交续租申请,而提交续租申请有3个时间点,如下。

50% ==> 当租用时间到达50%时,由客户端单播发给dhcp服务器端一个dhcp request包,如果续租成功,则服务器返回一个dhcp request包,客户端收到dhcp request包后就重新开始新的租用周期。如果续租失败,则服务器返回一个dhcp nak包。

75% ==> 如果客户端在租约时间到达50%时没有联系上服务器端,则会在租约时间到达75%再次尝试联系服务器端。

87.5% ==> 如果客户端在租约时间到达75%时没有联系上服务器端,则会在租约时间到达87.5%再次尝试联系服务器端。此时如果仍然续租失败,则客户端会重新发起新的dhcp discover包。



三、DHCP安装配置


DHCP在CentOS系统上的实现主要有dhcp、dnsmasq这两个程序包,其介绍如下。

① dhcp:能够提供DHCP服务,该程序包由ISC提供(DNS的开源实现bind也是由ISC提供)。

② dnsmasq:能够提供DHCP服务和DNS服务。

接下来介绍dhcp的安装配置。


dhcp程序包可以使用yum安装。

[root@dhcp ~]# yum -y install dhcp
[root@dhcp ~]# cp /usr/share/doc/dhcp-4.2.5/dhcpd.conf.example /etc/dhcp/dhcpd.conf # 复制模板

dhcp程序包提供的程序文件主要有dhcpd和dhcrelay,其中dhcpd用于提供DHCP服务,dhcrelay用于提供中继服务。dhcpd和dhcrelay一般不会同时使用。以下演示DHCP服务的配置示例,搭建环境如下:

DHCP Server ==> 192.168.10.150 (主机名:dhcp)

DHCP Client ==> 192.168.10.6 (主机名:node1)


例子1、搭建一个简单的DHCP服务

修改模板,如下。

[root@dhcp ~]# vim /etc/dhcp/dhcpd.conf 

option domain-name "itab.com";                 # 搜索域
option domain-name-servers 192.168.10.2;       # DNS服务器指向

default-lease-time 43200;                      # 默认租约期限
max-lease-time 86400;                          # 最大租约期限

log-facility local7;

subnet 192.168.10.0 netmask 255.255.255.0 {    # DHCP服务器所在网络
    range 192.168.10.101 192.168.10.120;       # DHCP服务的地址池范围
}

启动DHCP服务。

[root@dhcp ~]# systemctl start dhcpd.service
[root@dhcp ~]# ss -unl | grep :67
UNCONN     0      0            *:67                       *:*


在客户端使用dhclient命令动态获取IP地址。


例2、修改例1中的DHCP服务的地址池范围

修改模板,如下。

[root@dhcp ~]# vim /etc/dhcp/dhcpd.conf 

option domain-name "itab.com";
option domain-name-servers 192.168.10.2;

default-lease-time 43200;
max-lease-time 86400;

log-facility local7;

subnet 192.168.10.0 netmask 255.255.255.0 {
    range 192.168.10.120 192.168.10.140;       # 修改DHCP服务的地址池范围
}

重启DHCP服务。

[root@dhcp ~]# systemctl restart dhcpd.service


在客户端使用dhclient命令动态获取IP地址。

注意:在客户端向DHCP服务器获取IP地址时,由于客户端此前已经从DHCP服务器端获取过一个IP地址,因此客户端会先请求续租(因此先发送了两个dhcp request包)。而由于DHCP服务器端的地址池发生了变化,已经没有了客户端此前使用的IP,因此客户端会重新发送dhcp discover包。


例3、指定默认网关

(1)全局指定

修改模板,如下。

[root@dhcp ~]# vim /etc/dhcp/dhcpd.conf 

option domain-name "itab.com";
option domain-name-servers 192.168.10.2;
option routers 192.168.10.254;        # 全局指定默认网关

default-lease-time 43200;
max-lease-time 86400;

log-facility local7;

subnet 192.168.10.0 netmask 255.255.255.0 {
    range 192.168.10.120 192.168.10.140;
}

重启DHCP服务。

[root@dhcp ~]# systemctl restart dhcpd.service


在客户端上可以使用nmtui命令修改网络属性配置,以方便进行DHCP服务的测试,如下。

接着客户端重启网络服务,并查看路由表。


(2)在subnet中指定

修改模板,如下。

[root@dhcp ~]# vim /etc/dhcp/dhcpd.conf 

option domain-name "itab.com";
option domain-name-servers 192.168.10.2;
option routers 192.168.10.254;        # 全局指定一个默认网关

default-lease-time 43200;
max-lease-time 86400;

log-facility local7;

subnet 192.168.10.0 netmask 255.255.255.0 {
    range 192.168.10.120 192.168.10.140;
    option routers 192.168.10.253;         # 在subnet中也指定一个默认网关
}

重启DHCP服务。

[root@dhcp ~]# systemctl restart dhcpd.service


客户端重启网络服务,查看路由表。

DHCP服务简介_第1张图片

注意:在subnet中指定的配置的作用范围较小,优先级较高;而在全局中指定的配置的作用范围较大,优先级较低。


例4、禁止DHCP服务修改/etc/resolv.conf文件

例3中,在客户端上查看/etc/resolv.conf文件,如下。

可见DNS Server指向也修改为DHCP服务器上配置文件/etc/dhcp/dhcpd.conf中指定的DNS Server指向了。那么如何禁止DHCP服务修改/etc/resolv.conf文件呢?可以在客户端上修改/etc/sysconfig/network-scripts/ifcfg-eno16777736文件中PREDNS=no


例5、固定分配IP给特定主机

前面提到,BOOTP是DHCP的前身,而DHCP为了兼容BOOTP,能够支持给特定主机分配一个特定的IP地址,本例子主要演示的就是固定分配IP地址给特定主机。


修改模板,如下。

[root@dhcp ~]# vim /etc/dhcp/dhcpd.conf 

option domain-name "itab.com";
option domain-name-servers 192.168.10.2;

default-lease-time 43200;
max-lease-time 86400;

log-facility local7;

subnet 192.168.10.0 netmask 255.255.255.0 {
    range 192.168.10.120 192.168.10.140;
}

host itab {                                 # host之后的名称可以自定义
    hardware ethernet 00:0c:29:f7:b3:4e;    # 指定要绑定的MAC地址
    fixed-address 192.168.10.22;            # 指定分配的固定IP地址(不一定要在地址池范围内)
}

重启DHCP服务。

[root@dhcp ~]# systemctl restart dhcpd.service


在客户端上动态获取IP地址,如下。

注意:绑定的IP不能与地址池中的IP重复。


此外,还可以在DHCP服务器端上查看分配信息库:/var/lib/dhcp/dhcp.leases

DHCP服务简介_第2张图片

从中可以获取到租约起始时间、租约结束时间、分配的IP地址所在的MAC地址等信息。另外当前正在编辑的分配信息库文件会带上一个“~”,即/var/lib/dhcp/dhcp.leases~