浅谈DHCP服务
DHCP概念
- DHCP (Dynamic Host Configuration Protocol)
动态主机配置协议,是一种局域网协议,属于UDP协议 - 主要用途:
- 用于内部网络和网络服务供应商自动分配IP地址给用户
- 用于内部网络管理员作为对所有电脑作集中管理的手段
- 使用场景
- 自动化安装系统
- 解决IPV4资源不足问题
- DHCP共有八种报文
- DHCP DISCOVER:客户端到服务器
- DHCP OFFER :服务器到客户端
- DHCP REQUEST:客户端到服务器
- DHCP ACK :服务器到客户端
- DHCP NAK:服务器到客户端,通知用户无法分配合适的IP地址
- DHCP DECLINE :客户端到服务器,指示地址已被使用
- DHCP RELEASE:客户端到服务器,放弃网络地址和取消剩余的租约时间
- DHCP INFORM:客户端到服务器, 客户端如果需要从DHCP服务器端获取更为详细的配置信息,则发送Inform报文向服务器进行请求,极少用到
- 续租
- 50% : 租赁时间达到50%时来续租,刚向DHCP服务器发向新的DHCPREQUEST请求。如果dhcp服务没有拒绝的理由,则回应DHCPACK信息。当DHCP客户端收到该应答信息后,就重新开始新的租用周期
- 87.5%:如果之前DHCP Server没有回应续租请求,等到租约期的7/8时,主机会再发送一次广播请求
- 同网段多DHCP服务
- DHCP服务必须基于本地,
- DHCP服务器一般来说应该与需要DHCP服务的客户端处于同一个网段中
- 这是因为DHCP服务过程基于广播,而广播只能在同一个网段内传送
- 先到先得的原则
- DHCP服务必须基于本地,
- 实现跨网段的DHCP服务
- 需要在客户机网段指定一台代理(dhcrelay:中继)负责客户机与另一个网段的DHCP服务器的通信,实现IP地址的分配
- 符合RFC 1542 Compliant Routers标准的路由器可以直接实现中继的功能
- 相关协议
- Arp
- rarp
DHCP原理
- DHCP从一个IP地址池中提供IP地址,该池有DHCP服务器数据库定义,称为scope。如果客户端接受这一地址,则它可在一个预定义的期限内使用该地址,称为租约。如果客户端无法从DHCP服务器获取IP地址,它就无法正常初始化TCP/IP。
- 在DHCP为客户端配置TCP/IP参数时,DHCP服务器和客户端都需要经历四步过程。注意到很多通讯是通过广播的方式来完成的。如果路由器无法转发这些DHCP消息时,广播通信可能会造成问题。
- 当客户端处于以下四种状态之一时,必须使用IP租约进程:
- 配置使用DHCP的客户端第一次初始化TCP/IP;
- 客户端请求特定的IP地址但服务器拒绝了该地址,在DHCP丢弃租约时即会发生。
- 客户端之前租约了一个IP地址,但之后释放了该IP地址,
- 现申请一个新的租约。这种情况发生于用户输入ipconfig /release和ipconfig /renew命令时。
客户机请求IP地址(DHCPDISCOVER):
- 当一个IPv4客户机启动时监测到需要IP地址,它会初始化一个TCP/IP的限制版本,之后广播一个报文请求寻找DHCP服务器的地址。该广播报文告知监听服务器客户端需要IP地址信息。DHCP客户端发送的报文这一阶段包括租约请求,客户端源地址,0.0.0.0,目的地址,即广播地址255.255.255.255。报文也包括客户端硬件MAC地址和机器名,该信息也指明了向DHCP服务器发起请求的设备
- 客户端向DHCP服务器发送请求IP地址的真实报文称为
DHCPDISCOVER
报文。网络上每一台安装了TCP/IP协议的主机都会接收到这种广播信息,但只有DHCP服务器才会做出响应。
服务器提供IP地址(DHCPOFFER):
- 所有拥有有效IP地址的DHCP服务器都会向DHCP客户端提供IP地址信息。它响应以地址池中一个未分配的IP地址供请求主机使用。要能够响应
DHCPDISCOVER
报文,DHCP服务器必须拥有客户端的有效IP配置信息。DHCP服务器回复的DHCPOFFER
报文包含以下信息:- 客户端的硬件地址
- 提供的IP地址
- 合适的子网掩码
- 租约有效期
- 服务器ID,即DHCP服务器的IP地址
客户机选择IP地址(DHCPREQUEST):
- DHCP客户端选择它所接收到的第一个
DHCPOFFER
报文提供的IP地址。之后,它把这一信息广播至网络。该报文中,客户端请求服务器提供给它的IP地址。这是因为客户端可能收到不止一个DHCP服务器发送的offer。通过广播这一请求,客户端告知其他DHCP服务器不会再接受其他offer。为了进一步确保客户端接受的服务器offer没有疑义,DHCPREQUEST
报文中还包含以下信息:- 提供所接受offer的服务器IP地址
- 客户端硬件地址
- 客户端接受的IP地址
服务器确认IP租约(DHCPACK):
- DHCP服务器对客户端作出响应,将IP地址分配给客户端。之后,它发送
DHCPACK
确认信息给客户端。该信息包含IP地址的有效租约以及其他配置信息。 - 有时,在客户端接收服务器提供的租约后,DHCP租约请求仍可能不成功。可能有以下几种情况:
- 由于客户端移动至其他子网,IP地址无效
- 客户端尝试租约它之前的IP地址但该IP地址不再可用
- 在上述情况下,服务器会发送一条不成功信息
DHCPNACK
。收到DHCPNACK
的客户端必须重新开始整个DHCP初始化进程。也就是说,它必须发送另一个DHCPDISCOVER
报文查找新的IP地址。
DHCP实现
- Linux DHCP协议的实现程序:dhcp, dnsmasq(包含dhcp, dns功能)
- 端口:
- dhcp_server: 67/udp
- dhcp_client: 68/udp
- 配置DHCP服务器端
- DHCP服务的配置文件位于:
/etc/dhcp/dhcpd.conf
- 提示模板文件
/usr/share/doc/dhcp*/dhcpd.conf.sample
和帮助参考位置:man 5 dhcpd.conf - 直接赋值模板文件覆盖配置文件,在模板基础上修改配置
cp /usr/share/doc/dhcp*/dhcpd.conf.sample /etc/dhcp/dhcpd.conf
- 修改配置文件:
vim /etc/dhcp/dhcpd.conf
核心配置内容包含在subnet条目中,这里的配置属于全局配置
基本格式如下:
- DHCP服务的配置文件位于:
subnet SUBNET_IP netmask NETMASK_IP {
range START_IP END_START;
其余设置项
}
- 例如:DHCP服务器本机IP为
192.168.136.229
,子网掩码:225.225.225.0
,分配的地址库范围:192.168.136.10-192.168.136.30
,则配置文件格式如下:
subnet 192.168.136.0 netmask 225.225.225.0 {
range 192.168.136.10 192.136.136.30;
}
- 语法检查
dhcpd -t -cf /etc/dhcp/dhcpd.conf
- 配置好后,启动dhcp服务
service dhcpd start
,在另一台同网段主机上可以看到被分配的ip地址,从192.168.136.10/24开始分配 - 可以查看
/var/lib/dhcpd/dhcpd.leases
文件内容,查询DHCP服务器地址分配记录 - 其它配置选项:
- filename:指明引导文件名称(用于网络安装系统)
- next-server:提供引导文件的服务器IP地址(用于网络安装系统)
- 检查配置文件语法
service dhcpd configtest
- DHCP客户端(dhclient)
自动获取的IP信息文件:/var/lib/dhclient
目录下,可以看到被分配的地址、DHCP服务器、分配的租期时间等信息
实验:搭建DHCP服务器
- 前言准备:一台没有ip地址的centos6主机,一台CentOS7虚拟机作为DHCP服务器;网卡设为仅主机模式,设置固定IP地址,关闭虚拟机的DHCP功能
实验步骤 - 1、关闭iptables,selinux服务
iptables -F
//清空防火墙规则
systemctl stop firewalld
systemctl status firewalld
sed -i 's/selinux=.*/selinux=disabled' /etc/selinux/config
reboot
//重启生效 - 2、安装DHCP服务包并启动dhcp服务
[root@Centos7 ~]# yum install dhcp
[root@Centos7 ~]#systemctl start dhcpd.service
Job for dhcpd.service failed because the control process exited with error code. See "systemctl status dhcpd.service" and "journalctl -xe" for details.
//启动失败
- 发现
dhcpd
服务启动失败,原因是未配置dhcp.conf
⽂件 - 3、修改dhcp配置⽂件
- 系统⾃带的dhcp.conf是空⽂件,找到安装包⾃带的example进⾏修改
// 找到example文件的位置
[root@Centos7 ~]#rpm -ql dhcp | grep example
/usr/share/doc/dhcp-4.2.5/dhcpd.conf.example
/usr/share/doc/dhcp-4.2.5/dhcpd6.conf.example
// 复制example文件并改名
[root@Centos7 ~]#cp /usr/share/doc/dhcp-4.2.5/dhcpd.conf.example /etc/dhcp/dhcpd.conf
cp: overwrite ‘/etc/dhcp/dhcpd.conf’? yes
// 修改配置文件
vim /etc/dhcp/dhcpd.conf
#其中全局语句块和subnet语句块均可使配置生效,subnet语句块优先级高于全局语句块:
#全局语句块:
# option definitions common to all supported networks...
#指定获取主机域后缀:
option domain-name "ceshi.org";
#指定DNS,可选
option domain-name-servers 114.114.114.114,8.8.8.8
#结合生产环境,ip越充足,租期越大越好
default-lease-time 86400;
#最大租期时间
max-lease-time 100000
log-facility local7;
#subnet语句块:
# This is a very basic subnet declaration.
subnet 192.168.39.0 netmask 255.255.255.0 {
#指定ip地址范围
range 192.168.39.10 192.168.39.100;
#指定默认网关
option routers 192.168.39.1;
#注意,语句结束一定要用分号结束,否则服务启动不起来
}
[root@Centos7 ~]#systemctl start dhcpd
[root@Centos7 ~]#systemctl enable dhcpd
Created symlink from /etc/systemd/system/multi-user.target.wants/dhcpd.service to /usr/lib/systemd/system/dhcpd.service.
# 语法检查
dhcpd -t -cf /etc/dhcp/dhcpd.conf
-
4、切换到另外⼀台CentOS6虚拟机,查看是否获取到ip地址
- 执行命令获取新的IP地址
dhclient -d
- 再次查看获取到ip地址,表⽰dhcp服务已搭建成功。
- 执行命令获取新的IP地址
-
5、在服务端利⽤
systemctl status dhcpd
命令可观察dhcp分发地址的全过程:
完