简介
动态主机配置协议 DHCP(Dynamic Host Configuration Protocol,动态主机配置协议) 是 RFC 1541(已被 RFC 2131 取代)定义的标准协议,该协议允许服务器向客户端动态分配 IP 地址和配置信息。
使用UDP协议,C/S模式。
dhcp服务器使用 67/UDP,dhcp客户端使用 68/UDP。
分配IP方式
- 将一个IP地址固定分配给一个客户端
- 随机地将地址永久性分配给客户端
- 随机地将地址分配给客户端使用一段时间(常用)
地址的有效使用时间段称为租用期,租用期满之前,客户端必须向服务器请求继续租用。服务器接受请求后才能继续使用,否则无条件放弃
二八原则
避免单台DHCP服务器宕机,客户端将无法获取IP地址,通常有多台DHCP服务器;然而DHCP服务器之间没有监督机制,无法保证分配地址没有冲突,可使用两台DHCP服务器。
若主机A侧有200台主机,主机B侧有200台主机,DHCP服务器各自按二八原则划分管控的动态IP范围,DHCP A:10.0.0.1~10.0.0.160和192.168.0.161~192.168.0.200,DHCP B:10.0.0.161~10.0.0.200和192.168.0.1~192.168.0.160;主机A获取10网段IP,若DHCP A宕机,可通过DHCP中继获取DHCP B中的10网段IP;主机B同理
DHCP中继
默认情况下,路由器隔离广播包,不会将收到的广播包从一个子网发送到另一个子网。当DHCP服务器和客户端不在同一个子网时,充当客户端默认网关的路由器将广播包发送到DHCP服务器所在的子网,这一功能就称为DHCP中继(DHCP Relay)
DHCP工作过程
DHCP在工作过程中涉及到的报文种类及其作用如下:
1、DHCP DISCOVER:客户端开始DHCP过程的第一个报文,是请求IP地址和其它配置参数的广播报文。
2、DHCP OFFER:服务器对DHCP DISCOVER报文的响应,是包含有效IP地址及配置的单播(或广播)报文。
3、DHCP REQUEST:客户端对DHCP OFFER报文的响应,表示接受相关配置。客户端续延IP地址租期时也会发出该报文。
4、DHCP DECLINE:当客户端发现服务器分配的IP地址无法使用(如IP地址冲突时),将发出此报文,通知服务器禁止使用该IP地址。
5、DHCP ACK :服务器对客户端的DHCP REQUEST报文的确认响应报文。客户端收到此报文后,才真正获得了IP地址和相关的配置信息。
6、DHCP NAK:服务器对客户端的DHCP REQUEST报文的拒绝响应报文。客户端收到此报文后,会重新开始新的DHCP过程。
7、DHCP RELEASE:客户端主动释放服务器分配的IP地址。当服务器收到此报文后,则回收该IP地址,并可以将其分配给其它的客户端。
8、DHCP INFORM:客户端获得IP地址后,发送此报文请求获取服务器的其它一些网络配置信息,如DNS等。
续租
- 在使用租期过去50%时刻处, 客户端向服务器发送单播DHCP REQUEST报文续延租期。
- 如果收到服务器的DHCP ACK报文,则租期相应向前延长,续租成功。如果没有收到DHCP ACK报文,则客户端继续使用这个IP地址。在使用租期过去87.5%时刻处,向服务器发送广播DHCP REQUEST报文续延租期。
- 如果收到服务器的DHCP ACK报文,则租期相应向前延长,续租成功。如果没有收到DHCP ACK报文,则客户端继续使用这个IP地址。在使用租期到期时,客户端自动放弃使用这个IP地址,并开始新的DHCP过程。
实现
软件包
服务端
dhcp-server(centos8中)、dhcp(centos7及之前)
/usr/sbin/dhcpd | dhcp服务主程序 |
/etc/dhcp/dhcpd.conf | dhcp服务配置文件 |
/usr/share/doc/dhcp-server/dhcpd.conf.example | dhcp配置文件模板 |
/usr/lib/systemd/system/dhcpd.service | dhcp服务service文件 |
/var/lib/dhcpd/dhcpd.leases | 地址分配记录 |
客户端
dhcp-client
/usr/sbin/dhclient | 客户端程序 |
/var/lib/dhclient | 自动获取的IP信息 |
配置文件
查看dhcp配置文件模版
[root@wenzi ~]# vim /usr/share/doc/dhcp-server/dhcpd.conf.example
#指定客户端默认的域,局部或全局
option domain-name "example.org";
#指定客户端默认的DNS,局部或全局
option domain-name-servers ns1.example.org, ns2.example.org;
#最小租期时间,单位 秒
default-lease-time 600;
#最长租期时间 单位 秒
max-lease-time 7200;
#通过配置syslog.conf定义日志文件存放何处
log-facility local7;
#在这个子网上不提供服务,但是声明它可以帮助DHCP服务器理解网络拓扑
subnet 10.152.187.0 netmask 255.255.255.0 {
}
#这是一个非常基本的子网声明
subnet 10.254.239.0 netmask 255.255.255.224 {
#客户端获取动态IP的范围,可有多个range,但IP范围不能重叠
range 10.254.239.10 10.254.239.20;
#为客户端指定默认网关
option routers rtr-239-0-1.example.org, rtr-239-0-2.example.org;
}
#这个声明允许BOOTP(DHCP协议前身)客户端获取动态地址,我们不建议这样做。
subnet 10.254.239.32 netmask 255.255.255.224 {
range dynamic-bootp 10.254.239.40 10.254.239.60;
option broadcast-address 10.254.239.31;
option routers rtr-239-32-1.example.org;
}
#针对单独子网配置
subnet 10.5.5.0 netmask 255.255.255.224 {
range 10.5.5.26 10.5.5.30;
option domain-name-servers ns1.internal.example.org;
option domain-name "internal.example.org";
option routers 10.5.5.1;
#广播地址
option broadcast-address 10.5.5.31;
default-lease-time 600;
max-lease-time 7200;
}
#通过host 任意名 {} 配置
host passacaglia {
#单个客户端主机MAC地址
hardware ethernet 0:0:c0:5d:bd:95;
#获取bootloader启动文件的名称
filename "vmunix.passacaglia";
#去 toccata.example.com 主机获取 vmunix.passacaglia 文件
server-name "toccata.example.com";
}
#通过host 任意名 {} 配置单个客户端主机使得IP和MAC地址绑定,固定IP
host fantasia {
hardware ethernet 08:00:07:26:c0:a5;
#固定客户端主机的IP地址
fixed-address fantasia.example.com;
}
#您可以声明一类客户端,然后基于此进行地址分配
#下面的示例显示了某个类中的所有客户端,获取10.17.224/24子网上的地址,所有其它客户端获取10.0.29/24 #子网上的地址的情况。
class "foo" {
match if substring (option vendor-class-identifier, 0, 4) = "SUNW";
}
#告知是否为一些子网络分享相同网络
shared-network 224-29 {
subnet 10.17.224.0 netmask 255.255.255.0 {
option routers rtr-224.example.org;
}
subnet 10.0.29.0 netmask 255.255.255.0 {
option routers rtr-29.example.org;
}
pool {
allow members of "foo";
range 10.17.224.10 10.17.224.250;
}
pool {
deny members of "foo";
range 10.0.29.10 10.0.29.230;
}
}
具体使用见http://t.csdn.cn/b36rQ