首页/网络/抓包与流量分析速查/tcpdump 抓 DHCP 交互

tcpdump 抓 DHCP 交互

抓 DHCP 四步交互(Discover/Offer/Request/ACK)报文:客户端拿不到地址时,按这四步判断卡在了哪一环节。

抓地址分配在做什么

地址分配是四步交互:客户端以广播方式发出发现报文,服务端回提供报文,客户端再广播请求,服务端最后确认。抓取这四步可以准确判断拿不到地址时卡在哪一环节:只有发现没有提供,说明服务端或中继侧有问题;有提供没有确认,说明客户端的选择环节异常;出现否认报文,说明客户端申请的地址与服务端记录冲突。过滤条件按 67 与 68 两个端口写,加上链路层头部还能看到广播地址。

基本信息

过滤写法udp and (port 67 or port 68)
客户端角色使用 68 端口发送发现与请求
服务端角色使用 67 端口返回提供与确认
交互方式客户端初始阶段使用广播,服务端可单播回复
补充选项加链路层显示可看到广播目的地址

典型使用场景

  • 终端拿不到地址:按四步判断卡在哪一环节
  • 核对地址池容量:观察请求量是否明显超过可用地址数
  • 排查中继问题:跨网段场景确认中继是否转发
  • 定位地址冲突:观察是否出现否认报文
  • 验证租期行为:确认续租请求的时机与结果

常用示例

常用示例
tcpdump -i eth0 -nn -e 'udp and (port 67 or port 68)'      # 四步交互与广播地址
tcpdump -i eth0 -nn -v 'udp and port 68' -c 20              # 查看客户端请求详情
tcpdump -i eth0 -nn 'udp and port 67' -c 20                 # 只看服务端回复
tcpdump -i eth0 -nn -e 'udp and (port 67 or port 68) and host 10.0.0.5'   # 限定某客户端
tcpdump -i eth0 -nn -w /tmp/dhcp.pcap 'udp and (port 67 or port 68)'      # 落盘后逐包分析

四步交互读法

步骤方向与端口判读要点
发现客户端 68 广播到服务端 67没有这一步说明客户端未启用自动获取
提供服务端 67 到客户端 68缺失说明服务端或中继侧未响应
请求客户端 68 广播到服务端 67缺失说明客户端未接受提供的地址
确认服务端 67 到客户端 68缺失说明第二步之后链路中断
否认服务端 67 到客户端 68客户端申请的地址已被占用,需核对记录
续租单播的请求与确认租期过半时出现,属于正常行为
客户端在初始阶段使用广播,服务端回复可能是单播也可能是广播。抓包时加上链路层显示,能直接确认目的地址是否为全广播地址,有助于判断交互是否走到下一步。
跨网段场景依赖中继转发,抓包位置的选择很关键:在客户端侧看不到提供报文时,应同时在中继或服务端侧抓取,才能区分是请求没发出还是回复没回来。

结合地址状态核对

结合地址状态核对
ip -4 addr show dev eth0 | head -10        # 客户端当前地址与获取方式
ip route show | head -10                   # 是否拿到默认路由
journalctl -u NetworkManager --since '10 min ago' 2>/dev/null | tail -20   # 客户端日志

判读要点

  • 发现报文反复出现而没有提供,通常是服务端不可达或地址池耗尽
  • 有提供与请求但缺少确认,多为链路在中途中断或服务端处理异常
  • 出现否认报文时优先核对地址池记录与静态地址配置
  • 续租流量体积小且周期性出现,属于正常行为,不必当成异常

易错点

  • 在客户端侧抓不到提供报文就断定服务端无响应,忽略了中继与抓包点位置的影响
  • 过滤时只写一个端口,漏掉交互的另一半,无法判断流程卡在哪一步
  • 把反复出现的发现报文当作异常流量,实际是拿不到地址时的重试
  • 忽略否认报文这一分支,误判为服务端完全不响应
  • 在没有地址的接口上抓包,抓包命令本身需要绕过地址依赖,容易操作失败

数据来源与参考

  • man 8 pcap-filter
  • RFC 2131(DHCP)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌