你的 ip 是谁分配的? DHCP实验+分析

dhcp 简介

如果网络里配置了路由器,与路由器连接的设备都需要分配一个 ip 才能访问路由器并且进行相互访问。因为路由器是三层设备,需要识别 ip 地址,而且需要有这个 ip 的路由规则,才知道怎么转发。所以新加入的设备必须要配置一个 ip 地址才行,而且 ip 地址和路由器的端口的 ip 地址是同一个网段。

如果让每一个设备都人工配置 ip,网关,dns,工作量会非常大且不及时。这时候 dhcp 就承担了分配 ip 的功能。dhcp 生成的 ip 称为动态 ip,相反手动配置的就是静态 ip 了。

使用 dhcp 需要一个 dhcp 服务器,但一般都集成在路由器了,所以就不需要再单独部署了。

路由器实验

拓扑结构如下

PC1 没有设置任何的 ip

对路由器启动 dhcp 服务,并配置 g0 端口动态分配 ip 地址

less 复制代码
[Huawei] dpch enable
[Huawei] interface g0/0/0   //进入 g0接口
[Huawei] dhcp select interface  //端口打开 dhcp
[Huawei-GigabitEthernet0/0/0] ip adress 192.168.1.254 24 //dhcp 分配dns
[Huawei-GigabitEthernet0/0/0] dhcp server dns-list 6.6.6.6 //dhcp 分配dns
[Huawei-GigabitEthernet0/0/0] dhcp server excluded-ip-address 192.168.1.200 192.169.1.253  //这段 ip 不能被分配
[Huawei-GigabitEthernet0/0/0] dhcp server lease day 0 hour 0 minute 15 //dhcp 过期时间为15分钟

PC1 启动DHCP

查看 PC1 的 ip 信息,可以看到已经获取到了 ip ,子网编码,网关,dns.

dhcp 是通过一个 ip 池子拿 ip 来分配。通过 display ip pool 可以看到 ip 池使用的情况。

Used :1 代表已经使用了一个 ip,Diable: 54 是我们前面通过 excluded-ip-address 禁掉的 ip 数。

针对端口的 ip 池不需要单独分配,因为默认池子里的 ip 就是对应端口 ip 的子网的主机数。例如上面的 192.168.1.254/24 的子网就是 192.168.1.0,主机范围为 192.168.1.1 - 192.168.1.254,路由器占了一个。

如果还想看具体每个 ip 的分配情况,还能通过这个命令查看 display ip pool interface GigabitEthernet0/0/0 all

dhcp 协议解析

通过抓包发现,和 dhcp 相关的有4个包,对应着 dhcp 的四个过程

  1. PC1 修改获取ip 为 dhcp 之后,会发广播寻找 dhcp 服务器 (PC1: 局域网里有没有 dhcp 服务器)
  2. dhcp 从 ip 池获取一个 ip 并通知 PC1 (dhcp: 有,我分配了一个 ip 给你了,你看要不要)
  3. PC1 发送确认信息,确认需要 ip (PC1: 这个 ip 我要了)
  4. dhcp 收到后回复确认信息 (dhcp: 好,我知道了)

客户端广播寻找 dhcp 服务器 (dhcp discover)

从第一个协议的报文来看,dhcp 是基于 ucp 协议的,ucp 的端口决定了协议的类型,dhcp 分别使用 67(dhcp 服务端),68(客户端)端口。

首先是 PC1 寻找 dhcp 服务器,pc1 因为没有 ip 地址,所以只能通过设置目标 ip 为 0.0.0.0,mac 为 ff:ff:ff:ff:ff:ff ,使用二层广播的方式来寻找。Transcript Id 是一次完整 dhcp 过程的唯一标识。

dhcp 分配 ip 并通知 PC1 (dhcp offer)

dhcp 收到第一个报文之后,知道了 PC1 的mac地址,所以可以通过mac发过去。目标ip 虽然设置了,但其实也没什么用,因为 PC1 还没 ip,也只能根据 mac 路由。 这里携带了比较多的信息,包括分配的 ip 地址,子网掩码,网关地址,dns地址,动态ip失效时间,一次和二次续约的时间(防止第一次续约失败)。

PC1 发送确认信息 (dhcp request)

需要确认是因为网络中可能会有多个 dhcp 服务器,如果有多个 PC1 可能就选择其中一个,另一个就不回复了。

dhcp 确认 (dhcp ack)

和 dhcp offer 的信息几乎一样。

dhcp 续约

前面提到会有到期时间,时间快到了客户端需要续期,否则可能会被路由器复用这个ip。在 eNSP 里面不知道什么问题 PC1 无法及时续约。可以手动执行 ipconfig /renew 进行续约.

PC1 也可以主动执行 ipconfig /release 通过广播的方式释放。

全局配置方式

除了针对端口配置,也可以全局进行配置,先创建几个 ip 池子,再把池子分配给端口。

csharp 复制代码
[Huawei] ip pool myPool // 创建池子,可以创建多个
[Huawei-ip-pool-myPool] network 192.168.1.0 mask 24  //配置子网段,一个池子只能由一个子网段
[Huawei-ip-pool-myPool] gateway-list  //配置网关 ip
[Huawei-ip-pool-myPool]dns-list 6.6.6.6 //dhcp 分配dns
[Huawei-GigabitEthernet0/0/0] dhcp select global  //端口打开 dhcp,因为可能由多个池子,dhcp 默认会根据端口设置的 ip 选择对应的网关的 ip 池子

私接路由器导致电脑上不了网

在一个办公区内,如果有人把一个路由器接入了,可能会导致其他人上不了网。这也是 dhcp 惹的祸。路由器默认开启了 dhcp,私接的路由器同样作为 dhcp server 接入到网络中。当网络中有 PC 的动态 ip 失效了,发起续约的时候,会收到私接的路由器发出的 dhcp,如果接收之后 ip 和网关会变成这台路由器对应子网的设备,因此就无法再上网了。

解决办法是配置 dhcp Snooping ,可以阻止不被信任的 dhcp 服务器发送信息。

dhcp 也涉及到很多安全相关的问题,例如模拟请求把所有 ip 都占了,导致正常的设备无法分配 ip 上不了网。或者模拟 dhcp 服务器,把流量转到自己的路由器等等。

总结

dhcp 是很常见的 ip 地址分配协议,虽然简单但使用不当可能会带来很多问题。只有了解原理才能更好的分析带来的问题并找到解决方案。

相关推荐
Lws7 小时前
CS144 lab0(个人理解)
网络协议
C++忠实粉丝11 小时前
计算机网络socket编程(2)_UDP网络编程实现网络字典
linux·网络·c++·网络协议·计算机网络·udp
添砖java_85711 小时前
UDP数据报套接字编程
网络·网络协议·udp
lxkj_202413 小时前
修改ffmpeg实现https-flv内容加密
网络协议·https·ffmpeg
千羽星弦13 小时前
Apache和HTTPS证书的生成与安装
网络协议·https·apache
程序猿小D16 小时前
第三百三十节 Java网络教程 - Java网络UDP服务器
java·开发语言·网络·网络协议·udp·多线程
是理不是里_1 天前
常见的网络协议汇总(涵盖了不同的网络层次)
网络·网络协议
Peter_chq1 天前
【计算机网络】HTTP协议
linux·c语言·开发语言·网络·c++·后端·网络协议
琢瑜1 天前
TCP 三次握手和四次挥手
网络·网络协议·tcp/ip·linux网络编程
可涵不会debug1 天前
【Linux|计算机网络】HTTPS工作原理与安全机制详解
linux·网络协议·http·网络安全·https