抓地址分配在做什么
地址分配是四步交互:客户端以广播方式发出发现报文,服务端回提供报文,客户端再广播请求,服务端最后确认。抓取这四步可以准确判断拿不到地址时卡在哪一环节:只有发现没有提供,说明服务端或中继侧有问题;有提供没有确认,说明客户端的选择环节异常;出现否认报文,说明客户端申请的地址与服务端记录冲突。过滤条件按 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 # 客户端日志判读要点
- 发现报文反复出现而没有提供,通常是服务端不可达或地址池耗尽
- 有提供与请求但缺少确认,多为链路在中途中断或服务端处理异常
- 出现否认报文时优先核对地址池记录与静态地址配置
- 续租流量体积小且周期性出现,属于正常行为,不必当成异常