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