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