一、引言
二、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
客户端重启网络服务,查看路由表。
注意:在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
从中可以获取到租约起始时间、租约结束时间、分配的IP地址所在的MAC地址等信息。另外当前正在编辑的分配信息库文件会带上一个“~”,即/var/lib/dhcp/dhcp.leases~