DHCP(动态主机配置协议)是一个局域网的网络协议。
主要工作在应用层的局域网的网络协议,数据传输时使用UDP不可靠传输协议,通常运用在大型局域网。
主要是集中管理(限速、限时)、分配网络资源,使网络中的主机能动态的获得IP地址、Gateway地址、DNS服务器地址等信息,并能够提升地址的使用率。
当很多新的服务器整体装机就是无人执守自动部署时,每个机器都需要一个ip,这时就使用dhcp分配ip就可以进行整体装机。
给需要ip地址的服务器分配一个ip地址,当服务器不使用了之后,就会将ip收回来。
接下来我们进行详细解释:
当一台服务器启动之后,没有对应的ip地址,他会先把0.0.0.0作为自己的ip地址,但时0.0.0.0不能作为核发的ip进行通信,所以客户机就必须通过DHCP服务器来获取一个合法的IP地址。
由于客户机DHCP的ip地址,所以他使用0.0.0.0的地址作为源地址,使用255.255.255.255(能够工作的任意IP地址)作为目标地址,使用UDP67端口作为目的端口来广播请求ip地址信息。
广播信息DHCP Discover中包含了DHCP客户机的MAC地址和计算机名,以便使DHCP服务器能确定是哪个客户机发送的请求。
而不是DHCP服务器的其他服务器不会接收DHCP Discover,因为他就没有UDP67端口。
当DHCP服务器接收到客户机请求IP地址的信息时,他就在自己的IP地址池中查找是否有核发的IP地址提供给客户机。如果有,DHCP服务器就将此IP地址做上标记,加入到DHCP Offer的消息中,然后DHCP服务器就广播一则DHCP Offer消息。
DHCP Offer中含有以下信息:
只有发送了DHCP Discover的有可能接收,由于Offer中含有请求者的MAC,所以最终只有对应的请求者接收。
因为DHCP客户机还没有IP地址,所以DHCP服务器使用自己的IP地址作为源地址,使用255.255.255.255作为目标地址,使用UDP 68端口来广播DHCP Offer消息。
DHCP客户机从接收到的第一个DHCP Offer消息中选择IP地址,发出IP地址的DHCP服务器将该地址保留,这样地址就不能提供给另一个dhcp客户机了。
当DHCP客户机从接收到的第一个DHCP Offer消息中选择IP地址后,DHCP租约的第三过程发生。
客户机将所有的DHCP Request消息广播到所有DHCP服务器,并表明接收发送Offer服务器提供的内容。
DHCP Request消息包括为该客户机提供IP配置的服务器的服务表示(IP地址)。
DHCP服务器查看服务器标识字段,以确定他自己是否被选择为指定的客户机提供IP地址。
如果DHCP Offer被拒绝,则DHCP服务器会取消提供并保留的IP地址以用于下一个IP租约请求。
在客户机选择IP地址的过程中,虽然客户机选择了IP地址,但是还没有配置IP地址,而在一个局域网中可能含有几个DHCP服务器,所以还是要使用广播的方式,以0.0.0.0最为源地址,使用255.255.255.255作为目标地址,使用UDP 67端口作为目的端口来广播DHCP Request信息。
DHCP服务器接收到DHCP Request消息后,以DHCP ACK消息的形式向客户机广播成功的确认,该消息报含有IP地址的有效租约和其他可能配置的信息。
虽然服务器确认了客户机的租约请求,但时客户机还没有收到收到DHCP ACK消息,所以服务器仍然使用ip作为自己的源地址,使用255.255.255.255作为目标地址,使用UDP 68端口作为源端口来广播DHCP ACK消息。
当客户机接收到DHCP ACK,他配置了IP地址,完成了TCP/IP的初始化。
DHCP客户机收到DHCP服务器回应的ACK报文后,通过地址冲突检测(arp)发现服务器分配的地址冲突,或由于其他原因导致不能使用,则发送DECLINE报文,通只服务器分配的IP地址不可用。重新分配。
如果DHCP Request不成功,例如客户机试图租之前的IP地址,但该IP不再可用,或者因为客户机移动到其他子网,该IP无效时,DHCP服务器将广播否定确定消息DHCP NACK。
当客户接接收不到确认消息,将会重新开始DHCP租约过程。
如果客户机无法找到DHCP服务器,他将从TCP/IP的B类网段169.254.0.0/26中挑选一个IP地址作为自己的IP地址,继续每隔5分钟尝试与DHCP服务器进行通讯,一但与DHCP服务器取得联系,则客户机放弃自动配置的IP地址,而是用DHCP服务器分配的IP地址。
根据DHCP服务器中DHCP服务的配置文件来进行判断,其中含有两个租约的信息:
续租过程:
软件名:
服务名:
端口号:
配置文件:
配置文件中含有全局配置和局部配置:
全局配置:
局部配置:
subnet 10.254.239.0 netmask 255.255.255.224 { # 声明要分配的网段和子网掩码
range 10.254.239.10 10.254.239.20; # 声明IP地址池(IP范围,这里共有10个)
option domain-name "example.org"; # 设置DNS域
option domain-name-servers 8.8.8.8; # 设置DNS服务器地址
option routers 123.0.0.1; # 网关地址
option broadcast-address 10.254.239.31; # 广播地址可不写
default-lease-time 600; # 默认租约(s)
max-lease-time 7200; # 最长租约(s)
}
DHCP文件中至少有一个subnet所声明的网段是当前主机的使用的IP网段,他是局域网协议,所以同网段最多。
实验准备:
查看环境:
[root@server ~]# systemctl status firewalld.service
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
Active: inactive (dead) # 已经关闭防火墙
Docs: man:firewalld(1)
[root@server ~]# getenforce
Disabled # selinux永久关闭
1)安装DHCP服务:
[root@server ~]# rpm -qa | grep dhcp
dhcp-libs-4.2.5-47.el7.x86_64
dhcp-common-4.2.5-47.el7.x86_64 # DHCP命令软件包已经安装了
[root@server ~]# yum install dhcp -y
……………
Installed:
dhcp.x86_64 12:4.2.5-47.el7
Complete!
2)查看配置文件:
[root@server ~]# cd /etc/dhcp/
[root@server dhcp]# ls
dhclient.d dhcpd6.conf dhcpd.conf
[root@server dhcp]# vim dhcpd.conf
#
# DHCP Server Configuration file.
# see /usr/share/doc/dhcp*/dhcpd.conf.example # 让你查看配置文件模版文件
# see dhcpd.conf(5) man page # 可以查看配置文件的帮助
#
3)查找模版:
[root@server dhcp]# cd /usr/share/doc/dhcp-
dhcp-4.2.5/ dhcp-common-4.2.5/
[root@server dhcp]# cd /usr/share/doc/dhcp-4.2.5/ # 进入目录,确定目录
[root@server dhcp-4.2.5]# ls
dhcpd6.conf.example dhcpd.conf.example ldap
# 找到了模版文件
4)查看模版文件:
[root@server dhcp-4.2.5]# vim dhcpd.conf.example
# dhcpd.conf 第一句话就是告诉我们这是配置文件
#
# Sample configuration file for ISC dhcpd
#
5)复制配置文件:
[root@server dhcp-4.2.5]# cp -a dhcpd.conf.example /etc/dhcp/dhcpd.conf
cp: overwrite ‘/etc/dhcp/dhcpd.conf’? y
# 覆盖掉之前的空文件
6)进入真的配置文件:
[root@server dhcp-4.2.5]# cd -
/etc/dhcp
[root@server dhcp]# ls
dhclient.d dhcpd6.conf dhcpd.conf
[root@server dhcp]# vim dhcpd.conf
# dhcpd.conf
#
# Sample configuration file for ISC dhcpd
#
7)备份配置文件:
[root@server dhcp]# cp -a dhcpd.conf dhcpd.conf.bak
[root@server dhcp]# ls
dhclient.d dhcpd6.conf dhcpd.conf dhcpd.conf.bak # 备份文件建立成功
8)注释配置文件中的subnet留下只留下最后一个:
# A slightly different configuration for an internal subnet.
subnet 172.25.5.0 netmask 255.255.255.0 { # 要分配的网段和子网掩码
range 172.25.5.50 172.25.5.100; # 分配的地址池
# option domain-name-servers ;
# option domain-name "internal.example.org";
option routers 172.25.5.250; # 网关
# option broadcast-address 10.5.5.31;
default-lease-time 600; # 默认租期
max-lease-time 7200;# 最长租期
}
:wq # 保存退出
9 )启动服务
[root@server dhcp]# systemctl start dhcpd.service
10)查看端口,验证成功:
[root@server dhcp]# netstat -aptlun
udp 0 0 0.0.0.0:67 0.0.0.0:* 6398/dhcpd
udp 0 0 0.0.0.0:67 0.0.0.0:* 1410/dnsmasq
这时dhcp服务器设定成功。
1)将客户端的网络修改为自动模式:
[root@client1 ~]# nmtui
┌───────────────────────────┤ Edit connection ├───────────────────────────┐
│ │
│ Profile name System eth0_____________________________ │
│ Device eth0 (52:54:00:00:05:0B)________________ │
│ │
│ ═ ETHERNET <Show> │
│ │
│ ═ IPv4 CONFIGURATION <Automatic> # 修改为自动获取 │
│ ═ IPv6 CONFIGURATION <Ignore> <Show> │
│ │
│ [X] Automatically connect │
│ [X] Available to all users │
│ │
│ <Cancel> <OK>
2)查看网卡配置文件:
[root@client1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=dhcp # 这里已经修改为dhcp模式的网络获取方式
ONBOOT=yes
TYPE=Ethernet
USERCTL=yes
IPV6INIT=no
PERSISTENT_DHCLIENT=1
IPADDR0=172.25.5.2
PREFIX0=24
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
NAME="System eth0"
UUID=5fb06bd0-0bb0-7ffb-45f1-d6edd65f3e03
IPADDR1=123.0.0.2
PREFIX1=24
PEERDNS=yes
PEERROUTES=yes
3)重启网络服务:
[root@client1 ~]# systemctl restart network
[root@client1 ~]#
4)查看ip:
[root@client1 ~]# ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.25.5.50 netmask 255.255.255.0 broadcast 172.25.5.255
inet6 fe80::5054:ff:fe00:50b prefixlen 64 scopeid 0x20<link>
ether 52:54:00:00:05:0b txqueuelen 1000 (Ethernet)
RX packets 4225 bytes 2962587 (2.8 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1884 bytes 302477 (295.3 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
5)查看DHCP服务器的日志记录:
[root@server dhcp]# tail -n 4 /var/log/messages
Aug 18 22:12:57 server dhcpd: DHCPDISCOVER from 52:54:00:00:05:0b (client1) via ens3 # 我想要
Aug 18 22:12:57 server dhcpd: DHCPOFFER on 172.25.5.50 to 52:54:00:00:05:0b (client1) via ens3 # 决定给你
Aug 18 22:12:57 server dhcpd: DHCPREQUEST for 172.25.5.50 (172.25.5.10) from 52:54:00:00:05:0b (client1) via ens3 # 我要你的
Aug 18 22:12:57 server dhcpd: DHCPACK on 172.25.5.50 to 52:54:00:00:05:0b (client1) via ens3 # 确定给你