一、DHCP服务器

DCHP(Dynamic Host Configuration Protocol),动态主机配置协议。

 

1、DHCP八种报文

  • DHCP DISCOVER:客户端到服务器

  • DHCP OFFER :服务器到客户端

  • DHCP REQUEST:客户端到服务器

  • DHCP ACK :服务器到客户端

  • DHCP NAK:服务器到客户端,通知用户无法分配合适的IP地址

  • DHCP DECLINE :客户端到服务器,指示地址已被使用

  • DHCP RELEASE:客户端到服务器,放弃网络地址和取消剩余的租约时间

  • DHCP INFORM:客户端到服务器, 客户端如果需要从DHCP服务器端获取更为详细的配置信息,则发送Inform报文向服务器进行请求,极少用到

 

2、DHCP工作流程

2.1、客户端发送请求

    当DHCP客户机第一次登陆网络时,如客户机上无任何IP信息设定,它会以广播形式向网络发送DHCP DISCVER数据包,这个广播包,只有DHCP服务器才会响应,其它主机收到后直接丢弃。

 

2.2、DHCP服务器回应

DHCP服务器收到客户端的广播包后,会进行下面3个操作:

  • 查看自动分配记录,根据有没有该用户(MAC地址)的记录,如果有,并且对应的IP地址目前还没有分配出去,就把该IP及相关信息分配给该用户

  • 查看绑定记录,如果有该客户端的MAC地址绑定记录,就把对应的IP分配给客户端。

  • 如果没有记录,它会从地址范围中选择可用IP及其它TCP/IP设定以DHCP OFFER数据包形式发送给客户机。

 

2.3、客户端选择

    如果有多台DHCP服务器,都收到了客户端请求,并且都为该客户端分配了IP,客户端只会接受最先收到的那一个。然后再发送一个DHCPREUQEST广播包,向整个网络宣告自己将使用哪一台DHCP服务器提供的IP地址。当其它DHCP服务器收到这个包后,就收回向该客户端发送的IP租约。

    同时,客户端还会向网络发送ARP广播数据包,查询网络上有没有其它机器使用该IP地址,如何发现此IP已经被占用,客户端则会发送一个DHCP DECLINE数据包给DHCP服务器,拒绝接受其DHCP OFFER,并重新发送DHCP REQUEST信息

    客户端可以保留自己的一些TCP/IP设定,如网关,DHS地址等

 

2.4、服务器确认

    当被客户端接受的DHCP服务器收到客户端发送的DHCPREQUEST包后,DHCP服务器会发送一个DHCP ACK消息,以确认IP租约正式生效,结束完整的DHCP工作过程。

 

2.5、客户端重新登陆

    DHCP客户端成功地从服务器取得IP地址后,一般不需要再发送DHCP DISCOVER信息,除非租约已经到期或者IP地址重新设定回0.0.0.0

此时客户端会直接使用已经租用到的IP地址向为其发放此IP地址的DHCP服务器发出DHCP REQUEST信息。

    当DHCP服务器收到这一信息后,它会尝试让DHCP客户端继续使用原来的IP地址,并回答一个DHCP ACK确认信息继续使用IP。

如果此IP地址已无法再分配给原来的DHCP客户端使用(比如该IP地址已分配给其他DHCP客户端使用),则DHCP服务器给DHCP客户端回答一个DHCP NACK否认信息。

    当客户端收到DHCP NACK否认信息,必须重新发送DHCP discover信息来请求新的IP地址。

 

注意:

  • 客户端执行DHCP DISCOVER后,如果没有DHCP服务器响应客户端请求,客户端会随机使用169.254.0.0/16网段中的一个IP地址配置本机地址

 

2.6、续租

    为了防止一些用户长期占用IP,所以需要设定一个租约时间,租约时间有两种方式:

  • DHCP服务器分配IP时指定

  • 客户端发送请求的时候,自己指定

 

续租方式:

  • 50%,客户端在租赁时间达到50%时来续租,向DHCP服务器发向新的DHCPREQUEST请求(单播)。如果无特殊情况,dhcp服务则回应DHCPACK信息。当DHCP客户端收到该应答信息后,就重新开始新的租用周期

  • 87.5%:如果上一次的续租请求没有收到回应,等到租约期的7/8时,主机会再发送一次广播请求。

 

3、配置DHCP服务器

3.1、装包

yum install -y dhcp

 

3.2、修改配置文件

#默认配置文件里是空的,可拷贝模板文件,再进行修改

cp /usr/share/doc/dhcp-4.2.5/dhcpd.conf.example  \

/etc/dhcp/dhcpd.conf

 

#修改配置文件

vim /etc/dhcp/dhcpd.conf

#DHCP和DNS服务器同步更新,也就是动态DNS,如果要开启,将none改成interim

ddns-update-style none; 

 

#忽略客户端更新DNS记录

ignore client-updata;

 

#默认租约为3天,以秒为单位 

default-lease-time 259200;

 

#最大租约为6天,客户端申请租约限制,如果客户端请求未明确租约时间,采用默认租约

max-lease-time 518400;

 

#网关 

option routers 10.0.0.1;

 

#搜索域 

option domain-name “example.com”;

 

#DNS,以逗号分隔 

option domain-name-servers 114.114.114.114,223.5.5.5; 

 

以上为全局配置,下面subnet里面的局部配置会覆盖全局配置。

 

#定义作用域,声明一个子网

#指定IP范围

#配置选项:网关、dns

#配置参数:租期

subnet 10.0.0.0 netmask 255.255.255.0 {

range 10.0.0.10 10.0.0.20;

option routers 10.0.0.254;

option domain-name-servers 8.8.8.8,8.8.4.4;

default-lease-time 7200;

 

注意:

  • 子网网络号必须和DHCP主机相同,否则启动服务报错

 

#声明一个host,也就是定义保留地址    

host node1 {

 

#MAC地址

hardware ethernet 00:0c:29:38:ae:a6;

 

#绑定的IP

fixed-address10.0.0.100;

 

#为客户端主机指定hostname

#注意,客户端主机当前的/etc/hostname文件内必须是localhost.localdomain,才会生效;否则,dhcp client会认为不允许修改,所以不会更新。

option host-name "xx";

 

注意:

  • DHCP服务器会先查找固定IP地址的host语句,如果没有对应的host语句匹配,才会查非固定地址的声明。

  • 为了防止IP地址冲突,DHCP服务器会先向准备分配的IP地址发送一个ICMP ECHO请求,如果1秒内没有收到ICMP ECHO REPLY信息,表示这个IP没有被使用。否则,会将此IP标记为“废弃地址”,不再把它分配给客户端,只到没有可用的地址时,才会将此IP重新标记为“可用”。

 

3.3、重启DHCP服务,并开机启动

systemctl restart dhcpd

systemctl enable dhcpd

 

4、客户端设置

vim /etc/sysconfig/network-scripts/ifcfg-eth0

BOOTPROTO=dhcp

 

#重启网络

systemctl restart network

 

#查看DNS

cat /etc/resolv.conf

 

#查看DHCP相关信息

cat /var/lib/dhclient/dhclient-eth0.leases

lease {

interface "eno16777736";

fixed-address 172.25.254.147;

option subnet-mask 255.255.255.0;

option routers 172.25.254.2;

option dhcp-lease-time 1800;

option dhcp-message-type 5;

option domain-name-servers 172.25.254.2;

option dhcp-server-identifier 172.25.254.254;

option broadcast-address 172.25.254.255;

option domain-name "localdomain";

 

#续约时间

renew 5 2018/10/19 02:18:04;

 

#如果服务器没有响应,或响应IP已经分给别人了,重新绑定一个新IP

rebind 5 2018/10/19 02:31:45;

 

#过期时间

expire 5 2018/10/19 02:35:30;

}

 

5、在DHCP服务器查看分配状态

#查看租期数据库

cat /var/lib/dhcpd/dhcpd.leases

  • starts,租约开始时间

  • ends,租约结束时间。

  • Tstp,Time Sent To Partner,发送给合作伙伴的时间,用于dhcp集群。

  • cltt,Client Last Transaction Time,客户端最后一次续约时间。

  • binding state,声明当前租约的绑定状态,free,表示租约可供客户使用;active,表示DHCP客户端当前正在使用该租约

  • next binding state,当前租约到期时的后续绑定状态

 

注意:

  • 租期数据库中所用的时间是格林威治标准时间(GMT),不是本地时间

 

#查看日志

systemctl status dhcpd