TCP比特(字节)过滤方法

在 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. 复合条件组合
通过逻辑运算符(andornot)组合多个条件:

  • 示例: • 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 确保捕获完整数据包。

注意事项

  1. 偏移量计算:不同协议头的长度可能影响偏移量(如 IP 头含选项时需调整)。
  2. 数据分片:大文件请求可能分片传输,需结合 tcp.streamfollow stream 分析完整请求。
  3. 校验和错误:若出现 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 的显示过滤器。

此条目发表在未分类分类目录,贴了, , , 标签。将固定链接加入收藏夹。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注