DHCP篇
DHCP是什么
DHCP,动态主机配置协议(Dynamic host configuration protocol),是一个局域网络协议,使用的是UDP协议工作,是给内部局域网或者网络供应商自动分配IP地址,是给用户或者内部网络的网管来作为所有计算机的中央管理,使用的端口是67(DHCP服务器)、68(DHCP客户端)。
DHCP工作原理
DHCP报文共有一下几种:
1.DHCP DISCOVER :客户端开始DHCP过程发送的包,是DHCP协议的开始
2.DHCP OFFER :服务器接收到DHCP DISCOVER之后做出的响应,它包括了给予客户端的IP(yiaddr)、客户端的MAC地址、租约过期时间、服务器的识别符以及其他信息
3.DHCP REQUEST :客户端对于服务器发出的DHCP OFFER所做出的响应。在续约租期的时 候同样会使用。
4.DHCP ACK :服务器在接收到客户端发来的DHCP REQUEST之后发出的成功确认的报文。在建立连接的时候,客户端在接收到这个报文之后才会确认分配给它的IP和其他信息可以被允许使用。
5.DHCP NAK :DHCP ACK的相反的报文,表示服务器拒绝了客户端的请求。
6.DHCP RELEASE :一般出现在客户端关机、下线等状况。这个报文将会使DHCP服务器释放发出此报文的客户端的IP地址
7.DHCP INFORM :客户端发出的向服务器请求一些信息的报文
8.DHCP DECLINE :当客户端发现服务器分配的IP地址无法使用(如IP地址冲突时),将发出此报文,通知服务器禁止使用该IP地址。
知道了DHCP报文后,我们进一步了解DHCP工作原理:
- 客户端请求IP地址
当DHCP客户机需要获取IP时,它会通过UDP 67端口向网络上发出一个DHCP discover数据包(包中包含客户机的MAC地址和计算机名等信息)。因为客户机还不知道自己属于哪一个网络,所以封包的源地址为0.0.0.0,目标地址为255.255.255.255,然后再附上DHCP discover的信息,向网络进行广播。
DHCP discover的等待时间预设为1秒,也就是当客户机将第一个DHCP discover封包送出去之后,在1秒之内没有得到回应的话,就会进行第二次DHCP discover广播。若一直没有得到回应,客户机会将这一广播包重新发送四次(以2,4,8,16秒为间隔,加上1-1000毫秒之间随机长度的时间)。如果都没有得到DHCP Server的回应,客户机会从169.254.0.0/16这个自动保留的私有IP地址中选用一个IP地址。并且每隔5分钟重新广播一次,如果收到某个服务器的响应,则继续IP租用过程。 - 提供IP地址租用
在客户机请求IP地址时,DHCP discover封包内会带有其MAC地址信息,并且有一个XID编号来辨别该封包,DHCP Server响应的DHCP OFFER封包则会根据这些资料传递给要求租约的客户。
当DHCP Server监听到客户机发出的DHCP discover广播后,会针对这个客户端的物理地址( MAC)与本身的设置数据进行下列工作:
(1)到服务器的日志文件中查找该用户之前是否曾经租用过某个IP,若有且该IP目前无人使用,则提供此IP给客户端。
(2)若配置文件针对该MAC地址提供特定的固定IP时,则提供该固定的IP给客户端。
(3)若不符合上述两个条件,它会从那些还没有租出去的地址中,选择最前面的空置IP,连同其它TCP/IP设定,通过UDP 68端口响应给客户机一个DHCP OFFER数据包(包中包含IP地址、子网掩码、地址租期等信息)。此时还是使用广播进行通讯,源IP地址为DHCP Server的IP地址,目标地址为255.255.255.255。同时,DHCP Server为此客户保留它提供的IP地址,从而不会为其他DHCP客户分配此IP地址。
- 接受IP租约
如果客户机收到网络上多台DHCP服务器的响应,一般会选择最先到达的DHCP offer,并且会向网络发送一个DHCP request广播数据包(包中包含客户端的MAC地址、接受的租约中的IP地址、提供此租约的DHCP服务器地址等),告诉所有DHCP Server它将接受哪一台服务器提供的IP地址,其他的DHCP服务器撤销它们的DHCP offer
此时,由于还没有得到DHCP Server的最后确认,客户端仍然使用0.0.0.0为源IP地址,255.255.255.255为目标地址进行广播。同时,客户端还会向网络发送一个ARP封包,查询网络上面有没有其他机器使用该IP地址;如果发现该IP地址已经被占用,客户端则会送出一个DHCP declinet包给DHCP服务器,拒绝接受其DHCP offer,并重新发送DHCP discover信息。 - 租约确认
当DHCP Server接收到客户机的DHCP request之后,会广播返回给客户机一个DHCP ACK消息包,表明已经接受客户机的选择,并将这一IP地址的合法租用以及其他的配置信息都放入该广播包发给客户机。此时租约到期计时开始 - 租期到期
客户机会在租期过去50%的时候,直接向为其提供IP地址的DHCP Server发送DHCP request消息包。如果客户机接收到该服务器回应的DHCP ACK消息包,客户机就根据包中所提供的新的租期以及其它已经更新的TCP/IP参数,更新自己的配置,IP租用更新完成。如果没有收到该服务器的回复,则客户机继续使用现有的IP地址,因为当前租期还有50%。
如果在租期过去50%的时候没有更新,则客户机将在租期过去87.5%的时候再次向为其提供IP地址的DHCP联系。如果还不成功,到租约到期时,客户机必须放弃这个IP地址,重新申请。如果此时无DHCP可用,客户机会使用169.254.0.0/16中随机的一个地址,并且每隔5分钟再进行尝试。
但目前的DHCP客户端程序大多数会主动依据租约时间去重新申请IP,所以即使有租约期限,也不需要在某个时间点手动去重新申请IP。
DHCP三种分配机制
分配类型 | 作用 |
---|---|
自动分配(automatic allocation) | Dhcp服务器为指定的客户机指定永久性的IP地址,只要DHCP的客户机成功地从DHCP服务器端租用到了IP地址,那么就能永久使用这个地址。 |
动态分配(dynamic allocation) | DHCP服务器端给主机指定一个具有时间限制的IP地址,当到期后或者说客户机主动表示放弃该地址的时候,那么原先给他的地址就可能分配给其他的客户机使用。这种方式,在原来的拨号上网的时候经常使用到。只有这种分配方式是可以重复使用从某个客户端机器上淘汰的IP地址的。 |
手动分配(manual allocation) | 由网络管理员来指定客户端的IP地址是多少。这个时候DHCP所做的工作仅仅只是将网络管理员分配的IP地址告诉客户机。 |
搭建DHCP
yum安装dchp服务
[root@localhost ~]# yum -y install dhcp
查看生成的配置文件
[root@localhost ~]# cat /etc/dhcp/dhcpd.conf
#
# DHCP Server Configuration file.
# see /usr/share/doc/dhcp*/dhcpd.conf.example --这个是模板文件所在路径,我们一般将该文件覆盖到该配置文件中就行配置
# see dhcpd.conf(5) man page --也可以使用man手册寻求帮助
#
[root@localhost ~]#
将模板文件内容覆盖到dhcp.conf配置文件中
[root@localhost ~]# cp /usr/share/doc/dhcp*/dhcpd.conf.example /etc/dhcp/dhcpd.conf
cp:是否覆盖"/etc/dhcp/dhcpd.conf"? y
[root@localhost ~]# cat /etc/dhcp/dhcpd.conf -- 查看到该文件内容已经改变
# dhcpd.conf
#
# Sample configuration file for ISC dhcpd
#
# option definitions common to all supported networks...
option domain-name "example.org";
option domain-name-servers ns1.example.org, ns2.example.org;
default-lease-time 600;
max-lease-time 7200;
......
接下来我们就可以修改配置文件来实现DHCP分配IP
[root@localhost ~]# vim /etc/dhcp/dhcpd.conf
在配置文件中找到以下内容:
# dhcpd.conf
#
# Sample configuration file for ISC dhcpd
#
# option definitions common to all supported networks...
option domain-name "example.org"; --编辑域名
option domain-name-servers ns1.example.org, ns2.example.org; --编辑为当前本机的IP地址
default-lease-time 600; --设置最短租约时间
max-lease-time 7200; --设置最长租约时间
# No service will be given on this subnet, but declaring it helps the
# DHCP server to understand the network topology.
subnet 10.152.187.0 netmask 255.255.255.0 { --设定分配给客户机的网段(当前这台服务器网段)
# 在{}中添加以下大致内容
range 0.0.0.0 0.0.0.0; --设置客户机获得的ip地址范围
option subnet-mask 255.255.255.0; --设置子网掩码
option routers 0.0.0.0; --设置网关地址
}
# This is a very basic subnet declaration.
以192.168.1.0网段为例:
option domain-name "haha.com"; --域名设置为haha.com
option domain-name-servers 192.168.1.10; --该服务器IP为192.168.1.10
default-lease-time 60000; --最短租约为60000秒
max-lease-time 720000; --最长租约为720000秒
subnet 192.168.1.0 netmask 255.255.255.0 { --分配给客户端的网段为1.0网段
range 192.168.1.20 192.168.1.30; --分配给客户端的IP范围为1.20-1.30
option subnet-mask 255.255.255.0; --子网掩码为255.255.255.0
option routers 192.168.1.1; --网关为1.1
}
修改完毕后,重启服务
如果报错,请自行查看配置文件内容是否配置正确
[root@localhost ~]# systemctl restart dhcpd
[root@localhost ~]#
配置完毕后,需要将dhcp服务加入防火墙放行策略(客户端和服务器都要)
[root@localhost ~]# firewall-cmd --add-service=dhcp --配置dhcp临时放行策略
success
[root@localhost ~]# firewall-cmd --add-service=dhcp --permanent --永久放行(如果没有配置临时需重启系统)
success
[root@localhost ~]# firewall-cmd --list-all --获取当前防火墙策略列表
public (active)
target: default
icmp-block-inversion: no
interfaces: ens33
sources:
services: dhcp dhcpv6-client ssh --可以看到有dhcp,说明以加入放行策略
ports:
protocols:
masquerade: no
forward-ports:
sourceports:
icmp-blocks:
rich rules:
[root@localhost ~]#
服务器配置完成,到客户端进行简单配置(服务器和客户端必须在用一个网卡中):
在ifcfg-ens33配置文件中将BOOTPROTO(IP获取方式)修改为dhcp获取
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
BOOTPROTO=dhcp
DEFROUTE=yes
PEERDNS=yes
重启network服务后
客户端使用命令dhclient -d获取DHCP分配的IP地址
[root@localhost ~]# dhclient -d
Internet Systems Consortium DHCP Client 4.2.5
Copyright 2004-2013 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/
Listening on LPF/virbr0-nic/52:54:00:e7:7b:0e
Sending on LPF/virbr0-nic/52:54:00:e7:7b:0e
Listening on LPF/virbr0/52:54:00:e7:7b:0e
Sending on LPF/virbr0/52:54:00:e7:7b:0e
Listening on LPF/ens33/00:0c:29:e9:b5:92
Sending on LPF/ens33/00:0c:29:e9:b5:92
Sending on Socket/fallback
DHCPDISCOVER on virbr0-nic to 255.255.255.255 port 67 interval 7 (xid=0xd551836)
DHCPDISCOVER on virbr0 to 255.255.255.255 port 67 interval 5 (xid=0x5f625df4)
DHCPREQUEST on ens33 to 255.255.255.255 port 67 (xid=0x291f6dab)
DHCPNAK from 192.168.200.254 (xid=0x291f6dab)
DHCPDISCOVER on ens33 to 255.255.255.255 port 67 interval 8 (xid=0x49d731ce)
DHCPREQUEST on ens33 to 255.255.255.255 port 67 (xid=0x49d731ce)
DHCPOFFER from 192.168.1.10
DHCPNAK from 192.168.200.254 (xid=0x49d731ce)
DHCPACK from 192.168.1.10 (xid=0x49d731ce)
bound to 192.168.1.20 -- renewal in 2775 seconds. --可以看出,获取到了192.168.1.20IP地址
ifconfig查看IP
[root@localhost ~]# ifconfig ens33
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.20 netmask 255.255.255.0 broadcast 192.168.1.255
我们也可以做保留地址,将指定IP保留给指定客户端
在配置文件中找到以下内容进行修改
# will still come from the host declaration.
host passacaglia {
hardware ethernet 0:0:c0:5d:bd:95; --设置要保留客户端的MAC地址
fixed-address 192.168.1.25; --设置要保留分配的IP地址
server-name "haha.com"; --域名
}
重启服务之后,在客户端使用命令获取
[root@localhost ~]# dhclient -d
Internet Systems Consortium DHCP Client 4.2.5
Copyright 2004-2013 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/
Listening on LPF/virbr0-nic/52:54:00:e7:7b:0e
Sending on LPF/virbr0-nic/52:54:00:e7:7b:0e
Listening on LPF/virbr0/52:54:00:e7:7b:0e
Sending on LPF/virbr0/52:54:00:e7:7b:0e
Listening on LPF/ens33/00:0c:29:e9:b5:92
Sending on LPF/ens33/00:0c:29:e9:b5:92
Sending on Socket/fallback
DHCPDISCOVER on virbr0-nic to 255.255.255.255 port 67 interval 7 (xid=0x453c093e)
DHCPDISCOVER on virbr0 to 255.255.255.255 port 67 interval 3 (xid=0x560d9223)
DHCPREQUEST on ens33 to 255.255.255.255 port 67 (xid=0x63786751)
DHCPDISCOVER on virbr0 to 255.255.255.255 port 67 interval 8 (xid=0x560d9223)
DHCPDISCOVER on virbr0-nic to 255.255.255.255 port 67 interval 11 (xid=0x453c093e)
DHCPREQUEST on ens33 to 255.255.255.255 port 67 (xid=0x63786751)
DHCPNAK from 192.168.200.254 (xid=0x63786751)
DHCPDISCOVER on ens33 to 255.255.255.255 port 67 interval 7 (xid=0x17c2455a)
DHCPREQUEST on ens33 to 255.255.255.255 port 67 (xid=0x17c2455a)
DHCPOFFER from 192.168.1.10
DHCPNAK from 192.168.200.254 (xid=0x17c2455a)
DHCPACK from 192.168.1.10 (xid=0x17c2455a)
bound to 192.168.1.25 -- renewal in 2948 seconds. --看到这个地方是获取到我们保留的地址
如果相要了解更多dhcp知识,参考链接:
链接:DHCP详解
链接:DHCP工作原理
链接:Linux基础DHCP