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 的四个过程
- PC1 修改获取ip 为 dhcp 之后,会发广播寻找 dhcp 服务器 (PC1: 局域网里有没有 dhcp 服务器)
- dhcp 从 ip 池获取一个 ip 并通知 PC1 (dhcp: 有,我分配了一个 ip 给你了,你看要不要)
- PC1 发送确认信息,确认需要 ip (PC1: 这个 ip 我要了)
- 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 地址分配协议,虽然简单但使用不当可能会带来很多问题。只有了解原理才能更好的分析带来的问题并找到解决方案。