首页/网络/抓包与流量分析速查/tcpdump port 端口过滤

tcpdump port 端口过滤

按端口过滤:port 443 双向匹配,src port / dst port 限定方向;默认对 TCP 与 UDP 同时生效,可用 tcp/udp 关键词收窄。

port 在做什么

port 是 BPF 表达式里按端口匹配的原语,默认同时匹配源端口与目的端口,也同时覆盖 TCP 与 UDP。加 src port 或 dst port 可以限定方向,加 tcp 或 udp 可以限定协议;区间用 portrange。同一条会话里客户端端口是随机分配的高位端口,所以判断服务是否可达时用 dst port 更精准,判断响应有没有回来时用 src port。把端口当成协议标识是常见误判:443 上同时跑 TLS(TCP)与 QUIC(UDP)。

基本信息

语法port <号> / src port / dst port / tcp port / udp port / portrange 起-止
等价关系port 443 等于 (tcp or udp) port 443
不支持host 10.0.0.9:443 这类冒号写法,BPF 语法里没有
组合与 host、net 用 and/or 组合,方向修饰只作用于紧跟的原语
配套ss -lntu 核对本机监听端口

典型使用场景

  • 验证服务端口可达性:dst port 443 看请求是否发出、是否有回包
  • 排查 DNS:udp port 53 与 tcp port 53 分开抓,大响应截断后会回退到 TCP
  • 看数据库访问:dst port 3306 精确筛出客户端发往数据库的请求
  • Web 排障:443 的 TCP 与 UDP 都要抓,只看一半会漏掉 HTTP/3 流量
  • 端口迁移期间同时看新旧两个端口:port 8080 or port 8443

常用示例

常用示例
tcpdump -i eth0 -nn port 53                  # TCP 与 UDP 的 53 端口一起抓
tcpdump -i eth0 -nn dst port 443             # 只看发往 443 的请求
tcpdump -i eth0 -nn src port 53              # 只看 DNS 服务端返回的响应
tcpdump -i eth0 -nn 'tcp port 443 and host 203.0.113.10'   # 精确到某个对端
tcpdump -i eth0 -nn 'udp portrange 5000-5100'              # 端口区间
tcpdump -i eth0 -nn 'port 80 or port 8080'                 # 多端口并列
tcpdump -nn -r a.pcap 'dst port 3306' | wc -l              # 离线统计请求条数
ss -lntu | grep -E ':(443|3306)'                           # 对照本机是否真的在监听

端口写法对照

写法含义注意
port 443源或目的、TCP 或 UDP 全部命中想只看 UDP 必须显式加 udp 关键词
dst port 443目的端口为 443客户端发起方向,排除服务端回包,统计请求数用它
src port 443源端口为 443服务端返回方向,用来确认响应是否回来
tcp port 443仅 TCP 的 443QUIC 走 UDP 443,用它会漏掉一半 Web 流量
portrange 5000-5100端口区间匹配区间写法要与协议关键词组合才够精确
port 443 and host A双向命中该端口且属于 A方向修饰只作用于紧跟的原语,写清楚再加其他条件
端口号只是配置约定,服务改端口后过滤条件必须跟着改;把端口当作协议标识会在迁移、复用端口或代理场景里得出错误结论。
只过滤 TCP 443 会漏掉 UDP 443 上的 QUIC 流量,Web 排障时容易误判成请求根本没有发出,两个都要看。

与监听状态对照

与监听状态对照
ss -lntu                                    # 列出本机全部 TCP/UDP 监听端口
ss -lntp | grep :8443                       # 确认是哪个进程在监听该端口
tcpdump -i any -nn -c 20 'dst port 8443'    # 用实际监听端口过滤,避免猜端口

常见误判

  • 把过滤结果直接当作请求条数:port 会把服务端回包也算进去,统计请求应该用 dst port
  • 只看一个协议族:DNS 与 Web 在新版本协议下都会跨 TCP 与 UDP
  • 忽略 NAT 改写:经过 NAT 后端口可能已经改变,跨设备对照时要记录映射关系
  • 在代理与负载均衡前面抓:看到的是代理端口,后端真实端口要在下一跳抓

与其他条件组合

  • 与 host 组合定位到具体对端,避免同端口的多条会话混在一起看
  • 与 net 组合可以只看某个网段发往该端口的请求,适合排查机房级问题
  • 与 tcp[tcpflags] 组合可以只看该端口的建连报文,用最少的数据量判断服务是否可达
  • 与 udp 组合可以只看无连接协议,避免 TCP 与 UDP 同号端口的输出互相干扰
  • 与 not 组合可以排掉健康检查来源,让统计结果接近真实业务量
端口号在过滤表达式里不能写服务名以外的变体,写 https 这类服务名会触发服务表解析,跨机器结果可能不同,统一用数字端口更稳。

易错点

  • 只过滤 TCP 443 会漏掉 UDP 443 的 QUIC 流量,容易得出请求未发出的错误结论
  • host 10.0.0.9:443 这种冒号写法 BPF 不支持,会直接报语法错误
  • port 同时命中源与目的,用抓包结果统计请求数会偏高,应加 dst 限定
  • 客户端源端口是随机分配的,按源端口过滤只在单次偶发问题里有效,不能长期复用
  • 抓包点不同端口含义不同,NAT 与代理之后的端口已被改写,跨设备对照前先确认拓扑

数据来源与参考

  • man 8 pcap-filter(port 原语)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌