欢迎访问我的网站,希望内容对您有用,感兴趣的可以加入免费知识星球。

DHCP那些事儿

Linux 迷途小书童 4年前 (2019-12-06) 3484次浏览 0个评论

软硬件环境

  • ubuntu 16.04
  • isc-dhcp-server

概述

DHCP是一个局域网的网络协议,主要用途是给内部网络或网络服务供应商自动分配IP地址给用户.给内部网络管理员作为对所有计算机作中央管理的手段,它是一种C/S的结构,请见下图。

dhcp

协议结构

dhcp

  • Op – 消息操作代码,既可以是引导请求(BOOTREQUEST)也可以是引导答复(BOOTREPLY)
  • Htype – 硬件地址类型
  • Hlen – 硬件地址长度
  • Xid –处理ID
  • Secs –从获取到IP地址或者续约过程开始到现在所消耗的时间
  • Flags –标记
  • Ciaddr –客户机IP地址
  • Yiaddr –"你的"(客户机)IP地址
  • Siaddr –在bootstrap中使用的下一台服务器的IP地址
  • Giaddr –用于导入的接替代理IP地址
  • Chaddr –客户机硬件
  • Sname –任意服务器主机名称,空终止符
  • FileDHCP 发现协议中的引导文件名、空终止符、属名或者空,DHCP供应协议中的受限目录路径名
  • Options –可选参数字

DHCP工作流程

首先来熟悉下DHCP交互过程中的几个重要消息:

消息名称 详细说明
DHCPDISCOVER 客户端发起广播消息去寻找DHCP服务器
DHCPOFFER 空闲的DHCP服务器响应DHCPDISCOVER请求,附带了配置信息(如可用的IP地址,子网掩码等)
DHCPREQUEST 再次广播消息,申请DHCPOFFER中返回的IP地址
DHCPACK DHCP服务器将IP分配给客户端
DHCPNAK DHCP服务器返回的消息告知客户端申请的网络地址信息有误
DHCPDECLINE DHCP服务器返回的消息告知客户端申请的网络地址已被使用
DHCPRELEASE 客户端释放获取到的IP,取消余下的租约时间
DHCPINFORM 客户端通过其它手段已经获取到IP地址,请求获取其它配置信息

了解了这几个消息后,再来看看DHCP的交互过程,应该会更容易理解一点。先来看一张图,是通过抓包工具wireshark捕获到的申请IP成功的信息

dhcp

  1. client以广播包的形式,寻找可以分配ip地址的DHCP server,这即为discover阶段

dhcp

  1. 所有收到这个discover广播包的DHCP server,会回应这个广播包;发包的方式可能是广播报文,也可能是单播报文 ,此为offer阶段

dhcp

从上图中可以看到,DHCP服务器的IP地址是10.27.70.254,说明10.27.70.254最先响应了discover广播,并告知了DNSSubnet MaskIPRouterLease time信息。

  1. client收到这个包后(如果网络中有多个DHCP server,那么client只会接受第一个到达的offer报文),clientoffer报文中提取所要的ipdnsrouter等, 然后以广播包的形式,告知所有的DHCP server,我已经得到一个IP,并且此报文中包含了为client分配ip地址的server的信息。这即为request阶段。

dhcp

如图所示,客户端请求的IP地址是10.27.70.22,这里也是一个广播包。

  1. 局域网中所有的DHCP server收到request广播包之后,从中提取出服务器的信息,如果是指向自己的,则会返回ACK,其他的服务器则不会返回ACK。这即为ACK阶段。

dhcp

ACK返回的消息中包含了租约信息和客户端renew的时间点,这样一次成功的交互就完成了。

  1. DHCP serverclient出租的IP地址都有一个租界期限,期满后DHCP服务器便会回收分配的IP地址。如果DHCP client要延长其IP租约,须更新其IP租约。DHCP客户端在IP租约期限过一半时,会自动向DHCP服务器发送单播的DHCP Request报文续延租期。这就是renew阶段。

DHCP Option

DHCP Option有很多,详细的可以参见RFC文档,这里仅仅列出之前使用过的Option

Option 60

先看看来自rfc的解释

This option is used by DHCP clients to optionally identify the vendor type and configuration of a DHCP client.The information is a string of n octets, interpreted by servers.Vendors may choose to define specific vendor class identifiers to convey particular configuration or other identification information about a client. For example, the identifier may encode the client’s hardware configuration. Servers not equipped to interpret the class-specific information sent by a client MUST ignore it (although it may be reported). Servers that respond SHOULD only use option 43 to return the vendor-specific information to the client.)

在实际应用中的某些特殊网络,DHCP server需要client通过option 60来标识自己的设备类型或配置,DHCP server会直接忽略option 60不符的client,这样就能起到给客户端做认证的效果,不满足条件的不能在此网络中使用。

DHCP Server

手头上只有ubuntudesktop版本,就以它为例吧,在ubuntu server版上也是一样。在ubuntu上使用得最多的,就属isc-dhcp-server了,首先在系统中利用apt-get来安装

sudo apt-get install isc-dhcp-server

启动服务

sudo /etc/init.d/isc-dhcp-server start

DHCP配置文件dhcp.conf

配置文件位于/etc/dhcp/

ddns-update-style none;
option domain-name “djstavav”;
option domain-name-servers 202.96.209.5, 202.96.209.133;

//默认的租约时间,单位是秒
default-lease-time 600;
max-lease-time 720;

//syslog设置,可以到/var/log/syslog文件查看DHCP分配的日志
log-facility local7;

//这部分是重点,分别了可分配IP的范围,子网掩码
subnet 10.27.81.0 netmask 255.255.255.0 {
    interface eth0;
    range 10.27.81.63 10.27.81.254;
    option subnet-mask 255.255.255.0;
    option broadcast-address 10.27.81.255;
}

这里有一点需要注意,如果在一个需要持续分配IP的环境下,租约时间建议不要设得太长,否则当新机器上线后,会因为IP池已满而无法获取到IP,这时/var/log/syslog会显示

dhcp

特定MAC地址分配固定IP

修改dhcp.conf,增加如下语句,请根据自己实际情况自行修改MAC和IP地址

host djstava {   
     hardware ethernet dc:2a:14:e0:02:26;
     fixed-address 10.27.70.25;
}

DHCP Client & Server代码实现

请参考 udhcp

参考资料

喜欢 (0)

您必须 登录 才能发表评论!

Ads Blocker Image Powered by Code Help Pro

Ads Blocker Detected!!!

请关闭 Adblock 等类似浏览器插件,然后刷新页面访问,感谢您的支持!

We have detected that you are using extensions to block ads. Please support us by disabling these ads blocker.