tcpdump udp 过滤

只抓 UDP 流量:DNS、NTP、DHCP、QUIC、syslog 等都以此承载;UDP 无连接,丢包与乱序要靠应用层或序列字段判断。

抓 UDP 在做什么

udp 原语只匹配无连接协议的报文,可以单独使用,也可以与端口、地址组合。域名解析、时间同步、地址分配、日志投递、QUIC 与隧道封装都以它承载。与 TCP 最大的区别是它没有握手与重传:抓不到响应既可能是丢包,也可能是对端本就不回应,无法靠标志位判断,只能结合业务日志与两端对照来定位。过滤时注意端口条件与协议关键词要写对,否则会误命中 TCP 的同类端口。

基本信息

全部 UDPudp
端口组合udp port 53 / udp portrange 5000-5100
方向限定udp src port / udp dst port
IPv6ip6 and udp port 547
常见端口53 域名、67 与 68 地址分配、123 时间、443 QUIC、514 日志

典型使用场景

  • 排查域名解析:只看 53 端口确认查询与响应是否成对出现
  • 核对时间同步:观察 123 端口的请求响应是否规律出现
  • 确认是否使用新协议:检查 443 端口上的 UDP 流量占比
  • 排查地址分配失败:抓 67 与 68 端口看四步交互缺在哪一步
  • 检查隧道封装:按隧道协议端口过滤,注意内外层头部

常用示例

常用示例
tcpdump -i eth0 -nn udp port 53                 # 域名解析
tcpdump -i eth0 -nn 'udp and port 123'           # 时间同步
tcpdump -i eth0 -nn 'udp and (port 67 or port 68)'   # 地址分配
tcpdump -i eth0 -nn 'udp portrange 4789-4790'    # 隧道封装端口
tcpdump -i eth0 -nn 'ip6 and udp port 547'       # IPv6 前缀分配
tcpdump -i eth0 -nn 'udp and host 10.0.0.9'      # 限定对端
tcpdump -nn -r a.pcap 'udp port 53' | wc -l      # 离线统计查询条数

常见 UDP 用途与端口

端口用途抓包注意点
53域名解析同时存在 TCP 53,大响应会回退到 TCP
67 与 68地址分配使用广播,需在同一广播域抓包
123时间同步响应缺失通常是可达性问题
443QUIC与 TCP 443 是两类流量,需要分别统计
514日志投递丢包无提示,缺失只能靠对比发现
4789隧道封装注意内外层头部与对应地址
UDP 报文没有握手,因此判断可达性只能靠「请求是否到达对端」与「对端是否发出响应」两侧证据。单侧抓包的缺失只能说明该位置没有看到。
UDP 没有重传机制,抓不到响应就直接归因于网络丢包是常见误判。对端应用可能根本没有回复,需要结合服务端进程与业务日志一起判断。

与应用侧对照

与应用侧对照
ss -lunp | head -20                       # 本机 UDP 监听端口与进程
systemctl status systemd-resolved 2>/dev/null | head -5   # 解析服务状态
chronyc sources 2>/dev/null | head -5     # 时间同步源状态

判读要点

  • 同一请求反复出现,是无连接协议下的应用重试,与 TCP 重传机制不同
  • 响应延迟大但都能收到,说明链路质量波动而非不可达
  • 大报文被分片后过滤仍能命中首片,完整内容需要重组
  • 隧道封装场景下过滤按外层地址与端口,写错层级会匹配不到

易错点

  • 把 UDP 与 TCP 端口条件混用,用 tcp 关键词查 QUIC 会永远没有结果
  • 看不到响应就断定网络丢包,忽略了服务端未响应这一可能
  • 地址分配类协议依赖广播,抓包点不在同一广播域会看不到交互
  • 分片报文只抓到首片就认为内容完整,重组后才能看全字段
  • 隧道场景下按内层地址过滤,实际过滤应作用于外层头部

数据来源与参考

  • man 8 pcap-filter
  • RFC 768(UDP)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌