浅谈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服务
    • 需要在客户机网段指定一台代理(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条目中,这里的配置属于全局配置
      基本格式如下:
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服务已搭建成功。
      在这里插入图片描述
  • 5、在服务端利⽤systemctl status dhcpd 命令可观察dhcp分发地址的全过程:

    在这里插入图片描述


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值