Linux基础服务 ·

DHCP服务简介

[隐藏]

DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)是一个局域网的网络协议,使用 UDP 协议工作, 主要有两个用途:给内部网络或网络服务供应商自动分配 IP 地址,给用户或者内部网络管理员作为对所有计算机作中央管理的手段,在 RFC 2131 中有详细的描述。DHCP 有 3 个端口,其中 UDP67 和 UDP68 为正常的DHCP 服务端口,分别作为 DHCP Server 和 DHCP Client 的服务端口;546 号端口用于 DHCPv6 Client,而不用于DHCPv4,是为 DHCP failover 服务,这是需要特别开启的服务,DHCP failover 是用来做“双机热备”的。

功能概述

DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)通常被应用在大型的局域网络环境中,主要作用是集中的管理、分配 IP 地址,使网络环境中的主机动态的获得IP地址、Gateway 地址、DNS 服务器地址等信息,并能够提升地址的使用率。

DHCP 协议采用客户端/服务器模型,主机地址的动态分配任务由网络主机驱动。当 DHCP 服务器接收到来自网络主机申请地址的信息时,才会向网络主机发送相关的地址配置等信息,以实现网络主机地址信息的动态配置。DHCP 具有以下功能:
1. 保证任何 IP 地址在同一时刻只能由一台 DHCP 客户机所使用。
2. DHCP 应当可以给用户分配永久固定的 IP 地址。
3. DHCP 应当可以同用其他方法获得 IP 地址的主机共存(如手工配置 IP 地址的主机)。
4. DHCP 服务器应当向现有的 BOOTP 客户端提供服务。

DHCP 有三种机制分配IP地址:
1) 自动分配方式(Automatic Allocation),DHCP 服务器为主机指定一个永久性的 IP 地址,一旦 DHCP 客户端第一次成功从 DHCP 服务器端租用到IP地址后,就可以永久性的使用该地址。
2) 动态分配方式(Dynamic Allocation),DHCP 服务器给主机指定一个具有时间限制的 IP 地址,时间到期或主机明确表示放弃该地址时,该地址可以被其他主机使用。
3) 手工分配方式(Manual Allocation),客户端的IP地址是由网络管理员指定的,DHCP 服务器只是将指定的 IP 地址告诉客户端主机。

三种地址分配方式中,只有动态分配可以重复使用客户端不再需要的地址。

DHCP 消息的格式是基于 BOOTP(Bootstrap Protocol)消息格式的,这就要求设备具有 BOOTP 中继代理的功能,并能够与 BOOTP 客户端和 DHCP 服务器实现交互。BOOT P中继代理的功能,使得没有必要在每个物理网络都部署一个 DHCP 服务器。RFC 951 和 RFC 1542 对 BOOTP 协议进行了详细描述。

DHCP 封包格式

DHCP的封包格式如右图所示,各字段定义如下:
FIELD OCTETS DESCRIPTION

----- ------ -----------

DHCP报文格式
OP:
若是 client 送给 server 的封包,设为 1 ,反向为 2。HTYPE
硬件类别,Ethernet 为 1。
HLEN:
硬件地址长度, Ethernet 为 6。
HOPS:
若封包需经过 router 传送,每站加 1 ,若在同一网内,为 0。
TRANSACTION ID:
DHCP REQUEST 时产生的数值,以作 DHCPREPLY 时的依据。
SECONDS:
Client 端启动时间(秒)。
FLAGS:
从 0 到 15 共 16 bits ,最左一 bit 为 1 时表示 server 将以广播方式传送封包给 client ,其余尚未使用。
ciaddr:
要是 client 端想继续使用之前取得之 IP 地址,则列于这里。
yiaddr:
从 server 送回 client 之 DHCP OFFER 与 DHCPACK封包中,此栏填写分配给 client 的 IP 地址。
siaddr:
若 client 需要透过网络开机,从 server 送出之 DHCP OFFER、DHCPACK、DHCPNACK封包中,此栏填写开机程序代码所在 server 之地址。
giaddr:
若需跨网域进行 DHCP 发放,此栏为 relay agent 的地址,否则为 0。
chaddr:
Client 之硬件地址。
sname:
Server 之名称字符串,以 0x00 结尾。
file:
若 client 需要透过网络开机,此栏将指出开机程序名称,稍后以 TFTP 传送。
options:
允许厂商定议选项(Vendor-Specific Area),以提供更多的设定信息(如:Netmask、Gateway、DNS、等等)。其长度可变,同时可携带多个选项,每一选项之第一个 byte 为信息代码,其后一个 byte 为该项数据长度,最后为项目内容。CODE LEN VALUE 此字段完全兼容 BOOTP ,同时扩充了更多选项。其中,DHCP封包可利用编码为 0x53 之选项来设定封包类别:
项值类别:
1 DHCP DISCOVER
2 DHCP OFFER
3 DHCP REQUEST
4 DHCPDECLINE
5 DHCPACK
6 DHCPNACK
7 DHCPRELEASE

DHCP 的选项非常多,有空请查阅 RFC 或相关文献,并好好理解,这里不再叙述了。

DHCP 协议的运作方式

DHCP 通常是用于局域网络内的一个通讯协议,他主要藉由客户端传送广播封包给整个物理网段内的所有主机, 若局域网络内有 DHCP 服务器时,才会响应客户端的 IP 参数要求。所以,DHCP 服务器与客户端是应该要在同一个物理网段内的。 至于整个 DHCP 封包在服务器与客户端的来来回回情况有点像底下这样:

户端取得 IP 参数的程序可以简化如下:

  1. 客户端:利用广播封包发送搜索 DHCP 服务器的封包:若客户端网络设定使用 DHCP 协议取得 IP (在 Windows 内为『自动取得 IP』),则当客户端开机或者是重新启动网络卡时, 客户端主机会发送出搜寻 DHCP 服务器的 UDP 封包给所有物理网段内的计算机。此封包的目标 IP 会是 255.255.255.255, 所以一般主机接收到这个封包后会直接予以丢弃,但若局域网络内有 DHCP 服务器时,则会开始进行后续行为。
  2. 服务器端:提供客户端网络相关的租约以供选择:DHCP 服务器在接收到这个客户端的要求后,会针对这个客户端的硬件地址 (MAC) 与本身的设定数据来进行下列工作:
    • 到服务器的登录文件中寻找该用户之前是否曾经用过某个 IP ,若有且该 IP 目前无人使用,则提供此 IP 给客户端;
    • 若配置文件针对该 MAC 提供额外的固定 IP (static IP) 时,则提供该固定 IP 给客户端;
    • 若不符合上述两个条件,则随机取用目前没有被使用的 IP 参数给客户端,并记录下来。

    总之,服务器端会针对客户端的要求提供一组网络参数租约给客户端选择,由于此时客户端尚未有 IP ,因此服务器端响应的封包信息中, 主要是针对客户端的 MAC 来给予回应。此时服务器端会保留这个租约然后开始等待客户端的回应。

  3. 客户端:决定选择的 DHCP 服务器提供的网络参数租约并回报服务器:由于局域网络内可能并非仅有一部 DHCP 服务器,但客户端仅能接受一组网络参数的租约。 因此客户端必需要选择是否要认可该服务器提供的相关网络参数的租约。当决定好使用此服务器的网络参数租约后, 客户端便开始使用这组网络参数来设定自己的网络环境。此外,客户端也会发送一个广播封包给所有物理网段内的主机, 告知已经接受该服务器的租约。此时若有第二台以上的 DHCP 服务器,则这些没有被接受的服务器会收回该 IP 租约。至于被接受的 DHCP 服务器会继续进行底下的动作。
  4. 服务器端:记录该次租约行为并回报客户端已确认的响应封包信息:当服务器端收到客户端的确认选择后,服务器会回传确认的响应封包,并且告知客户端这个网络参数租约的期限, 并且开始租约计时!那么该次租约何时会到期而被解约 ?你可以这样想:
    • 客户端脱机:不论是关闭网络接口 (ifdown)、重新启动 (reboot)、关机 (shutdown) 等行为,皆算是脱机状态,这个时候 Server 端就会将该 IP 回收,并放到 Server 自己的备用区中,等待未来的使用;
    • 客户端租约到期:前面提到 DHCP server 端发放的 IP 有使用的期限,客户端使用这个 IP 到达期限规定的时间,而且没有重新提出 DHCP 的申请时,就需要将 IP 缴回去!这个时候就会造成断线。但用户也可以再向 DHCP 服务器要求再次分配 IP 。

以上就是 DHCP 这个协议在 Server 端与 Client 端的运作状态,由上面这个运作状态来看,我们可以晓得,只要 Server 端设定没有问题,加上 Server 与 Client 在硬件联机上面确定是 OK 的,那么 Client 就可以直接藉由 Server 来取得上网的网络参数,当然啦,只要我们这些管理员能够好好的、正确的管理好我们的 DHCP 服务器。那么上网的设定自然就变成一件很简单的事情!不过,关于上述的流程还是有一些需要额外说明的:

DHCP 服务器给予客户端的 IP 参数为固定或动态:

在上面的步骤里面,第二步骤就是服务器会去比较客户端的 MAC 硬件地址,并判断该 MAC 是否需要给予一个固定的 IP !所以,我们可以设定 DHCP 服务器给予客户端的 IP 参数主要有两种:

  • 固定 (Static) IP:只要那个客户端计算机的网络卡不换掉,那么 MAC 肯定就不会改变,由于 DHCP 可以根据 MAC 来给予固定的 IP 参数租约,所以该计算机每次都能以一个固定的 IP 连上 Internet !这种情况比较适合当这部客户端计算机需要用来做为提供区域内的一些网络服务的主机之用 (所以 IP 要固定)。那么如何在 Linux 上面知道网络卡的 MAC 呢?很简单!有很多的方式,最简单的方式就是使用 ifconfig 及 arp 来进行:

  • 动态 (dynamic) IP:Client 端每次连上 DHCP 服务器所取得的 IP 都不是固定的!都直接经由 DHCP 所随机由尚未被使用的 IP 中提供!

除非你的局域网络内的计算机有可能用来做为主机之用,所以必需要设定成为固定 IP ,否则使用动态 IP 的设定比较简单,而且使用上面具有较佳的弹性。

其实 IP 只有 Public IP 与 Private IP 两种,中文翻译成『公共 IP』与『私有 IP』这两个, 至于其他所谓的『静态 IP』、『实体 IP』、『虚拟 IP』、『浮动式 IP』等等,都是藉由一些 IP 取得的方式来分类的。

事实上现在主流的 ADSL 宽带拨接上网也有使用到『静态 IP 』与『固定 IP 』之类的概念! 举例来说好了,hinet/seed net 等主要 ISP 都有提供所谓的:『一个固定 IP 搭配 7~8 个浮动 IP 』的 ADSL 拨接功能,也就是说同样 通过一条电话线拨接到 ISP ,但是其中一个拨接是可以取得固定的 IP ! 而其他的则是非固定的 IP ,DHCP 的 static/dynamic 跟这个玩意儿有点类似!

关于租约所造成的问题与租约期限:

如果一个 IP 地址分配出去,而设备用了一会就离线了,那么这个地址会在租约时间到期后被收回,然后分配给下一个设备使用。

目前的 DHCP 客户端程序大多会主动的依据租约时间去重新申请 IP (renew) !也就是说在租约到期前你的 DHCP 客户端程序就已经又重新申请更新租约时间了。所以除非 DHCP 主机挂点, 否则你所取得的 IP 应该是可以一直使用下去的!

一般来说,假设租约期限是 T 小时,那么客户端在 0.5T 会主动向 DHCP 服务器发出重新要求网络参数的封包。 如果这次封包要求没有成功,那么在 0.875T 后还会再次的发送封包一次。正因如此,所以服务器端会启动 port 67 监听用户要求,而用户会启动 port 68 主动向服务器要求

多部 DHCP 服务器在同一物理网段的情况

若是同一网段内,存在多部 DHCP 服务器的话,那么客服端先请求的的服务会先给分配地址。

因为这个特色的关系,所以当你在练习 DHCP 服务器的设定之前, 不要在已经正常运作的区网下测试,否则会很惨

何时需要架设 DHCP 服务器

既然 DHCP 的好处是『免客户端设定』,而且对于行动装置的上网方面非常的方便!那么是否代表你就得要架设一部 DHCP 呢?那可不一定!接下来要告知大家的是几个概念性的问题, 你倒不一定『必需』遵守底下的一些概念呢!反正,自己的网域自己『爽』就好啦!

使用 DHCP 的几个时机

在某些情况之下,倒是强烈的建议架设 DHCP 主机的!什么情况呢?例如:

  • 具有相当多行动装置的场合:
    例如你的公司内部很多笔记本电脑使用的场合!因为这种笔电本身就是移动性的装置, 如果每到一个地方都要去问人家『喂!你这边的网络参数是什么?』还得要担心是否会跟人家的 IP 相冲突等等的问题!这个时候,DHCP 可就是你的救星!
  • 区域内计算机数量相当的多时:
    另外一个情况就是你所负责的网域内计算机数量相当庞大时, 大到你没有办法一个一个的进行说明来设定他们自己的网络参数,这个时候为了省麻烦,还是架设 DHCP 来的方便!况且,维护一部你熟悉的 DHCP 主机,要比造访几十个不懂计算机的人要简单的多!

不建议使用 DHCP 主机的时机

虽然 DHCP 有很多好处,但是客户端在开机的时候会主动的发送讯息给网域上的所有机器,这个时候,如果网域上就是没有 DHCP 主机呢?很抱歉,那么你的这部客户端计算机,『仍然会持续的发送讯息!』 真正的时间与次数不晓得会有多久,不过,肯定会超过 30 秒以上, 甚至可以达到一分钟以上!这段时间除了等、还是等! 所以啰,如果计算机数不多,还是使用手动的方式来设定一下就好了!

  • 在你网域内的计算机,有很多机器其实是做为主机的用途,很少用户需求,那么似乎就没有必要架设 DHCP ;
  • 更极端的情况是,像一般家里,只有 3 ~ 4 部计算机,这个时候,架设 DHCP 只能拿来练练功力,事实上,并没有多大的效益;
  • 当你管理的网域当中,大多网络卡都属于老旧的型号,并不支持 DHCP 的协议时;
  • 很多用户的信息知识都很高,那么也没有需要架设 DHCP 。

如前所述,上面的都是概念性的说法,事实上,一件事情的解决之道是有很多的方案的, 没有所谓的『完全正确』的方案,只有『相对可行、并且符合经济效益与功能』的方案! 所以,架设任何网站之前,请先多评估评估!

参与评论