在 tcpdump 中,基于比特(bit)或字节(byte)的过滤是一种高级功能,常用于精确匹配协议头中的特定字段或数据载荷。以下是其核心用法总结:
1. 基本语法:proto[x:y]
- 作用:提取协议头中从
x
字节开始的y
字节数据。 - 示例: •
ip[2:2]
:提取 IP 头的第 3、4 字节(总长度字段)。 •tcp[0:2]
:提取 TCP 头的第 1、2 字节(源端口号)。
2. 位运算过滤
通过逻辑运算符(&
、|
、!
)匹配特定比特位:
- 语法:
proto[x] & mask [operator] value
。 - 常用场景: • TCP 标志位: ◦
tcp[13] & 0x02 != 0
:匹配 SYN 包(第 13 字节的第 2 位为 1)。 ◦tcp[13] = 18
:匹配 SYN-ACK 包(二进制00010010
,即十进制 18)。 • IP 头长度: ◦ip[0] & 0x0f > 5
:匹配 IP 头长度超过 20 字节的包(IHL 字段大于 5)。 • 广播/多播: ◦ether[0] & 1 != 0
:匹配以太网广播或多播包(目的 MAC 首比特为 1)。
3. 高级字段匹配
- 可变长度头部处理: • TCP 数据偏移:通过
tcp[12] >> 4
计算 TCP 头的实际偏移(如tcp[(tcp[12]>>2):4]
跳过 TCP 头选项,直接读取应用层数据)。 - 应用层协议匹配: •
tcp[((tcp[12]>>2)+4):2] = 0x312E
:匹配 SSH 协议的版本号(如 “SSH-1.99″)。
4. 复合条件组合
通过逻辑运算符(and
、or
、not
)组合多个条件:
- 示例: •
ip[9] == 6
:匹配 IP 协议为 TCP 的包(协议号 6)。 •tcp dst port 80 and (tcp[13] & 0x10 != 0)
:匹配目标端口 80 且带 ACK 标志的包。
5. 注意事项
- 字节偏移计算:协议头字段的偏移需参考协议标准(如 IP 头为 20 字节,TCP 头至少 20 字节)。
- 工具辅助:使用 Wireshark 或协议文档确定字段位置,避免手动计算错误。
- 完整抓包:建议配合
-s 0
参数抓取完整报文,确保数据完整性。
典型示例
# 抓取 HTTP 请求中的 "GET" 方法(应用层数据)
tcpdump 'tcp[((tcp[12]>>2)+4):4] = 0x47455420' # "GET " 的十六进制
# 匹配分片 IP 包(Flags 字段)
tcpdump 'ip[6] & 0x20 != 0' # 第 6 字节的第 6 位为 1(More Fragments)
# 匹配 ICMP 回显请求(Type=8)
tcpdump 'icmp[0] = 8'
通过以上方法,可以实现对网络报文的精细化过滤,适用于协议分析、故障排查等场景。具体协议字段定义可参考 RFC 文档或工具解析(如 Wireshark)。
在 tcpdump 中过滤 HTTP GET 数据包的核心方法是通过 TCP 载荷的十六进制特征 匹配,以下是具体实现方式和优化技巧:
tcpdump过滤http get方法
1. 基础过滤命令
通过匹配 TCP 载荷中 “GET ” 的十六进制值 0x47455420
实现:
tcpdump -i eth0 'tcp[((tcp[12]>>2)):4] = 0x47455420'
- 原理: •
tcp[12]
提取 TCP 头第 13 字节(数据偏移字段),>>2
计算 TCP 头长度(单位为 4 字节)。 •((tcp[12]>>2)):4
跳过 TCP 头部,直接读取应用层数据的前 4 字节。 •0x47455420
是 “GET “(含空格)的十六进制形式。
2. 结合 TCP 标志位优化
添加 tcp-push
标志过滤(PSH 标志表示数据推送,GET 请求通常伴随此标志):
tcpdump -i eth0 'tcp[tcpflags] & tcp-push != 0 and tcp[((tcp[12]>>2)):4] = 0x47455420'
- 优势:减少误匹配,更精准捕获实际传输的 GET 请求。
3. 显示请求详情
通过 -A
参数显示 ASCII 内容,结合 grep
提取关键信息:
tcpdump -i eth0 -A -l | grep -i 'GET /'
- 适用场景:快速查看 GET 请求的 URL 路径,如
GET /index.html
。
4. 高级组合过滤
按目标端口(如 80 或 8080)和 IP 地址进一步筛选:
tcpdump -i eth0 'port 80 and host 192.168.1.100 and tcp[((tcp[12]>>2)):4] = 0x47455420'
- 用途:针对特定服务的流量分析。
5. 保存抓包文件
将结果保存为 .pcap
文件,供 Wireshark 深入分析:
tcpdump -i eth0 -w get_requests.pcap 'tcp[((tcp[12]>>2)):4] = 0x47455420'
- 最佳实践:配合
-s 0
确保捕获完整数据包。
注意事项
- 偏移量计算:不同协议头的长度可能影响偏移量(如 IP 头含选项时需调整)。
- 数据分片:大文件请求可能分片传输,需结合
tcp.stream
或follow stream
分析完整请求。 - 校验和错误:若出现
cksum incorrect
警告,可忽略(因校验由网卡硬件完成)。
典型示例
# 抓取所有 GET 请求并显示 URL
tcpdump -i eth0 -A -s0 'tcp[((tcp[12]>>2)):4] = 0x47455420' | grep "GET"
# 抓取目标为 80 端口的 GET 请求并保存
tcpdump -i eth0 -w http_get.pcap 'port 80 and tcp[((tcp[12]>>2)):4] = 0x47455420'
通过上述方法,可高效捕获并分析 HTTP GET 请求,适用于性能调优、安全审计等场景。如需更复杂过滤(如特定 URL 或参数),建议结合 Wireshark 的显示过滤器。