导读 | DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)是一个局域网的网络协议,使用UDP协议工作, 主要有两个用途:给内部网络或网络服务供应商自动分配IP地址、子网掩码、网关以及DNS、(网络批量安装)等tcp/ip信息,给用户或者内部网络管理员作为对所有计算机作中央管理的方法。 |

A:客户端进行IP请求
当一个DHCP客户机启动时,会自动将自己的IP地址配置成0.0.0.0,由于使用0.0.0.0不能进行正常通信,所以客户机就必须通过DHCP服务器来获取一个合法的地址。由于客户机不知道DHCP服务器的IP地址,所以它使用0.0.0.0的地址作为源地址,使用UDP68端口作为源端口,使用255.255.255.255作为目标地址,使用UDP67端口作为目的端口来广播请求IP地址信息。广播信息中包含了DHCP客户机的MAC地址和计算机名,以便使DHCP服务器能确定是哪个客户机发送的请求。
B:服务器响应
当DHCP服务器接收到客户机请求IP地址的信息时,它就在自己的IP地址池中查找是否有合法的IP地址提供给客户机。如果有,DHCP服务器就将此IP地址做上标记,加入到DHCPOFFER的消息中,然后DHCP服务器就广播一则包括下列信息的DHCPOFFER消息:DHCP客户机的MAC地址;DHCP服务器提供的合法IP地址;子网掩码;默认网关(路由);租约的期限;DHCP服务器的IP地址。因为DHCP客户机还没有IP地址,所以DHCP服务器使用自己的IP地址作为源地址,使用UDP67端口作为源端口,使用255.255.255.255作为目标地址,使用UDP68端口作为目的端口来广播DHCPOFFER信息。
C:客户机选择IP
DHCP客户机从接收到的第一个DHCPOFFER消息中选择IP地址,发出IP地址的DHCP服务器将该地址保留,这样该地址就不能提供给另一个DHCP客户机。当客户机从第一个DHCP服务器接收DHCPOFFER并选择IP地址后,DHCP租约的第三过程发生。客户机将DHCPREQUEST消息广播到所有的DHCP服务器,表明它接受提供的内容。DHCPREQUEST消息包括为该客户机提供IP配置的服务器的服务标识符(IP地址)。DHCP服务器查看服务器标识符字段,以确定它自己是否被选择为指定的客户机提供IP地址,如果那些DHCPOFFER被拒绝,则DHCP服务器会取消提供并保留其IP地址以用于下一个IP租约请求。
在客户机选择IP的过程中,虽然客户机选择了IP地址,但是还没有配置IP地址,而在一个网络中可能有几个DHCP服务器,所以客户机仍然使用0.0.0.0的地址作为源地址,使用UDP68端口作为源端口,使用255.255.255.255作为目标地址,使用UDP67端口作为目的端口来广播DHCPREQUEST信息。
D:服务器确认租约
DHCP服务器接收到DHCPREQUEST消息后,以DHCPACK消息的形式向客户机广播成功的确认,该消息包含有IP地址的有效租约和其他可能配置的信息。虽然服务器确认了客户机的租约请求,但是客户机还没有收到服务器的DHCPACK消息,所以服务器仍然使用自己的IP地址作为源地址,使用UDP67端口作为源端口,使用255.255.255.255作为目标地址,使用UDP68端口作为目的端口来广播DHCPACK信息。当客户机收到DHCPACK消息时,它就配置了IP地址,完成了TCP/IP的初始化。
如果DHCPREQUEST不成功,例如客户机试图租约先前的IP地址,但该IP地址不再可用,或者因为客户机移到其他子网,该IP无效时,DHCP服务器将广播否定确认消息DHCPNACK。当客户机接收到不成功的确认时,它将重新开始DHCP租约过程。
DHCP客户机会在租期过去50%的时候,直接向为其提供IP地址的DHCP服务器发送DHCPREQUEST消息包。如果客户机接收到该服务器回应的DHCPACK消息包,客户机就根据包中所提供的新的租期以及其它已经更新的TCP/IP参数,更新自己的配置,IP租用更新完成。如果没有收到该服务器的回复,则客户机继续使用现有的IP地址,因为当前租期还有50%。
如果在租期过去50%的时候没有更新,则DHCP客户机将在租期过去75%的时候再次向为其提供IP地址的DHCP服务器联系。如果还不成功,到租约的100%时候,DHCP客户机必须放弃这个IP地址,重新申请。如果此时无DHCP服务器可用,DHCP客户机会使用169.254.0.0/16中随机的一个地址,并且每隔5分钟再进行尝试。
LINUX DHCP 服务配置详解
安装软件包
yum install -y dhcp
yum install -y dhcp-common
yum install -y dhcp-lib
dhcp包包含的主要文件
rpm -ql dhcp #查看dhcp包安装了哪些文件和程序
/etc/dhcpd.conf #主配置文件
/etc/rc.d/init.d/dhcpd #服务启动脚本
/etc/rc.d/init.d/dhcrelay #继dhcp服务启动脚本
/etc/sysconfig/dhcpd #次要配置文件
/etc/sysconfig/dhcrelay
/usr/share/doc/dhcp-4.2.5/dhcpd.conf.example #示例文件
/ust/lib/systemd/system/dhcpd.services # 服务启动脚本 systemctl start dhcpd
/var/lib/dhcpd/dhcpd.leases #租约信息存放的文件
客户机和服务器配置文件
/var/lib/dhclient/dhclient.leases #客户端租约文件
/var/lib/dhcpd/dhcpd.leases #服务器端的租约文件在
/etc/dhcp/dhcpd.conf #dhcp配置文件
服务端口对应配置文件
cat /etc/services #linux下基本服务的端口,协议,描述等信息。
http 80/tcp www www-http # WorldWideWeb HTTP httpd服务
bootps 67/tcp # BOOTP server 这就是dhcp服务端口
bootps 67/udp ##是dhcp服务
常用命令
systemctl start dhcp
systemctl stop dhcpd
配置dhcp服务器
配置文件都放在/etc/dhcp目录下,主配置文件为dhcpd.conf
- 编写dhcpd.conf (可以复制dhcpd.conf.example模板文件来修改,也可以直接编辑dhcpd.conf)
-
## 1、拷贝示例文件覆盖原来的空文件。通过rpm -ql dhcp查看自己模板配置文件(不一定和我一样的版本)
-
cp /usr/share/doc/dhcp-
4.
2.
5/dhcpd.conf.example /etc/dhcp/dhcpd.conf
-
-
## 2、预先处理,去掉 注释和空行,保留 生效语句,和可选语句。
-
sed -ri '/(^#[[:space:]]+|^#$|^$)/{d}' /etc/dhcp/dhcpd.conf
删除没用的那些行,保留内容如下:
-
主配置文件样板:
-
-
#ddns-update-style none;
-
#authoritative;
-
log-facility
local7;
-
-
subnet
10.1
.1
.0
netmask
255.255
.255
.0 {
-
range
10.1
.1
.100
10.1
.1
.200
;
##地址池
-
option
domain-name-servers
202.96
.128
.166
;
##DNS服务器地址
-
option
domain-name
"class.com"
;
##域名
-
option
routers
10.1
.1
.1
;
##默认路由
-
option
broadcast-address
10.1
.1
.255
;
##广播地址
-
default-lease-time
300
;
##默认租约时间
-
max-lease-time
7200
;
##最大租约时间
-
}
-
注意:dhcp服务器必须要有一张网卡在10.1.1.0/24网络,并且它只会给这张网卡所在网络(广播域)主机分配ip。
- 一个dhcp服务器给多局域网提供服务
1、先将两张网卡接入两个不同网络,并设置静态ip
2、修改配置文件/etc/dhcp/dhcpd.conf 如下:
-
#ddns-update-style none;
-
#authoritative;
-
log-facility
local7;
-
-
subnet
10.1
.1
.0
netmask
255.255
.255
.0 {
-
range
10.1
.1
.100
10.1
.1
.200
;
##地址池
-
option
domain-name-servers
202.96
.128
.166
;
##DNS服务器地址
-
option
domain-name
"class.com"
;
##域名
-
option
routers
10.1
.1
.1
;
##默认路由
-
option
broadcast-address
10.1
.1
.255
;
##广播地址
-
default-lease-time
300
;
##默认租约时间
-
max-lease-time
7200
;
##最大租约时间
-
}
-
-
subnet
192.168
.100
.0
netmask
255.255
.255
.0 {
-
range
192.168
.100
.3
192.168
.100
.100
;
##地址池
-
option
domain-name-servers
202.96
.128
.166
;
##DNS服务器地址
-
option
domain-name
"class.com"
;
##域名
-
option
routers
192.168
.100
.1
;
##默认路由
-
option
broadcast-address
192.168
.100
.255
;
##广播地址
-
default-lease-time
300
;
##默认租约时间
-
max-lease-time
7200
;
##最大租约时间
-
}
-
小结:系统在收到dhcp请求时,会看是哪张网卡收到的请求,根据该网卡的ip地址选择对应配置文件里的地址池给对应网络主机分配地址。
mac绑定ip (嵌套一段就好)
-
#ddns-update-style none;
-
#authoritative;
-
log-facility
local7;
-
-
subnet
10.1
.1
.0
netmask
255.255
.255
.0 {
-
range
10.1
.1
.100
10.1
.1
.200
;
##地址池
-
option
domain-name-servers
202.96
.128
.166
;
##DNS服务器地址
-
option
domain-name
"class.com"
;
##域名
-
option
routers
10.1
.1
.1
;
##默认路由
-
option
broadcast-address
10.1
.1
.255
;
##广播地址
-
default-lease-time
300
;
##默认租约时间
-
max-lease-time
7200
;
##最大租约时间
-
-
host
serverftp {
## 备注名称,可以自行定义。
-
hardware
ethernet
12
:34:56:78:AB:CD;
##静态绑定mac和ip
-
fixed-address
10.1
.1
.5
;
-
}
-
}
dhcp配置文件中下面配置作用:客户机通过dhcp获得dns域名和IP地址,并且将dns--ip 保存到/etc/resolv.conf中!
option domain-name-servers 202.96.128.166; ##DNS服务器地址
option domain-name "class.com"; ##域名
客户机/etc/resolv.conf配置文件
; generated by /usr/sbin/dhclient-script ##脚本加载客户端租约文件/var/lib/dhclient/dhclient.leases
search localdomain ##dhcp分配的dns域名
nameserver 192.168.109.2 ##dhcp分配的dns服务器的ip
默认租约时间 与 最大租约时间
注意:这里的时间都是utc时间,比如我们是15:00获取的ip 配置文件里显示的是07:00,比北京时间少8小时
客户机续约过程如下:
假如:默认使用 10 小时租约期 ,10小时内续约,可以继续使用该IP地址。
1、在线:第5小时找一次dhcp自动续约
2、(1请求失败)8.5小时的时候,再尝试
3、(2请求失败)找别的dhcp服务器
4、(3请求失败)继续使用原先的IP地址,直到过期。根据默认租约期限
####服务器的 /var/lib/dhcpd/dhcpd.lease 信息文件。
starts 起始时间点:
ends 结束(过期时间点):
相隔时间= default-lease-time 的设置。
(从这个时间间隔中可以推测出下一次该IP地址的续约时间。)
#### 客户端的 /var/lib/dhclient/dhcpd-eth0.lease 信息文件。
得到的资源信息:
renew:下一次去找dhcpd服务器续约的时间点。 = 租约时间的50%
rebind:renew失败后,重试的时间点。 =租约时间的 85% 左右
expire:过期的时间点
每次续约成功,就会更新一次 /var/lib/dhclient/dhcpd-eth0.lease 租约文件。
最大租约期限
max-lease-time 43200; 最大租约时间(秒)12小时
说明:最大和默认租约时间,机制一样,在客户端没有特殊的租约时间请求的时候,都会
统一的指 派默认租约时间(多数情况)。 如果客户端请求了自定义的租约时间,服务器将会启用最大租约时
间作为限制,客户端自己请求的租约时间不能大于该值。max time
自定义 日志输出路径和级别
update /etc/rsyslog.conf file
# Save boot messages also to boot.log
local7.* /var/log/boot.log ##默认与 boot.log 放在一起,
local2.* /var/log/dhcpd.log ## 自定义独立存放。
#define KERN_EMERG "<0>" /* system is unusable */
#define KERN_ALERT "<1>" /* action must be taken immediately */
#define KERN_CRIT "<2>" /* critical conditions */
#define KERN_ERR "<3>" /* error conditions */
#define KERN_WARNING "<4>" /* warning conditions */
#define KERN_NOTICE "<5>" /* normal but significant condition */
#define KERN_INFO "<6>" /* informational */
#define KERN_DEBUG "<7>" /* debug-level messages */