tcpdump 过滤表达式

tcpdump 使用 BPF(Berkeley Packet Filter) 表达式来精确筛选数据包。理解 BPF 语法是高效使用 tcpdump 的核心。

表达式结构

[协议] [方向] [类型] [值]

三个维度组合,缺省时表示”匹配所有”。

类型(Type)

指定过滤的目标类型:

关键字说明示例
host匹配主机(默认类型)host 192.168.1.1
net匹配网段net 192.168.0.0/16
port匹配端口port 80
portrange匹配端口范围portrange 8000-8080

方向(Direction)

指定数据流方向:

关键字说明示例
src源地址/端口src host 10.0.0.1
dst目的地址/端口dst port 443
src or dst源或目的(默认)src or dst port 53
src and dst源且目的src 10.0.0.1 and dst 10.0.0.2

协议(Protocol)

指定网络/传输层协议:

关键字说明
tcpTCP 协议
udpUDP 协议
icmpICMP 协议
arpARP 协议
ipIPv4 协议
ip6IPv6 协议

协议过滤的底层原理

协议过滤实际是对 IP 头部 protocol 字段的匹配:

  • tcp → protocol = 6
  • udp → protocol = 17
  • icmp → protocol = 1

逻辑运算符

组合多个过滤条件:

运算符替代写法说明示例
and&&tcp and port 80
or||port 80 or port 443
not!not arp

优先级

优先级:not > and > or。建议始终用括号明确优先级:

tcpdump 'host 10.0.0.1 and (port 80 or port 443)'

高级过滤

TCP 标志位过滤

# SYN 包
tcp[tcpflags] & tcp-syn != 0
# 简写
'tcp[tcpflags] == tcp-syn'
 
# RST 包
'tcp[tcpflags] & tcp-rst != 0'
 
# SYN+ACK 包(多个标志位)
'tcp[tcpflags] == (tcp-syn|tcp-ack)'
 
# 只含 SYN 不含 ACK
'tcp[tcpflags] & (tcp-syn) != 0 and tcp[tcpflags] & (tcp-ack) == 0'

包大小过滤

# 小于 100 字节的小包
'less 100'
 
# 大于 500 字节的大包
'greater 500'

MAC 地址过滤

# 源 MAC
ether src aa:bb:cc:dd:ee:ff
 
# 目的 MAC
ether dst aa:bb:cc:dd:ee:ff

VLAN 过滤

# VLAN ID 100
vlan 100

常用过滤组合

# 排除 SSH 连接(避免抓到自己的终端流量)
'not port 22'
 
# 特定主机间的 HTTP 通信
'host 10.0.0.1 and tcp port 80'
 
# DNS 查询与响应(排除端口 53 的 TCP)
'udp port 53'
 
# 广播和多播流量
'broadcast' 'multicast'
 
# 排除 ARP 和 DHCP
'not (arp or port 67 or port 68)'

引号使用

包含 ()! 等特殊字符时,必须用单引号包裹表达式,防止 Shell 解释:

# 正确
tcpdump -i any 'tcp[tcpflags] & tcp-syn != 0'
# 错误(Shell 会把 () 当作子进程)
tcpdump -i any tcp[tcpflags] & tcp-syn != 0

关联笔记