目录
- 前言:BPF伯克利包过滤器介绍
- 1.BPF语法(tcpdump语法)
- 2.逻辑运算符
- 3.常用的原子条件
- 1. 协议相关的原子条件
- 2. 地址相关的原子条件
- 3. 端口相关的原子条件
- 4. 网络层和链路层(mac地址)原子条件
- 5. 广播和多播
- 6. VLAN 相关的原子条件
- 7. 特定字段大小过滤
- 8. 基于TCP标记的过滤
- 9. ICMP 类型过滤
- 10. MPLS 过滤
- 11. PPPoE 过滤
- 12. ISO OSI 过滤
- 13. Token Ring 过滤
- 14. 带宽过滤
- @组合示例
- 4.tcpdump常用选项
- Ⅰ.基本选项
- Ⅱ.高级选项
- @组合选项示例
- @综合示例
- 详解篇
- 示例 1:捕获特定主机的 HTTP GET 请求并保存到文件
- 示例 2:捕获 VLAN 10 中所有的 TCP SYN 数据包,并显示详细信息
- 示例 3:捕获所有入方向的 ICMP 数据包,并显示数据包内容
- 示例 4:捕获所有源 MAC 地址为特定地址的 TCP FIN 数据包
- 示例 5:捕获并显示特定 IP 地址的 UDP 流量,包括十六进制内容
- 示例 6:捕获 HTTP POST 请求,并显示数据包内容
- 示例 7:捕获特定端口范围的 UDP 流量,并设置捕获缓冲区大小
- 示例 8:捕获所有 TCP 连接终止过程中的数据包(包括 FIN 和 RST 数据包)
- 简洁篇
- 示例 1:捕获 HTTP 和 HTTPS 流量并保存到文件
- 示例 2:捕获特定网络内的所有 TCP 数据包,并显示详细信息
- 示例 3:捕获并解密 IPsec 流量
- 示例 4:捕获并实时显示所有包含特定字符串的 HTTP 流量
- 示例 5:捕获所有带有 SYN 和 ACK 标志的 TCP 数据包
- 示例 6:捕获特定 VLAN 中的 ICMP 数据包,并将输出显示为 ASCII 格式
- 示例 7:捕获特定端口范围的 UDP 流量,并设置捕获缓冲区大小
- 示例 8:捕获并显示时间戳差异的 TCP 数据包
- 示例 9:捕获来自特定主机的 DNS 查询和响应
- 示例 10:捕获所有广播和多播数据包,并显示链路层信息
- 总结
前言:BPF伯克利包过滤器介绍
维基百科:https://zh.wikipedia.org/wiki/BPF Berkeley Packet Filter (BPF)
是一种用于捕获和过滤网络数据包的技术,广泛用于网络分析工具中 BPF 的主要应用
1. 网络数据包过滤 tcpdump 和 Wireshark
使用 BPF 来捕获和过滤网络数据包,只显示感兴趣的流量。 tcpdump ‘tcp port 80’
2. 入侵检测和防御 Snort 和 Suricata:使用 BPF 过滤数据包,提高入侵检测系统的效率。 snort -i eth0 ‘tcp port 80’
3. 高性能网络 pfSense 和 Open vSwitch:使用 BPF 进行流量监控和优化网络性能。 ovs-vsctl – set Bridge br0 netflow=@nf – --id=@nf create NetFlow
targets=“127.0.0.1:2055” active-timeout=30
4. eBPF 的扩展应用 eBPF(extended BPF)是 BPF 的扩展版本,提供了更强大的功能和更广泛的应用场景。 系统性能监控和调试:bpftrace:用于实时系统跟踪和性能分析。 bpftrace -e
‘kprobe:do_sys_open { printf(“%s\n”, str(arg1)); }’
网络安全和可观察性:Cilium:用于 Kubernetes 环境的网络安全和可观察性。 cilium policy
trace --src-ip 10.0.0.1 --dst-ip 10.0.0.2 运行时安全检测:Falco:利用 eBPF
来检测和响应系统中的异常行为。 falco -r rules/falco_rules.yaml -c
/etc/falco/falco.yaml
1.BPF语法(tcpdump语法)
tcpdump [options] [filter expression]
- options:tcpdump 的命令行选项,用于控制捕获行为。
- filter expression:BPF 过滤表达式,用于定义数据包过滤条件。
- 过滤表达式由一个或多个原子条件和逻辑运算符组成,用于定义哪些数据包应该被捕获。
- 常见原子条件:协议、主机&网络(源目地址&源目网络)、端口…
这里和正常的Linux shell语法不一致
2.逻辑运算符
通过组合这些原子条件和逻辑运算符,可以构建复杂的过滤表达式。逻辑运算符包括:
- and 或 &&:逻辑与运算。
- or 或 ||:逻辑或运算。
- not 或 !:逻辑非运算。
3.常用的原子条件
在 tcpdump
的过滤表达式中,除了前面提到的协议、主机、网络和端口等基本原子条件外,还有许多其他原子条件可以帮助你更精确地捕获特定类型的数据包。以下是一些常用的原子条件及其详细解释:
1. 协议相关的原子条件
-
ip:捕获所有 IPv4 数据包。
tcpdump ip
-
ip6:捕获所有 IPv6 数据包。
tcpdump ip6
-
tcp:捕获所有 TCP 数据包。
tcpdump tcp
-
udp:捕获所有 UDP 数据包。
tcpdump udp
-
icmp:捕获所有 ICMP 数据包。
tcpdump icmp
-
icmp6:捕获所有 ICMPv6 数据包。
tcpdump icmp6
-
arp:捕获所有 ARP 数据包。
tcpdump arp
-
rarp:捕获所有 RARP 数据包。
tcpdump rarp
-
协议IP协议版本过滤
tcpdump ip #捕获IPv4数据包 tcpdump ip6 #捕获IPv6数据包tcpdump ip and tcp # 捕获 IPv4 上的 TCP 数据包 tcpdump ip6 and tcp # 捕获 IPv6 上的 TCP 数据包tcpdump ip host 192.168.1.1 # 捕获特定 IPv4 地址的所有数据包 tcpdump ip6 host 2001:db8::1 # 捕获特定 IPv6 地址的所有数据包tcpdump ip and udp # 捕获 IPv4 上的 UDP 数据包 tcpdump ip6 and udp # 捕获 IPv6 上的 UDP 数据包tcpdump 'ip and icmp' #捕获IPv4的ICMP数据包: tcpdump 'ip6 and icmp6' #捕获IPv6的ICMP数据包:tcpdump 'ip and net 192.168.1.0/24' #捕获IPv4的指定网络的数据包: tcpdump 'ip6 and net 2001:db8::/32' #捕获IPv6的指定网络的数据包:tcpdump 'ip and src 192.168.1.1 and dst port 443' -w ipv4_https_traffic.pcap #捕获IPv4上指定源地址和目的端口的数据包,并保存到文件 tcpdump 'ip6 and src 2001:db8::1 and dst port 443' -vv#捕获IPv6上指定源地址和目的端口的数据包,并显示详细信息
2. 地址相关的原子条件
-
host:捕获来自或发送到指定主机的数据包。
tcpdump host 192.168.1.1
-
src host:捕获来自指定源主机的数据包。
tcpdump src host 192.168.1.1
-
dst host:捕获发送到指定目标主机的数据包。
tcpdump dst host 192.168.1.2
-
net:捕获来自或发送到指定网络的数据包。
tcpdump net 192.168.1.0/24
-
src net:捕获来自指定源网络的数据包。
tcpdump src net 192.168.1.0/24
-
dst net:捕获发送到指定目标网络的数据包。
tcpdump dst net 192.168.1.0/24
3. 端口相关的原子条件
-
port:捕获指定端口的数据包。
tcpdump port 80
-
src port:捕获来自指定源端口的数据包。
tcpdump src port 1024
-
dst port:捕获发送到指定目标端口的数据包。
tcpdump dst port 443
-
portrange:捕获指定端口范围的数据包。
tcpdump portrange 8000-8080
4. 网络层和链路层(mac地址)原子条件
-
ether:捕获以太网帧相关的数据包。
tcpdump ether
-
ether src:捕获来自指定源 MAC 地址的数据包。
tcpdump ether src 00:11:22:33:44:55
-
ether dst:捕获发送到指定目标 MAC 地址的数据包。
tcpdump ether dst 00:11:22:33:44:55
-
ether host:捕获来自或发送到指定 MAC 地址的数据包。
tcpdump ether host 00:11:22:33:44:55
5. 广播和多播
-
broadcast:捕获所有广播数据包。
tcpdump broadcast
-
multicast:捕获所有多播数据包。
tcpdump multicast
6. VLAN 相关的原子条件
-
vlan:捕获所有 VLAN 数据包。
tcpdump vlan
-
vlan [vlan_id]:捕获指定 VLAN ID 的数据包。
tcpdump vlan 10
7. 特定字段大小过滤
-
less:捕获小于指定字节长度的数据包。
tcpdump 'less 64'
-
greater:捕获大于指定字节长度的数据包。
tcpdump 'greater 128'
8. 基于TCP标记的过滤
- tcp-flags:捕获具有特定 TCP 标志的数据包。
- SYN:捕获所有带 SYN 标志的数据包。
tcpdump 'tcp[tcpflags] & tcp-syn != 0'
- SYN-ACK:捕获所有带 SYN 和 ACK 标志的数据包。
tcpdump 'tcp[tcpflags] & (tcp-syn|tcp-ack) == (tcp-syn|tcp-ack)'
- SYN:捕获所有带 SYN 标志的数据包。
9. ICMP 类型过滤
- icmp[icmptype]:捕获特定类型的 ICMP 数据包。
- echo request(ping 请求)
tcpdump 'icmp[icmptype] = icmp-echo'
- echo reply(ping 回复)
tcpdump 'icmp[icmptype] = icmp-echoreply'
- echo request(ping 请求)
10. MPLS 过滤
-
mpls:捕获所有 MPLS 数据包。
tcpdump 'mpls'
-
mpls [label]:捕获指定 MPLS 标签的数据包。
tcpdump 'mpls 100'
11. PPPoE 过滤
- pppoes:捕获所有 PPPoE 会话数据包。
tcpdump 'pppoes'
12. ISO OSI 过滤
-
iso:捕获所有 ISO 网络协议数据包。
tcpdump 'iso'
-
clnp:捕获所有 CLNP(Connectionless Network Protocol)数据包。
tcpdump 'clnp'
13. Token Ring 过滤
-
tr:捕获所有 Token Ring 数据包。
tcpdump 'tr'
-
tr [protocol]:捕获指定 Token Ring 协议的数据包。
tcpdump 'tr 0x0800'
14. 带宽过滤
-
tcp-keepalive:捕获所有 TCP keepalive 数据包。
tcpdump 'tcp[tcpflags] & tcp-keepalive != 0'
-
tcp-segment:捕获所有 TCP 段。
tcpdump 'tcp-segment'
@组合示例
-
捕获所有来自 192.168.1.1 并发送到端口 80 的 TCP 数据包:
tcpdump 'src host 192.168.1.1 and dst port 80 and tcp'
-
捕获所有 IPv4 和 IPv6 上的 HTTP 和 HTTPS 流量:
tcpdump '(ip or ip6) and (tcp port 80 or tcp port 443)'
-
捕获所有来自网络 192.168.1.0/24 的 UDP 数据包,但排除端口 53(DNS):
tcpdump 'src net 192.168.1.0/24 and udp and not port 53'
-
捕获所有广播和多播数据包:
tcpdump 'broadcast or multicast'
-
捕获所有 VLAN 10 中大于 128 字节的 TCP 数据包:
tcpdump 'vlan 10 and tcp and greater 128'
-
捕获所有带 SYN 和 ACK 标志的 IPv6 TCP 数据包:
tcpdump 'ip6 and tcp[tcpflags] & (tcp-syn|tcp-ack) == (tcp-syn|tcp-ack)'
-
捕获所有 MPLS 标签为 100 的 UDP 数据包:
tcpdump 'mpls 100 and udp'
-
捕获所有 PPPoE 会话中的 IPv4 数据包:
tcpdump 'pppoes and ip'
-
捕获所有 ISO 网络协议中的 CLNP 数据包:
tcpdump 'iso and clnp'
4.tcpdump常用选项
Ⅰ.基本选项
-
-i interface:指定要监听的网络接口。
tcpdump -i eth0
- 默认情况下,
tcpdump
会选择第一个非环回接口。 - 可以通过
-D
选项列出所有接口:tcpdump -D
- 默认情况下,
-
-c count:捕获指定数量的数据包后停止。
tcpdump -c 100
-
-w file:将捕获的数据包保存到文件。
tcpdump -w capture.pcap
-
-r file:从文件中读取并分析数据包。
tcpdump -r capture.pcap
-
-nn:不将地址和端口转换为名称。
tcpdump -nn
-n
:不将地址转换为名称(主机名)。-nn
:不将地址和端口转换为名称。
-
-v, -vv, -vvv:设置详细输出的级别。
tcpdump -v # 较详细 tcpdump -vv # 更详细 tcpdump -vvv # 最详细
-
-X:以十六进制和 ASCII 格式显示每个包的数据。
tcpdump -X
-
-e:显示链路层头信息。
tcpdump -e
-
-tt:显示时间戳,不格式化。
tcpdump -tt
-
-ttt:显示时间戳,以微秒为单位,相对于上一个数据包的时间差。
tcpdump -ttt
-
-tttt:显示人类可读的时间戳格式。
tcpdump -tttt
-
-s snaplen:设置数据包截取长度(捕获的每个数据包的最大字节数)。
tcpdump -s 128
- 默认值为 68 或 96,足以捕获 IP 和 TCP/UDP 头
- 0 表示完整的数据包内容
-
-A:以 ASCII 格式显示数据包内容。
tcpdump -A
-
-C file_size:设置捕获文件的大小上限(以 MB 为单位),达到上限后创建新文件。
tcpdump -C 10 -w capture
-
-G seconds:设置捕获文件的时间上限(以秒为单位),达到上限后创建新文件。
tcpdump -G 60 -w capture
-
-W file_count:设置保存捕获文件的最大数量。
tcpdump -W 10 -G 60 -w capture
-
-E spi@ipaddr algo:secret:指定解密 IPsec 数据包的参数。
tcpdump -E 100@192.168.1.1 des3:0x0123456789ABCDEF
-
-Q:用于选择捕获的数据包的方向
tcpdump -Q directiontcpdump -Q in 'tcp' # 捕获并显示所有入方向的 TCP 数据包 tcpdump -Q out -w http_out.pcap 'tcp port 80' # 捕获并保存出方向的 HTTP 流量到文件 tcpdump -Q inout -v 'icmp' # 捕获所有入方向和出方向的 ICMP 数据包,并显示详细信息 tcpdump -Q in 'udp and host 192.168.1.100' # 捕获特定主机的入方向 UDP 流量 tcpdump -Q out 'vlan 10' # 捕获 VLAN 10 的出方向数据包
in:仅捕获入方向的数据包(接收的数据包)。
out:仅捕获出方向的数据包(发送的数据包)。
inout:捕获入方向和出方向的数据包(所有数据包)。
Ⅱ.高级选项
-
-B buffer_size:设置捕获缓冲区大小(以 KB 为单位)。
tcpdump -B 4096
-
-K:禁用数据包的校验和验证。
tcpdump -K
-
-S:显示绝对序列号(对于 TCP 数据包)。
tcpdump -S
-
-j tstamp_type:设置数据包时间戳类型。
tcpdump -j adapter
-
-l:将标准输出设置为行缓冲模式。
tcpdump -l
-
-U:实时写入捕获文件。
tcpdump -U -w capture.pcap
-
-Z user:在捕获文件打开后切换用户。
tcpdump -Z nobody
-
-F file:从文件中读取过滤表达式。
tcpdump -F filter_file
@组合选项示例
-
捕获并保存所有 TCP 数据包,保存到文件,文件大小上限为 10 MB,每 60 秒切换文件,最多保存 5 个文件:
tcpdump -i eth0 -w capture -C 10 -G 60 -W 5 tcp
-
以详细模式捕获端口 80 上的 HTTP 流量,并显示数据包内容的 ASCII 和十六进制格式:
tcpdump -i eth0 -vv -X port 80
-
捕获 VLAN 10 中的所有数据包,并将标准输出设置为行缓冲模式:
tcpdump -i eth0 -l vlan 10
-
捕获并解密 IPsec 数据包,使用指定的密钥:
tcpdump -i eth0 -E 100@192.168.1.1 des3:0x0123456789ABCDEF
-
设置捕获缓冲区大小为 4 MB,并捕获所有 UDP 数据包:
tcpdump -i eth0 -B 4096 udp
@综合示例
详解篇
下面是一些综合使用 tcpdump
选项、原子条件和逻辑运算符的示例,这些示例展示了如何结合这些元素来实现复杂的捕获和分析需求。
示例 1:捕获特定主机的 HTTP GET 请求并保存到文件
tcpdump -i eth0 -A -s 0 -w http_get_requests.pcap 'tcp port 80 and (((ip[2:2] - ((ip[0] & 0xf)<<2)) - ((tcp[12] & 0xf0)>>2)) != 0) and tcp[((tcp[12] & 0xf0)>>2):4] = 0x47455420 and host 192.168.1.100'
- -i eth0:指定网络接口 eth0。
- -A:以 ASCII 格式显示数据包内容。
- -s 0:捕获完整的数据包。
- -w http_get_requests.pcap:将数据包保存到文件。
- ‘tcp port 80 and … and host 192.168.1.100’:过滤条件,捕获特定主机的 HTTP GET 请求。
- ip[2:2]:IP 数据包的总长度字段(2 个字节),IP 头部的第 2 和第 3 字节表示数据包的总长度。
- ip[0] & 0xf:IP 头长度字段。IP 头部的第 1 字节的低 4 位表示 IP 头的长度(单位是 32 位字)
- tcp[12] & 0xf0:TCP 头长度字段。TCP 头部的第 13 字节的高 4 位表示 TCP 头的长度(单位是 32 位字)
- 0x47455420:ASCII 码 "GET " 的十六进制表示。
示例 2:捕获 VLAN 10 中所有的 TCP SYN 数据包,并显示详细信息
tcpdump -i eth0 -nn -vv 'vlan 10 and tcp[tcpflags] & tcp-syn != 0'
- -i eth0:指定网络接口 eth0。
- -nn:不解析主机名和端口号。
- -vv:显示详细的包头信息。
- ‘vlan 10 and tcp[tcpflags] & tcp-syn != 0’:过滤条件,捕获 VLAN 10 中所有 TCP SYN 数据包。
示例 3:捕获所有入方向的 ICMP 数据包,并显示数据包内容
tcpdump -i eth0 -Q in -X 'icmp'
- -i eth0:指定网络接口 eth0。
- -Q in:捕获入方向的数据包。
- -X:以十六进制和 ASCII 格式显示数据包内容。
- ‘icmp’:过滤条件,捕获所有 ICMP 数据包。
示例 4:捕获所有源 MAC 地址为特定地址的 TCP FIN 数据包
tcpdump -i eth0 'ether src 00:11:22:33:44:55 and tcp[tcpflags] & tcp-fin != 0'
- -i eth0:指定网络接口 eth0。
- ‘ether src 00:11:22:33:44:55 and tcp[tcpflags] & tcp-fin != 0’:过滤条件,捕获所有源 MAC 地址为特定地址的 TCP FIN 数据包。
示例 5:捕获并显示特定 IP 地址的 UDP 流量,包括十六进制内容
tcpdump -i eth0 -nn -X 'udp and host 192.168.1.100'
- -i eth0:指定网络接口 eth0。
- -nn:不解析主机名和端口号。
- -X:以十六进制和 ASCII 格式显示数据包内容。
- ‘udp and host 192.168.1.100’:过滤条件,捕获特定 IP 地址的 UDP 流量。
示例 6:捕获 HTTP POST 请求,并显示数据包内容
tcpdump -i eth0 -A -s 0 'tcp port 80 and (((ip[2:2] - ((ip[0] & 0xf)<<2)) - ((tcp[12] & 0xf0)>>2)) != 0) and tcp[((tcp[12] & 0xf0)>>2):4] = 0x504f5354'
- -i eth0:指定网络接口 eth0。
- -A:以 ASCII 格式显示数据包内容。
- -s 0:捕获完整的数据包。
- ‘tcp port 80 and …’:过滤条件,捕获 HTTP POST 请求。
示例 7:捕获特定端口范围的 UDP 流量,并设置捕获缓冲区大小
tcpdump -i eth0 -B 4096 'udp portrange 8000-8080'
- -i eth0:指定网络接口 eth0。
- -B 4096:设置捕获缓冲区大小为 4 MB。
- ‘udp portrange 8000-8080’:过滤条件,捕获特定端口范围的 UDP 流量。
示例 8:捕获所有 TCP 连接终止过程中的数据包(包括 FIN 和 RST 数据包)
tcpdump -i eth0 'tcp[tcpflags] & (tcp-fin|tcp-rst) != 0'
- -i eth0:指定网络接口 eth0。
- ‘tcp[tcpflags] & (tcp-fin|tcp-rst) != 0’:过滤条件,捕获所有 TCP 连接终止过程中的数据包。
简洁篇
示例 1:捕获 HTTP 和 HTTPS 流量并保存到文件
需求:捕获所有通过端口 80 和 443 的 HTTP 和 HTTPS 流量,将捕获的数据包保存到文件 http_https_traffic.pcap
,每个文件的大小上限为 10 MB,每 60 秒切换文件,最多保存 5 个文件。
tcpdump -i eth0 -w http_https_traffic.pcap -C 10 -G 60 -W 5 'tcp port 80 or tcp port 443'
示例 2:捕获特定网络内的所有 TCP 数据包,并显示详细信息
需求:捕获来自网络 192.168.1.0/24
的所有 TCP 数据包,显示详细的包头信息和内容。
tcpdump -i eth0 -nn -vv -X 'tcp and net 192.168.1.0/24'
示例 3:捕获并解密 IPsec 流量
需求:捕获并解密 IPsec 数据包,使用特定的密钥进行解密。
tcpdump -i eth0 -E 100@192.168.1.1 des3:0x0123456789ABCDEF 'esp'
示例 4:捕获并实时显示所有包含特定字符串的 HTTP 流量
需求:捕获并实时显示所有 HTTP 流量,并在包内容中搜索特定字符串 “password”。
tcpdump -i eth0 -A -s 0 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0) and tcp[((tcp[12]&0xf0)>>2):4] = 0x70617373'
示例 5:捕获所有带有 SYN 和 ACK 标志的 TCP 数据包
需求:捕获所有带有 SYN 和 ACK 标志的 TCP 数据包,以监视网络中的新连接建立。
tcpdump -i eth0 'tcp[tcpflags] & (tcp-syn|tcp-ack) == (tcp-syn|tcp-ack)'
示例 6:捕获特定 VLAN 中的 ICMP 数据包,并将输出显示为 ASCII 格式
需求:捕获 VLAN ID 为 10 的所有 ICMP 数据包,并以 ASCII 格式显示包内容。
tcpdump -i eth0 -A 'vlan 10 and icmp'
示例 7:捕获特定端口范围的 UDP 流量,并设置捕获缓冲区大小
需求:捕获端口范围 8000 到 8080 的所有 UDP 流量,并将捕获缓冲区大小设置为 4 MB,以防止丢包。
tcpdump -i eth0 -B 4096 'udp portrange 8000-8080'
示例 8:捕获并显示时间戳差异的 TCP 数据包
需求:捕获所有 TCP 数据包,并显示数据包之间的时间戳差异,以微秒为单位。
tcpdump -i eth0 -ttt 'tcp'
示例 9:捕获来自特定主机的 DNS 查询和响应
需求:捕获来自主机 192.168.1.1
的所有 DNS 查询和响应。
tcpdump -i eth0 'host 192.168.1.1 and port 53'
示例 10:捕获所有广播和多播数据包,并显示链路层信息
需求:捕获所有广播和多播数据包,并显示链路层头信息。
tcpdump -i eth0 -e '(broadcast or multicast)'
总结
- 选项顺序:在命令行中,选项通常出现在过滤条件之前。
- 过滤条件的使用:过滤条件需要用单引号
'
或双引号"
包围,以避免 shell 对其进行错误解析。 - 捕获缓冲区:使用
-B
选项设置捕获缓冲区大小,以防止丢包。 - 对于http: 使用 -A 选项是以 ASCII 格式显示数据包的内容。因为 HTTP 是一种基于文本的协议,其请求和响应内容都是可读的文本。通过使用 -A 选项,可以直接在终端中看到 HTTP 请求和响应的详细内容
- 更为复杂的话,可以使用tcpdump保存抓包文件,然后Linux版本的tshark图形化页面分析和过滤