4、DHCP饿死攻击:从工作原理到防御实战
各位同行,今天我们来聊一个在网络运维中特别常见、但又容易被忽视的问题——DHCP饿死攻击。说实话,我入行头两年根本没把这当回事,直到有一次在某大型园区网项目中,整个办公区突然大面积断网,排查了整整一个下午,最后才发现罪魁祸首就是DHCP饿死攻击。从那以后,我对DHCP安全再也不敢掉以轻心。
4.1 DHCP工作原理——先搞清楚正常流程
要理解攻击,得先知道正常情况是什么样的。DHCP说白了就是给设备自动分配IP地址的协议。你想想看,如果没有DHCP,每台电脑都得手动配IP,几百台设备那不得配到崩溃?
标准的DHCP交互过程分为四个步骤,业内常称为DORA流程:
| 步骤 | 报文类型 | 方向 | 说明 |
|---|---|---|---|
| 1 | DHCP Discover | 客户端 → 服务器 | 客户端广播寻找DHCP服务器 |
| 2 | DHCP Offer | 服务器 → 客户端 | 服务器回应可分配的IP地址 |
| 3 | DHCP Request | 客户端 → 服务器 | 客户端确认选择某个IP |
| 4 | DHCP ACK | 服务器 → 客户端 | 服务器确认分配,租约生效 |
这里有个关键点——DHCP服务器维护着一个IP地址池,每个分配的IP都有租约时间。租约到期前客户端可以续租,到期未续租则IP回收。嗯,这个机制本身没问题,但攻击者恰恰就盯上了这个「租约」机制。
核心要点:DHCP服务器能分配的IP总数是有限的。一旦地址池耗尽,新设备就无法获取IP,这就是饿死攻击的根源。
4.2 DHCP饿死攻击原理——地址池是怎么被掏空的
说白了,饿死攻击的原理非常简单:攻击者伪造大量MAC地址,疯狂向DHCP服务器发送Discover报文,申请IP地址。服务器一看,来活了,一个个分配。很快地址池就被掏空了。
我记得有一次在金融客户现场做安全评估,我用一个简单的Python脚本,不到3分钟就把一台能分配254个IP的Cisco路由器地址池耗光了。客户当时脸都绿了。
攻击的典型特征:
- MAC地址洪泛:攻击者每发一个Discover报文就换一个MAC地址,服务器无法区分真假
- 租约占而不用的:攻击者拿到IP后从不使用,也不续租,但租约期内IP就是被占着的
- 合法用户被拒:正常设备发Discover时,服务器回复「No Free Addresses」
避坑指南:我曾经见过一个案例,某公司员工用手机开热点,笔记本自动连了热点获取了192.168.137.x的IP,结果这台笔记本同时连着公司内网,两个网卡疯狂发DHCP请求,直接把公司核心交换机的地址池打爆了。所以,饿死攻击不一定是恶意的,有时候误配置也能造成同样效果。
攻击流程可以用下面这张图来理解:
4.3 DHCP Snooping配置——实战防御方案
好了,问题清楚了,怎么解决?业界最成熟的做法就是DHCP Snooping。说白了,就是在交换机上建立一个信任机制——只允许信任的端口接收DHCP Offer和ACK报文,其他端口只能发Discover和Request。
我个人习惯把DHCP Snooping的核心功能总结为三点:
- 端口信任划分:连接DHCP服务器的端口设为信任口,其他端口都是非信任口
- 报文合法性检查:非信任口收到的Offer/ACK直接丢弃,防止伪造服务器
- 速率限制:限制非信任口每秒能通过的DHCP报文数量,防止洪泛
小技巧:我建议在配置DHCP Snooping时,同时开启DHCP Option 82功能。这个选项会在报文中插入接入端口信息,方便后续溯源。有一次客户投诉IP冲突,我就是靠Option 82里的端口信息,5分钟就定位到了具体是哪台交换机哪个端口。
4.3.1 华为交换机配置示例
以华为S系列交换机为例,配置其实不复杂:
# 全局启用DHCP Snooping
system-view
dhcp snooping enable
# 创建VLAN并启用DHCP Snooping
vlan 100
dhcp snooping enable
# 配置信任端口(连接DHCP服务器的端口)
interface GigabitEthernet0/0/1
dhcp snooping trusted
# 配置非信任端口的速率限制(每秒最多10个报文)
interface GigabitEthernet0/0/2
dhcp snooping check dhcp-request
dhcp snooping rate-limit 10
# 查看DHCP Snooping绑定表
display dhcp snooping binding
4.3.2 Cisco交换机配置示例
Cisco的配置思路类似,但命令稍有不同:
# 全局启用DHCP Snooping
ip dhcp snooping
# 指定DHCP Snooping作用的VLAN
ip dhcp snooping vlan 100
# 配置信任端口
interface GigabitEthernet0/1
ip dhcp snooping trust
# 配置非信任端口速率限制
interface GigabitEthernet0/2
ip dhcp snooping limit rate 10
# 查看绑定表
show ip dhcp snooping binding
4.3.3 配置后的效果对比
| 对比项 | 未配置DHCP Snooping | 配置DHCP Snooping后 |
|---|---|---|
| 攻击者伪造MAC | 可以无限发送Discover | 速率限制,超阈值端口被err-disable |
| 伪造DHCP服务器 | 任意端口可发Offer | 仅信任端口可发Offer |
| 地址池耗尽 | 几分钟内可能被耗尽 | 攻击报文被限速,地址池安全 |
| 合法用户影响 | 无法获取IP | 正常获取IP不受影响 |
注意:配置速率限制时,阈值别设得太低。我曾经在一个视频会议系统上线时,把速率限制设成了每秒5个,结果会议终端批量上线时触发了限制,端口直接被err-disable了。建议根据实际环境调整,一般每秒10-20个是比较合理的范围。
4.4 进阶建议——组合拳效果更好
说实话,单靠DHCP Snooping还不够完美。我个人习惯打一套组合拳:
- DHCP Snooping + DAI:动态ARP检测,防止ARP欺骗
- DHCP Snooping + IP Source Guard:源地址校验,防止IP欺骗
- 端口安全:限制端口最大MAC地址学习数量
这三者配合起来,基本能把二层网络的安全防护做到位。我在多个大型园区网项目中都是这么部署的,效果相当稳定。
好了,DHCP饿死攻击的原理和防御就讲到这里。记住一句话:信任是安全的最大敌人。在网络上,永远不要相信未经验证的DHCP报文。