精华内容
下载资源
问答
  • 对于 DHCP 协议,你可能想知道以下几个问题:DHCP 是啥为啥需要 DHCPDHCP 的工作机制DHCP 如何分配地址DHCP 报文格式长啥样DHCP 中继是啥DHCP 有什么问题D...

    对于 DHCP 协议,你可能想知道以下几个问题:

    • DHCP 是啥

    • 为啥需要 DHCP

    • DHCP 的工作机制

    • DHCP 如何分配地址

    • DHCP 报文格式长啥样

    • DHCP 中继是啥

    • DHCP 有什么问题

    • DHCP 使用到哪些工具

    下面我们就带着这些问题,来一探究竟。

    01 DHCP 是啥

    DHCP 全称是 Dynamic Host Configuration Protocol,动态主机配置协议,主要用来给主机配置 IP 地址等网络信息的。IP 地址可以手动配(用 ifconfig/ipconfig/ip addr 等工具),也可以自动配,自动配就通过 DHCP 这个协议来完成,IPv6 有对应的 DHCPv6 协议。

    02 为啥需要 DHCP

    首先当然是方便了,手动配一台可以,如果让你去配一个数据中心所有的主机,怎么办?

    还有有些主机可能经常要移动,这就意味着要提供灵活的重新分配地址的机制,不然人工操作相当麻烦。

    再有有些系统,可能不仅仅需要配置某个网卡的地址,还需要配置出口网关地址,DNS 域名服务器地址等等,这同样面临操作成本的问题。

    最后相比程序化的机器,人是最容易出错的,如果不小心操作不当,那可能会面临严重的 IT 事故。

    因此,急需一个程序(协议)来自动化完成这件事,这就是 DHCP 必然存在的原因。

    03 DHCP 的工作机制

    DHCP 协议以 C/S 的方式进行工作。现在的操作系统的协议栈中都是包含 DHCP 功能的,当你的主机启动时,它就是一台 DHCP 客户端,会向当前局域网内的 DHCP 服务器获取 IP 地址等网络信息。

    DHCP 服务器为了能够正确分发 IP 地址,需要完成两方面的内容:

    • IP 地址管理:包括维护 IP 地址池、IP 地址租约管理等

    • 配置数据交付:包括 DHCP 协议的消息格式和状态机处理等

    IP 地址管理

    DHCP 服务器通常会维护两张表:IP 地址池表和租约表(通常保存在持久性存储器中,比如非易失性内存或磁盘中)。

    IP 地址池表是专门为 DHCP 用途而分配的一个连续的 IP 地址范围,我们可以在开启 DHCP 服务的主机上看到,大概像这样:

    #cat /etc/dhcp/dhcpd.conf
    subnet 10.10.0.0 netmask 255.255.0.0 {
      range 10.10.0.2 10.10.0.254;
      option routers 10.10.0.1;
    }

    所有新的客户端请求都会从 IP 地址池表中选择一个地址作为响应,等到确定该地址可以给某个客户端使用时,将其加入租约表中进行管理。

    租约表主要维护已分配地址的租约时间。DHCP 协议规定每个地址都有一定的租约周期要求,要不然这个地址池分分钟就被耗尽了。有了租约时间,DHCP 服务器就可以动态地管理自己所管辖范围内的所有主机的进进出出,就像去餐厅吃饭,位置就那么几个,但是服务的客流量可能很大。

    租约时间可以从几分钟到几天或更长时间。租约时间的长短各有利弊,时间较长,会较快耗尽可用的地址池,但却提供稳定的地址和减少网络开销(因为续租请求较少);反之亦然。所以,确定租约时间的最佳值需要对预期客户数、地址池大小和地址稳定性等因素进行权衡。常见的默认值包括 12~24 小时 。而微软则建议较小的网络采用 8 天 ,较大的网络采用 16~24 天

    客户端在租约时间 过半时 需要向服务端尝试续订租约,服务端在确定本次续约成功后,也会更新相关的租约信息。

    为了更好地给用户体验,很多系统都会提供配置 DHCP 地址池的界面:

    配置数据交付

    DHCP 客户端和服务端通过数据交互来完成地址的分配和租约更新。这些消息有不同的格式和作用,双方会根据收到的不同消息,进入不同的状态进行处理。

    总的来说,包括以下 8 种消息:

    • DHCP DISCOVER

    • DHCP OFFER

    • DHCP REQUEST

    • DHCP ACK

    • DHCP NAK

    • DHCP RELEASE

    • DHCP DECLINE

    • DHCP INFORM

    那这 8 种消息是如何进行交互来分配 IP 地址的呢?下面就来一探究竟。

    04 DHCP 如何分配地址(消息交互流程)

    如下图,是客户端接入网络时发生的消息交互流程:

    ① 客户端初始请求 DHCP 服务器:发送 DHCP DISCOVER 包

    当 DHCP Client 第一次启动接入网络时,此时还没有 IP 地址,它就向网络当中所有的 DHCP Server 发送一个 DCHP DISCOVER 的广播包。其中包的源目的端口分别是 67、68(DHCP 基于 UDP 协议,使用 UDP 67、68 端口来指代客户端和服务端);源目的 IP 地址分别是 0.0.0.0255.255.255.255;然后包的内容会包含标识客户端的 MAC 地址和主机名等信息。(等于向网络传达:我是新人,谁能给我分配个 IP)。

    DHCP DISCOVER 消息有超时时间限制,默认是 1s。如果包发出去,在 1s 之内没有得到回应,就会发第二次,还是没有回应,就继续发,一共会发 四次,以 2、4、8、16s 为时间间隔。

    如果 四次之后还是没有得到 DHCP Server 的回应,Client 就会从 169.254.0.0/16 这个自动保留的私有 IP 地址域中选用一个 IP 地址。同时它还会继续向服务端请求,每隔 5min 请求一次,如果收到Server 响应了,就选用响应的地址。

    ② 服务端响应 IP 地址租用:发送 DHCP OFFER 包

    网络中可能存在着多台 DHCP Server ,它们都会收到 DHCP DISCOVER 包,然后从自身维护的 IP 地址池中根据一定的规则选择一个可用的 IP 地址(比如看是否有 IP 之前分配给该 Client,如没有,则选择一个最小可用的 IP ),并发送 DHCP OFFER 广播包。其中,包的源目的端口号分别为 68、67,源 IP 为该 Server 的 IP,目的 IP 仍然为广播地址,包的内容包含 IP 地址、子网掩码、租约时间以及其他配置信息(如网关、DNS 服务器等)。(等于告诉 Client:我这有可用的地址,你可以使用)。

    同时,DHCP Server 会为此 Client 保留为它提供的 IP 地址信息,不让其他 Client 分配此 IP。

    ③ 客户端进行 IP 地址租约:发送 DHCP REQUEST 包

    Client 可能会收到多台 DHCP Server 的响应,它会按照一定的规则选择一个 DHCP OFFER(一般是先到达的那个)。这个时候 Client 还不能使用这个 DHCP OFFER 提供的 IP,因为网络中其他的 DHCP Server 还不知情,所以 Client 会再发一个 DHCP REQUEST 广播包,一方面是告诉它接受 IP 的 DHCP Server:我打算用你分配的 IP 了,另一方面也是告诉其他 DHCP Server,我已经接受了别人分配的 IP,你们给我分配的 IP 可以撤销了。

    其中,包的源 IP 仍然是 0.0.0.0,因为还没有得到 DHCP Server 的确认,包的内容包含 Client 的 MAC 地址、接受租约的 IP 地址以及提供此租约的 DHCP Server 的地址等信息。

    DHCP REQUEST 包除了以上初始化的过程用到,在整个地址租约生命周期内都会用到,比如租约更新、重新分配等等,不过在租约更新过程中使用的是单播包,因为这个时候 Server 的地址是明确的,也不需要告知其他 Server。

    ④ 服务端对 IP 租约进行确认:发送 DHCP ACK 包

    当被 Client 接受的 DHCP Server 收到 DHCP REQUEST 包时,会根据 REQUEST 包中携带的 Client 的 MAC 来查找是否有相应的租约记录,如果有则广播一个 DHCP ACK 包,仍然还是广播,因为 Client 的地址还是未知的。其中,包的内容包含分配的 IP 地址、租约时间等确定的信息。

    当 Client 收到包之后,并不会立马使用,详细解释见 DHCP DECLINE 包的部分。

    ⑤ 服务端拒绝本次租约:发送 DHCP NAK 包

    DHCP Server 可能存在这种情况:待分配的 IP 无法使用了,或者与 DHCP Client 的 MAC 无法对应,这个时候,DHCP Server 就会发送 DHCP  NAK 包给 Client,表示:这个 IP 目前异常,不能分配给你了。

    ⑥ 客户端不再使用该 IP 地址,发送 DHCP RELEASE 包

    但 Client 不再使用已分配的 IP 地址时,会主动向 DHCP Server 发送一个 DHCP RELEASE 的单播包,告诉 Server 我不再使用该地址了,你可以释放相关的租约信息了。

    ⑦ 客户端发现地址冲突不可用,发送 DHCP DECLINE 包

    在 Client 收到 DHCP ACK 包之后,它并不会立即就使用。因为网络当中可能存在多台 Client 同时在请求地址,这势必会造成信息的不同步,也就是说可能当前 Client 分配的 IP 可能被其他 Client 分配了。

    所以当前 Client 收到 ACK 包之后,会通过发送 ARP 请求来检查地址是否冲突(会发送三次 ARP),如果出现冲突了,表明该地址不能使用了,遂向 DHCP Server 发送 DHCP DECLINE 的单播包,并重新进入 DHCP DISCOVER 的流程。DHCP Server 端也会显示该 IP 地址为 BAD_ADDRESS,避免被再次分配。

    ⑧ 客户端想获取除 IP 外更为详细的网络信息,发送 DHCP INFORM 包

    以上所有的包类型,一般只是针对主机的 IP 地址进行分配,当然,DHCP 是可以提供更多的网络信息的,比如网关地址、DNS 服务器地址等等,这些信息一般就是通过 DHCP INFORM 消息单独获得,当 DHCP Server 收到该报文时,会查询相关的租约信息,找到相应的配置信息后,发送 DHCP ACK 报文给到 Client。

    OK,以上就是 8 种消息的交互流程,及可能出现的场景,有些消息通过抓包一探了究竟,下面看看报文格式具体长啥样,让大家有更直观的认识。

    05 DHCP 报文格式长啥样

    DHCP 有一个前身协议,叫 BOOTP,DHCP 扩展了 BOOTP 的报文格式。BOOTP 是最早用于分配 IP 地址的协议,常用于无盘工作站的局域网中。DHCP 为了和它保持兼容,就选择在它的基础上进行扩展。

    其中:

    • Op:分别表示请求(1)or 应答(2)

    • HW 类型:二层类型值,比如以太网,值为 1

    • HW 长度:表示硬件(MAC)地址的长度,以太网值为6

    • 跳步数:记录消息传输过程中的中继次数,发送方将该值置为 0,每次中继时递增

    • 事务ID:Client 产生的一个随机数,用于标识当前的事务,Server 响应时需要携带同样的 ID,将请求和响应进行匹配

    • 秒数:Client 进行设置,表示第一次尝试申请或重新申请地址经过的秒数,用于地址租约

    • 标志:广播标志,表示 Client 只能处理广播包

    • ciaddr:Client IP 地址,如果未知,就是 0.0.0.0

    • yiaddr:“你的”IP 地址,Server 向 Client 提供的 IP 地址

    • siaddr:(下一)服务器 IP 地址,这个用于 Client 的自举过程

    • giaddr:网关(中继)IP 地址,这个地址一般由 DHCP 中继填写(如果有),它们在转发 DHCP 消息时填写

    • chaddr:Client 硬件地址,标识一个唯一的 Client,Server 利用它可以为同一个 Client 每次的请求分配同一个 IP 地址

    • sname:服务器名,非必须填写,可附到 options 字段中

    • bootfile:引导文件名,非必须填写,可附到 options 字段中

    • options:选项字段,长度可变,有多种选项,其中选项 53 就用于标识上述的各种消息

    常见的选项有:

    填充(0)、子网掩码(1)、路由器地址(3)、域名服务器(6)、域名(15)、请求的 IP 地址(50)、地址租用期(51)、 DHCP 消息类型(53) 、服务器标识符(54)、DHCP 错误消息(56)、租约更新时间(58)、租约重新绑定时间(59)、客户机标识符(61)和结束(255)。

    其中,DHCP 消息类型(53)就指代上面提到的各种消息,如:DHCP DISCOVER(1)、DHCP OFFER(2)、DHCP REQUEST(3)、DHCP DECLINE、(4)DHCP ACK(5)、DHCP NAK(6)、DHCP RELEASE(7)、DHCP INFORM(8)等。

    06 DHCP 中继

    DHCP 消息交互过程中,全程都是使用的 UDP 广播通信。这就问题来了:

    如果 DHCP 服务器和客户端不是在同一个子网内,而路由器又不能转发广播包,这个时候该怎么办呢?难道每个子网都要配一个 DHCP 服务器吗?这显然不合常理。

    为了解决这一问题,就出现了 DHCP 中继代理。

    DHCP 中继解决了跨越多个网段申请 IP 地址的问题,对不同网段的 IP 地址分配可以只由一个 DHCP 服务器进行统一管理和运维。

    每个网段可以设置一个 DHCP 中继(可以在路由器上设或者直接在主机上配置),它可以配置 DHCP 服务器的地址,这样通过中继代理即可完成和 DHCP 服务器之间的交互(通过选项字段来标识 DHCP 中继的信息)。

    具体地,当 DHCP 中继收到 DHCP Client 发来的广播请求包(DHCP 只中继广播包),由于事先配置好了 DHCP Server 的地址,所以 DHCP 中继发送单播包给到 DHCP  Server,Server 收到包之后再向 DHCP 中继响应,由于之前 DHCP 中继接收请求包时已经记录下 Client 的 MAC 地址,所以这时直接将包转发给 DHCP Client。

    由此,通过 DHCP 中继即可完成了跨不同网络的 IP 地址申请(实际上,DHCP 中继远比上面描述的要复杂,比如二层中继和三层中继等,大家有兴趣可以进一步查阅相关资料了解)。

    07 DHCP 的问题

    一定程度上说,DHCP  服务器就是个活雷锋,为网络上的设备提供公共服务,掌握了很大的公共权力,一些黑客就比较青睐这种角色,如果攻陷了 DHCP 服务器,自己也相应获取了 DHCP 服务器的权力。

    比较典型的攻击还是泛洪攻击,攻击者可以不断发出 DHCP 请求,冒充新入网的客户端,这样,DHCP 服务器的地址池就会被耗干,无法为正常的用户提供服务。接着攻击者可能继续下连环套,从 DHCP 服务器骗取了大量 IP 地址,自己就可以装扮成新的 DHCP 服务器,将骗来的地址分配给 DHCP 客户端,从而控制客户端。

    进一步,还有更危险的,因为 DHCP 还能提供其他的网络信息,比如 DNS 服务器地址和网关地址,攻击者就可以让自己成为 DNS 服务器或者网关,于是,客户端的域名解析和外网通信,都必须经过攻击者的电脑。这个时候,攻击者的权限就很大了,它可以偷听通信、伪装、假扮成某个域名的网站,比如说,攻击者可以篡改域名解析,让你在访问 www.baidu.com 的时候,实际上访问的是攻击者提供的一个网页。当你在这个网页上输入用户名和密码时,信息就会泄露给攻击者。

    DHCP 攻击让人防不胜防。DHCP 协议在设计中并没有考虑到安全性的问题,所以很难从软件上杜绝 DHCP 攻击。某些品牌的交换机上,可以指定特定端口给合法的DHCP 服务器,以免其他人伪装。当然,最重要的保护方式,还是防止攻击者连入局域网。

    08 DHCP 使用到了哪些工具

    首先是 Windows 上的工具,主要是 ipconfig

    • ipconfig /all 查看 DHCP 分配到的所有网络信息

    • ipconfig /release 释放 DHCP 租约

    • ipconfig /renew 获取/更新 DHCP 租约

    Linux 上,主要是 dhclient 工具:

    • dhclient 获取/更新 DHCP 租约

    • dhclient -r 释放 DHCP 租约

    09 总结

    本文从 DHCP 的工作机制、报文格式、交互的消息报文到 DHCP 中继、存在的问题,再到用户可以用到的配置工具,全面地介绍了 DHCP 协议。DHCP 是针对的 IPv4 地址,IPv6 则是 DHCPv6,和 DHCP 有些许的不同,这块就留作后面的文章再来讲解。


    参考:

    极客时间《趣谈网络协议专栏》

    《TCP/IP 协议详解卷一》

    https://mp.weixin.qq.com/s/RC5usdL7SkAzck10H8vSM

    后台回复“加群”,带你进入高手如云交流群
    
    
    推荐阅读:
    不想装系统?这8个网站让你在线体验 Linux
    
    10个工具搞定Linux性能分析
    
    11个步骤完美排查Linux机器是否已经被入侵
    
    超赞,极客时间竟然可以免费学了
    
    HTTP/3 原理实战
    
    Linux 下10个帮助你调试的命令
    
    Nginx为什么快到根本停不下来?
    
    OVS 和 OVS-DPDK 对比
    
    微软出品的最新K8S学习指南3.0下载
    了解HTTPS工作原理,看这一篇就够了
    值得收藏的14个Linux下CPU监控工具
    
    Linux 硬盘结构长啥样,了解一下
    
    谨慎使用的 Linux 命令
    
    史上最硬核的Linux依赖问题解决方案
    一文搞懂HTTP+TCP的长连接和短连接
    
    正确理解CPU使用率和平均负载的关系
    
    和面试官之间关于操作系统的一场对弈
    
    Linux 系统 UDP 丢包问题分析思路
    ▼
    
    喜欢,就给我一个“在看”
    
    10T 技术资源大放送!包括但不限于:云计算、虚拟化、微服务、大数据、网络、Linux、Docker、Kubernetes、Python、Go、C/C++、Shell、PPT 等。在公众号内回复「1024」,即可免费获取!!
    
    展开全文
  • DHCP 是啥 为啥需要 DHCP DHCP 的工作机制 DHCP 如何分配地址 DHCP 报文格式长啥样 DHCP 中继是啥 DHCP 有什么问题 DHCP 使用到哪些工具 下面我们就带着这些问题,来一探究竟...

    对于 DHCP 协议,你可能想知道以下几个问题:

    • DHCP 是啥

    • 为啥需要 DHCP

    • DHCP 的工作机制

    • DHCP 如何分配地址

    • DHCP 报文格式长啥样

    • DHCP 中继是啥

    • DHCP 有什么问题

    • DHCP 使用到哪些工具

    下面我们就带着这些问题,来一探究竟。

    01 DHCP 是啥

    DHCP 全称是 Dynamic Host Configuration Protocol,动态主机配置协议,主要用来给主机配置 IP 地址等网络信息的。IP 地址可以手动配(用 ifconfig/ipconfig/ip addr 等工具),也可以自动配,自动配就通过 DHCP 这个协议来完成,IPv6 有对应的 DHCPv6 协议。

    02 为啥需要 DHCP

    首先当然是方便了,手动配一台可以,如果让你去配一个数据中心所有的主机,怎么办?

    还有有些主机可能经常要移动,这就意味着要提供灵活的重新分配地址的机制,不然人工操作相当麻烦。

    再有有些系统,可能不仅仅需要配置某个网卡的地址,还需要配置出口网关地址,DNS 域名服务器地址等等,这同样面临操作成本的问题。

    最后相比程序化的机器,人是最容易出错的,如果不小心操作不当,那可能会面临严重的 IT 事故。

    因此,急需一个程序(协议)来自动化完成这件事,这就是 DHCP 必然存在的原因。

    03 DHCP 的工作机制

    DHCP 协议以 C/S 的方式进行工作。现在的操作系统的协议栈中都是包含 DHCP 功能的,当你的主机启动时,它就是一台 DHCP 客户端,会向当前局域网内的 DHCP 服务器获取 IP 地址等网络信息。

    DHCP 服务器为了能够正确分发 IP 地址,需要完成两方面的内容:

    • IP 地址管理:包括维护 IP 地址池、IP 地址租约管理等

    • 配置数据交付:包括 DHCP 协议的消息格式和状态机处理等

    IP 地址管理

    DHCP 服务器通常会维护两张表:IP 地址池表和租约表(通常保存在持久性存储器中,比如非易失性内存或磁盘中)。

    IP 地址池表是专门为 DHCP 用途而分配的一个连续的 IP 地址范围,我们可以在开启 DHCP 服务的主机上看到,大概像这样:

    #cat /etc/dhcp/dhcpd.conf
    subnet 10.10.0.0 netmask 255.255.0.0 {
    range 10.10.0.2 10.10.0.254;
    option routers 10.10.0.1;
    }

    所有新的客户端请求都会从 IP 地址池表中选择一个地址作为响应,等到确定该地址可以给某个客户端使用时,将其加入租约表中进行管理。

    租约表主要维护已分配地址的租约时间。DHCP 协议规定每个地址都有一定的租约周期要求,要不然这个地址池分分钟就被耗尽了。有了租约时间,DHCP 服务器就可以动态地管理自己所管辖范围内的所有主机的进进出出,就像去餐厅吃饭,位置就那么几个,但是服务的客流量可能很大。

    租约时间可以从几分钟到几天或更长时间。租约时间的长短各有利弊,时间较长,会较快耗尽可用的地址池,但却提供稳定的地址和减少网络开销(因为续租请求较少);反之亦然。所以,确定租约时间的最佳值需要对预期客户数、地址池大小和地址稳定性等因素进行权衡。常见的默认值包括 12~24 小时 。而微软则建议较小的网络采用 8 天 ,较大的网络采用 16~24 天

    客户端在租约时间 过半时 需要向服务端尝试续订租约,服务端在确定本次续约成功后,也会更新相关的租约信息。

    为了更好地给用户体验,很多系统都会提供配置 DHCP 地址池的界面:

    配置数据交付

    DHCP 客户端和服务端通过数据交互来完成地址的分配和租约更新。这些消息有不同的格式和作用,双方会根据收到的不同消息,进入不同的状态进行处理。

    总的来说,包括以下 8 种消息:

    • DHCP DISCOVER

    • DHCP OFFER

    • DHCP REQUEST

    • DHCP ACK

    • DHCP NAK

    • DHCP RELEASE

    • DHCP DECLINE

    • DHCP INFORM

    那这 8 种消息是如何进行交互来分配 IP 地址的呢?下面就来一探究竟。

    04 DHCP 如何分配地址(消息交互流程)

    如下图,是客户端接入网络时发生的消息交互流程:

    ① 客户端初始请求 DHCP 服务器:发送 DHCP DISCOVER 包

    当 DHCP Client 第一次启动接入网络时,此时还没有 IP 地址,它就向网络当中所有的 DHCP Server 发送一个 DCHP DISCOVER 的广播包。其中包的源目的端口分别是 67、68(DHCP 基于 UDP 协议,使用 UDP 67、68 端口来指代客户端和服务端);源目的 IP 地址分别是 0.0.0.0255.255.255.255;然后包的内容会包含标识客户端的 MAC 地址和主机名等信息。(等于向网络传达:我是新人,谁能给我分配个 IP)。

    DHCP DISCOVER 消息有超时时间限制,默认是 1s。如果包发出去,在 1s 之内没有得到回应,就会发第二次,还是没有回应,就继续发,一共会发 四次,以 2、4、8、16s 为时间间隔。

    如果 四次之后还是没有得到 DHCP Server 的回应,Client 就会从 169.254.0.0/16 这个自动保留的私有 IP 地址域中选用一个 IP 地址。同时它还会继续向服务端请求,每隔 5min 请求一次,如果收到Server 响应了,就选用响应的地址。

    ② 服务端响应 IP 地址租用:发送 DHCP OFFER 包

    网络中可能存在着多台 DHCP Server ,它们都会收到 DHCP DISCOVER 包,然后从自身维护的 IP 地址池中根据一定的规则选择一个可用的 IP 地址(比如看是否有 IP 之前分配给该 Client,如没有,则选择一个最小可用的 IP ),并发送 DHCP OFFER 广播包。其中,包的源目的端口号分别为 68、67,源 IP 为该 Server 的 IP,目的 IP 仍然为广播地址,包的内容包含 IP 地址、子网掩码、租约时间以及其他配置信息(如网关、DNS 服务器等)。(等于告诉 Client:我这有可用的地址,你可以使用)。

    同时,DHCP Server 会为此 Client 保留为它提供的 IP 地址信息,不让其他 Client 分配此 IP。

    ③ 客户端进行 IP 地址租约:发送 DHCP REQUEST 包

    Client 可能会收到多台 DHCP Server 的响应,它会按照一定的规则选择一个 DHCP OFFER(一般是先到达的那个)。这个时候 Client 还不能使用这个 DHCP OFFER 提供的 IP,因为网络中其他的 DHCP Server 还不知情,所以 Client 会再发一个 DHCP REQUEST 广播包,一方面是告诉它接受 IP 的 DHCP Server:我打算用你分配的 IP 了,另一方面也是告诉其他 DHCP Server,我已经接受了别人分配的 IP,你们给我分配的 IP 可以撤销了。

    其中,包的源 IP 仍然是 0.0.0.0,因为还没有得到 DHCP Server 的确认,包的内容包含 Client 的 MAC 地址、接受租约的 IP 地址以及提供此租约的 DHCP Server 的地址等信息。

    DHCP REQUEST 包除了以上初始化的过程用到,在整个地址租约生命周期内都会用到,比如租约更新、重新分配等等,不过在租约更新过程中使用的是单播包,因为这个时候 Server 的地址是明确的,也不需要告知其他 Server。

    ④ 服务端对 IP 租约进行确认:发送 DHCP ACK 包

    当被 Client 接受的 DHCP Server 收到 DHCP REQUEST 包时,会根据 REQUEST 包中携带的 Client 的 MAC 来查找是否有相应的租约记录,如果有则广播一个 DHCP ACK 包,仍然还是广播,因为 Client 的地址还是未知的。其中,包的内容包含分配的 IP 地址、租约时间等确定的信息。

    当 Client 收到包之后,并不会立马使用,详细解释见 DHCP DECLINE 包的部分。

    ⑤ 服务端拒绝本次租约:发送 DHCP NAK 包

    DHCP Server 可能存在这种情况:待分配的 IP 无法使用了,或者与 DHCP Client 的 MAC 无法对应,这个时候,DHCP Server 就会发送 DHCP  NAK 包给 Client,表示:这个 IP 目前异常,不能分配给你了。

    ⑥ 客户端不再使用该 IP 地址,发送 DHCP RELEASE 包

    但 Client 不再使用已分配的 IP 地址时,会主动向 DHCP Server 发送一个 DHCP RELEASE 的单播包,告诉 Server 我不再使用该地址了,你可以释放相关的租约信息了。

    ⑦ 客户端发现地址冲突不可用,发送 DHCP DECLINE 包

    在 Client 收到 DHCP ACK 包之后,它并不会立即就使用。因为网络当中可能存在多台 Client 同时在请求地址,这势必会造成信息的不同步,也就是说可能当前 Client 分配的 IP 可能被其他 Client 分配了。

    所以当前 Client 收到 ACK 包之后,会通过发送 ARP 请求来检查地址是否冲突(会发送三次 ARP),如果出现冲突了,表明该地址不能使用了,遂向 DHCP Server 发送 DHCP DECLINE 的单播包,并重新进入 DHCP DISCOVER 的流程。DHCP Server 端也会显示该 IP 地址为 BAD_ADDRESS,避免被再次分配。

    ⑧ 客户端想获取除 IP 外更为详细的网络信息,发送 DHCP INFORM 包

    以上所有的包类型,一般只是针对主机的 IP 地址进行分配,当然,DHCP 是可以提供更多的网络信息的,比如网关地址、DNS 服务器地址等等,这些信息一般就是通过 DHCP INFORM 消息单独获得,当 DHCP Server 收到该报文时,会查询相关的租约信息,找到相应的配置信息后,发送 DHCP ACK 报文给到 Client。

    OK,以上就是 8 种消息的交互流程,及可能出现的场景,有些消息通过抓包一探了究竟,下面看看报文格式具体长啥样,让大家有更直观的认识。

    05 DHCP 报文格式长啥样

    DHCP 有一个前身协议,叫 BOOTP,DHCP 扩展了 BOOTP 的报文格式。BOOTP 是最早用于分配 IP 地址的协议,常用于无盘工作站的局域网中。DHCP 为了和它保持兼容,就选择在它的基础上进行扩展。

    其中:

    • Op:分别表示请求(1)or 应答(2)

    • HW 类型:二层类型值,比如以太网,值为 1

    • HW 长度:表示硬件(MAC)地址的长度,以太网值为6

    • 跳步数:记录消息传输过程中的中继次数,发送方将该值置为 0,每次中继时递增

    • 事务ID:Client 产生的一个随机数,用于标识当前的事务,Server 响应时需要携带同样的 ID,将请求和响应进行匹配

    • 秒数:Client 进行设置,表示第一次尝试申请或重新申请地址经过的秒数,用于地址租约

    • 标志:广播标志,表示 Client 只能处理广播包

    • ciaddr:Client IP 地址,如果未知,就是 0.0.0.0

    • yiaddr:“你的”IP 地址,Server 向 Client 提供的 IP 地址

    • siaddr:(下一)服务器 IP 地址,这个用于 Client 的自举过程

    • giaddr:网关(中继)IP 地址,这个地址一般由 DHCP 中继填写(如果有),它们在转发 DHCP 消息时填写

    • chaddr:Client 硬件地址,标识一个唯一的 Client,Server 利用它可以为同一个 Client 每次的请求分配同一个 IP 地址

    • sname:服务器名,非必须填写,可附到 options 字段中

    • bootfile:引导文件名,非必须填写,可附到 options 字段中

    • options:选项字段,长度可变,有多种选项,其中选项 53 就用于标识上述的各种消息

    常见的选项有:

    填充(0)、子网掩码(1)、路由器地址(3)、域名服务器(6)、域名(15)、请求的 IP 地址(50)、地址租用期(51)、 DHCP 消息类型(53) 、服务器标识符(54)、DHCP 错误消息(56)、租约更新时间(58)、租约重新绑定时间(59)、客户机标识符(61)和结束(255)。

    其中,DHCP 消息类型(53)就指代上面提到的各种消息,如:DHCP DISCOVER(1)、DHCP OFFER(2)、DHCP REQUEST(3)、DHCP DECLINE、(4)DHCP ACK(5)、DHCP NAK(6)、DHCP RELEASE(7)、DHCP INFORM(8)等。

     

    06 DHCP 中继

    DHCP 消息交互过程中,全程都是使用的 UDP 广播通信。这就问题来了:

    如果 DHCP 服务器和客户端不是在同一个子网内,而路由器又不能转发广播包,这个时候该怎么办呢?难道每个子网都要配一个 DHCP 服务器吗?这显然不合常理。

    为了解决这一问题,就出现了 DHCP 中继代理。

    DHCP 中继解决了跨越多个网段申请 IP 地址的问题,对不同网段的 IP 地址分配可以只由一个 DHCP 服务器进行统一管理和运维。

    每个网段可以设置一个 DHCP 中继(可以在路由器上设或者直接在主机上配置),它可以配置 DHCP 服务器的地址,这样通过中继代理即可完成和 DHCP 服务器之间的交互(通过选项字段来标识 DHCP 中继的信息)。

    具体地,当 DHCP 中继收到 DHCP Client 发来的广播请求包(DHCP 只中继广播包),由于事先配置好了 DHCP Server 的地址,所以 DHCP 中继发送单播包给到 DHCP  Server,Server 收到包之后再向 DHCP 中继响应,由于之前 DHCP 中继接收请求包时已经记录下 Client 的 MAC 地址,所以这时直接将包转发给 DHCP Client。

    由此,通过 DHCP 中继即可完成了跨不同网络的 IP 地址申请(实际上,DHCP 中继远比上面描述的要复杂,比如二层中继和三层中继等,大家有兴趣可以进一步查阅相关资料了解)。

     

    07 DHCP 的问题

    一定程度上说,DHCP  服务器就是个活雷锋,为网络上的设备提供公共服务,掌握了很大的公共权力,一些黑客就比较青睐这种角色,如果攻陷了 DHCP 服务器,自己也相应获取了 DHCP 服务器的权力。

    比较典型的攻击还是泛洪攻击,攻击者可以不断发出 DHCP 请求,冒充新入网的客户端,这样,DHCP 服务器的地址池就会被耗干,无法为正常的用户提供服务。接着攻击者可能继续下连环套,从 DHCP 服务器骗取了大量 IP 地址,自己就可以装扮成新的 DHCP 服务器,将骗来的地址分配给 DHCP 客户端,从而控制客户端。

    进一步,还有更危险的,因为 DHCP 还能提供其他的网络信息,比如 DNS 服务器地址和网关地址,攻击者就可以让自己成为 DNS 服务器或者网关,于是,客户端的域名解析和外网通信,都必须经过攻击者的电脑。这个时候,攻击者的权限就很大了,它可以偷听通信、伪装、假扮成某个域名的网站,比如说,攻击者可以篡改域名解析,让你在访问 www.baidu.com 的时候,实际上访问的是攻击者提供的一个网页。当你在这个网页上输入用户名和密码时,信息就会泄露给攻击者。

    DHCP 攻击让人防不胜防。DHCP 协议在设计中并没有考虑到安全性的问题,所以很难从软件上杜绝 DHCP 攻击。某些品牌的交换机上,可以指定特定端口给合法的DHCP 服务器,以免其他人伪装。当然,最重要的保护方式,还是防止攻击者连入局域网。

    08 DHCP 使用到了哪些工具

    首先是 Windows 上的工具,主要是 ipconfig

    • ipconfig /all 查看 DHCP 分配到的所有网络信息

    • ipconfig /release 释放 DHCP 租约

    • ipconfig /renew 获取/更新 DHCP 租约

    Linux 上,主要是 dhclient 工具:

    • dhclient 获取/更新 DHCP 租约

    • dhclient -r 释放 DHCP 租约

    展开全文
  • DHCP原理

    2019-05-28 14:29:47
    这几天面试经常被问起DHCP的原理 1. 啥是DHCPDHCP 全称Dynamic Host configurati...

    这几天面试经常被问起DHCP的原理

     

    1.     啥是DHCP?

    DHCP 全称Dynamic Host configuration protocol, 动态主机配置协议。 它可以为客户机自动分配IP地址、子网掩码以及缺省网关、DNS服务器的IP地址等TCP/IP参数, 简单来说, 就是在DHCP服务器上有一个数据库, 存放着IP地址、网关、DNS等参数。 当客户端请求使用时, 服务器则负责将相应的参数分配个客户端,避免客户端手动指定IP地址等。特别是在一些大规模的网络中。客户端数目较多,使用DHCP可以方便对这些机器进行管理,为客户机提供TCP/IP参数配置,如IP地址、网关地址和DNS服务器等,不仅效率高,而且不存在IP地址冲突的情况现在的无线路由器默认都带有DHCP功能,也就是说一个无线路由器同时也是一个DHCP服务器。

    2.     他的原理或者说是怎么工作的?

     

     

           DHCP DISCOVER: 寻找 DHCP服务

    当DHCP客户端第一次登录网络的时候或者是开机的时候, 此设备发现本机上没有任何IP设定,就会网络广播去寻找DHCP服务器。网络上每一台安装了TCP/IP协议的主机都会接收到这种广播信息,但只有DHCP服务器才会做出响应。

         DHCP OFFER: 分配IP地址

    DHCP 服务器监听到客户端发出的 DHCP Discover 广播后, 会针对这个客户端的硬件地址 (MAC) 与本身的设定数据来进行下列工作:

    1. 到服务器的登录文件中寻找该用户之前是否曾经用过某个 IP ,若有且该 IP 目前无人使用,则提供此 IP 给客户机;

    2. 若配置文件针对该 MAC 提供额外的固定 IP (static IP) 时,则提供该固定 IP 给客户机;

    3. 若不符合上述两个条件, 则随机取用目前没有被使用的 IP 参数给客户端,并记录下来。回应给客户端一个DHCP OFFER封包,由于客户端在开始的时候还没有IP地址﹐所以在其DHCP Discover封包内会带有其MAC地址信息﹐并且有一个XID编号来辨别该封包﹐DHCP服务器回应的DHCP Offer封包则会根据这些资料传递给要求租约的客户。根据服务器端的设定﹐DHCP Offer封包会包含一个租约期限的信息。但这里仅仅是分配, 客户端还没有真正的使用

    DHCP REQUEST: 请求使用

    如果客户端收到网路上多台DHCP服务器的回应﹐只会挑选其中一个DHCP Offer(通常是最先抵达的那个)并且向网路发送一个DHCP Request广播封包,告诉所有DHCP服务器它将指定接受哪一台服务器提供的IP位址。之所以要以广播方式回答,是为了通知所有的DHCP服务器,他将选择某台DHCP服务器所提供的IP地址, 同时,客户端还会发送一个ARP封包, 查询网路上有没有其他机器使用该IP地址, 如果发现该IP被占用, 客户端会发送一个DHCP Decline封包给DHCP服务器, 拒绝接受其DHCP Offer,并重新开始发送DHCP Discover信息。

         DHCP ACK  IP 地址分配确认

    当DHCP服务器收到DHCP客户机回答的DHCP Request请求信息之后, 它便向DHCP客户机发送一个包含它所提供的IP地址和其他设置的DHCP Ack确认信息。以确认IP地址的正式生效。然后DHCP客户机便将其TCP/IP协议与网卡绑定,另外,除DHCP客户机选中的服务器外,其他的DHCP服务器都将收回之前提供的IP地址。


    来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/31442725/viewspace-2645914/,如需转载,请注明出处,否则将追究法律责任。

    转载于:http://blog.itpub.net/31442725/viewspace-2645914/

    展开全文
  • DHCP其他

    2017-08-24 22:53:34
    1.DHCP SERVER给终端的响应报文...2.discover包为啥是广播形式 当终端发出DHCP请求报文,它并不知道DHCP SERVER的IP地址,因此IP头中的DstIp填为有限的子网广播IP——全1(广播),以保证DHCP SERVER的IP协议栈不丢弃

    1.DHCP SERVER给终端的响应报文是广播还是单播,一般都是广播形式:

    这个是由DHCP DISCOVER数据包中相关的标志位决定。见DHCP之数据包


    2.discover包为啥是广播形式

    当终端发出DHCP请求报文,它并不知道DHCP SERVER的IP地址,因此IP头中的DstIp填为有限的子网广播IP——全1(广播),以保证DHCP SERVER的IP协议栈不丢弃这个报文。


    3.客户IP租用更新报文
    (1)在当前租期已过去50%时,DHCP客户机直接向为其提供IP地址的DHCP服务器发 送DHCPREQUEST消息包。如果客户机接收到该服务器回应的DHCPACK消息包,客户机就根据包中所提供的新的租期以及其它已经更新的 TCP/IP参数,更新自己的配置,IP租用更新完成。如果没收到该服务器的回复,则客户机继续使用现有的IP地址,因为当前租期还有50%。
    (2)如果在租期过去50%时未能成功更新,则客户机将在当前租期过去87.5%时再次向为其提供IP地址的DHCP联系。如果联系不成功,则重新开始IP租用过程。
    (3)如果DHCP客户机重新启动时,它将尝试更新上次关机时拥有的IP租用。如果更新未能 成功,客户机将尝试联系现有IP租用中列出的缺省网关。如果联系成功且租用尚未到期,客户机则认为自己仍然位于与它获得现有IP租用时相同的子网上(没有 被移走)继续使用现有IP地址。 如果未能与缺省网关联系成功,客户机则认为自己已经被移到不同的子网上,将会开始新一轮的IP租用过程。
      DHCP客户机在发出IP租用请求的DHCPDISCOVER广播包后,将花费1秒钟的 时间等待DHCP服务器的回应,如果1秒钟没有服务器的回应,它会将这一广播包重新广播四次(以2,4,8和16秒为间隔,加上1~1000毫秒之间随机 长度的时间)。四次之后,如果仍未能收到服务器的回应,则运行Windows 2000的DHCP客户机将从169.254.0.0/16这个自动保留的私有IP地址(APIPA)中选用一个IP地址,而运行其他操作系统的DHCP 客户机将无法获得IP地址。DHCP客户机仍然每隔5分钟重新广播一次,如果收到某个服务器的回应,则继续IP租用过程。


    4.DHCP状态机


    展开全文
  • 我个人建议开启DHCP,可是有些人又反问,为什么像电信、联通为什么不开启DHCP? 开启DHCP对用户来讲有一个看得到的好处就是:开机速度比较快。看不见的好处,我想有更多。 DHCP原理: 主机在网卡从DOWN状态变为...
  • [Router-Vlanif1] dhcp select interface 这个意思使用接口的ip作为网 例如你vlanif的ip192.168.100.1 那么下面下面的pc...这个是dhcp选择全局地址池,这个你要定义dhcp pool,具体的网关的需要你自己配置 ...
  • 网络分析实战-dhcp

    2019-07-07 23:56:12
    电脑拨号上网,它在PPP的NCP阶段就会配置IP,所以并不会用到DHCP。 所以就想着能不能用Linux,但百度真的不想说,搜索命令难如上青天,最终还是用手机热点capture ...
  • !... 我在没连网线的情况下:先是在cmd里面以管理员模式运行netsh i ipv4 set address "以太网" dhcp;再去查看以太网属性,结果还是显示IP不是dhcp。运行后提示已开启,但是打开本地连接的ip设置,却还是...这呢?
  • 一、动态主机配置协议(DHCPDHCP 指可以自动配置的协议方法 ...一台新机器加入一个网络情况都不知道只有自己的 MAC 地址,怎么办呢? 方式: 先“吼”一声(称为 DHCP Discover):我新来...
  • 解决思路:根据用户截图里的地址判断内网存在另一台DHCP服务器(因为公司统一用的 A类私网地址),需要找出这个DHCP服务器mac地址并禁掉. -------------------伪DHCP端处理---------------------------- 1>登陆...
  • dhcp的作用自动给电脑或手机分配ip地址,具体工作过程可以参考这个答案 0.0.0.0和255.255.255.255这两个IP地址到底有用?​www.zhihu.com 先说dhcp的优点,就是使用更加简单,配个地址池,一把梭,电脑就会...
  • DHCP(Dynamic Host Configuration Protocol) 动态主机配置协议 如果数据中心里面的服务器,IP 一旦配置好,基本不会变,...当一台机器新加入一个网络的时候,肯定一脸懵,情况都不知道,只知道自己的 MAC 地址...
  • DHCP(Dynamic Host Configure Protocol)动态主机配置协议,位于tcp/ip五层模型的第五层应用层,传输通道用的UDP,UDP保证了数据传输的速度,同时因为DHCP位于内网通信的范畴,保证数据的可靠性就显得很鸡肋了,...
  • dhcp, dns, ntp, kerberos, ssh

    千次阅读 2011-12-14 09:51:43
    【抛了三块砖,引来两床沙发。...一个局域网里头,机器正常开机最可能先接触的网络服务应该就是 DHCP 了,所以从它开刀很自然的了,搭配 FAI 还可以 PXE 安装系统,不过在局域网里试验 DHCP
  • Centos 7开启网卡打开DHCP自动获取IP Centos7默认安装没有开启配置网卡信息的, 也就是说都木有,无法访问外网; 直接打开网络功能自动获取ip吧,等centos7自动获取到IP后, 再通过终端登录程序编辑设置...
  • Centos7默认安装没有开启配置网卡信息的,也就是说都木有,无法访问外网;因为我本地安装,不想花费较长时间设置静态IP太慢,直接打开网络功能自动获取ip吧,快速简单又不浪费时间;等centos7自动获取到IP后,...
  • 项目六Linux在中小企业的应用(精;任务一 DNS服务器的安装与配置;任务二 DHCP服务器的安装与配置;任务三 Samba服务器的安装与配置;自主训练;此课件下载可自行编辑修改仅供参考 感谢您的支持我们努力做得更好谢谢
  • 实现的效果这样的,同时跑5个没问题,这俩图就是两个不一样的机器来的。 中间遇到好几个坑,自己一点一点排查的 开始步骤,没人看就当整理思路好了 第一步回忆一下内核启动顺序,BIOS之后,去到...
  • 接前一篇(STM32F4+LWIP+HTTP client... 关于啥是DNS域名解析,我自己也迷迷糊糊,就不过多介绍了。 代码说明: 1.dns_found 回调函数,将解析到的IP地址保存至变量HttpServerIPfromDNS; 2.void GetHttpS...
  • 要用无人值守安装系统?很简单的答案!就两个! 一个方便日常工作,另一个就是可以用来装逼! 常规装系统的办法有哪些? 光盘安装系统===>一个服务器DVD内置光驱百千块,百台服务器都配光驱就浪费...
  • 好吧,http是啥都不知道,慢慢来折腾。 第一步、首先实现http client连接服务器 经过一番请教及百度,大致了解了http连接服务器,其实可以看作tcp连接服务器的过程,tcp握手连接完成后,使用http规定的报文格式向...
  • 0.0.0.0 表示

    2016-02-22 10:43:59
    0.0.0.0为windows对所有未知ip的地址描述包括网卡dhcp的取得的地址pppoe的ip及其它非本机指定ip.0.0.0.0全零网络,代表默认网络,帮助路由器发送路由表中无法查询的包。如果设置了全零网络的路由,路由表中无法...
  • WWW, Mail,FTP, DNS, DHCP, NAT, Router等 架站容易,维护难,维护还好,除错更难。 3, 架设一部完美的服务器,基本功课包括: 基础网络的基本概念,以方便进行联网与设定及除错;熟悉操作系统的...
  • 如题,win7系统,其他机器都好好的,就这台不行,看了,RPC,DHCP服务都是开着的,是啥情况
  • 网关和网络运营商相连接的,故:为叫网关?因为想上网,一定得经过我这关。 2、NAT(网络地址转换) 路由器同时也一个DHCP服务器,以类比来说,路由器相当于就是一个国家的外交部长,如果国内的声音要想发送到...
  • 题记:对于很多人来说,没人打扰的时间真的很难得——而我就得到了这样的一天。...中间vmp取版本一个小插曲,但还是没找到对的版本,他们版本太多了,都。。wangzailei问了一个dhcp获取ip失败的问题,直接给
  • 169.254.0.0-169.254.255.255

    2020-04-10 10:24:00
    这个地址是啥呢,为啥pc一个要找它呢? 最后才想到是他开启了dhcp,但是在3层交换的ip pool里我给那个pc做了ip/mac绑定。 169.254.0.0-169.254.255.255这段是私有保留地址,一般开启了dhcp服务的设备但又无法...

空空如也

空空如也

1 2 3 4 5
收藏数 89
精华内容 35
关键字:

dhcp是啥