Skip to content

tshark 过滤器完全指南

tshark 的过滤器是网络分析和故障排除的核心工具,它们允许我们从海量的网络数据包中精确定位我们需要分析的数据。本文将详细介绍各种过滤器的使用方法和实际应用场景。

过滤器基础概念

tshark 支持两种主要的过滤器类型:

  1. 捕获过滤器(Capture Filters):在数据包捕获阶段就进行过滤,减少资源消耗
  2. 显示过滤器(Display Filters):对已捕获的数据包进行过滤显示

TIP

在生产环境中,优先使用捕获过滤器可以显著提升性能,特别是在高流量网络环境下。

常用过滤器分类

1. 协议过滤器

HTTP/HTTPS 相关

bash
# 捕获所有 HTTP 流量
tshark -i eth0 -f "port 80"

# 捕获 HTTPS 流量
tshark -i eth0 -f "port 443"

# 显示过滤:只显示 HTTP GET 请求
tshark -r capture.pcap -Y "http.request.method == GET"

# 显示包含特定 User-Agent 的请求
tshark -r capture.pcap -Y 'http.user_agent contains "Chrome"'

NOTE

在 Web 应用性能分析中,HTTP 过滤器是最常用的工具之一。

TCP 连接分析

bash
# 捕获特定端口的 TCP 流量
tshark -i eth0 -f "tcp port 8080"

# 显示 TCP 三次握手
tshark -r capture.pcap -Y "tcp.flags.syn == 1"

# 显示 TCP 连接重置
tshark -r capture.pcap -Y "tcp.flags.reset == 1"

# 显示 TCP 重传包
tshark -r capture.pcap -Y "tcp.analysis.retransmission"

DNS 查询分析

bash
# 捕获所有 DNS 流量
tshark -i eth0 -f "port 53"

# 显示 DNS 查询请求
tshark -r capture.pcap -Y "dns.flags.response == 0"

# 显示特定域名的 DNS 查询
tshark -r capture.pcap -Y 'dns.qry.name contains "example.com"'

# 显示 DNS 解析失败的响应
tshark -r capture.pcap -Y "dns.flags.rcode != 0"

2. IP 地址过滤器

源和目标地址

bash
# 捕获来自特定 IP 的流量
tshark -i eth0 -f "src host 192.168.1.100"

# 捕获发往特定 IP 的流量
tshark -i eth0 -f "dst host 10.0.0.1"

# 双向流量过滤
tshark -i eth0 -f "host 192.168.1.100"

# 网段过滤
tshark -i eth0 -f "net 192.168.1.0/24"

# 排除特定 IP
tshark -i eth0 -f "not host 192.168.1.1"

实际业务场景示例

故障排除:客户端无法访问服务器
bash
# 步骤1: 检查客户端到服务器的连接
tshark -i eth0 -f "host 192.168.1.100 and host 10.0.0.50"

# 步骤2: 检查是否有 TCP 握手
tshark -r capture.pcap -Y "ip.src == 192.168.1.100 and ip.dst == 10.0.0.50 and tcp.flags.syn == 1"

# 步骤3: 检查服务器响应
tshark -r capture.pcap -Y "ip.src == 10.0.0.50 and ip.dst == 192.168.1.100 and tcp.flags.syn == 1 and tcp.flags.ack == 1"

3. 端口过滤器

常用端口过滤

bash
# Web 服务器流量
tshark -i eth0 -f "port 80 or port 443"

# 数据库流量
tshark -i eth0 -f "port 3306 or port 5432 or port 1521"

# SSH 流量
tshark -i eth0 -f "port 22"

# 邮件服务流量
tshark -i eth0 -f "port 25 or port 110 or port 143 or port 993 or port 995"

# 端口范围过滤
tshark -i eth0 -f "portrange 8000-9000"

4. 高级组合过滤器

逻辑运算符

bash
# AND 运算
tshark -i eth0 -f "host 192.168.1.100 and port 80"

# OR 运算
tshark -i eth0 -f "port 80 or port 443"

# NOT 运算
tshark -i eth0 -f "not port 22"

# 复杂组合
tshark -i eth0 -f "(host 192.168.1.100 or host 192.168.1.101) and (port 80 or port 443)"

数据包大小过滤

bash
# 大包过滤(可能的 DDoS 攻击)
tshark -i eth0 -f "greater 1500"

# 小包过滤
tshark -i eth0 -f "less 64"

# 特定大小范围
tshark -r capture.pcap -Y "frame.len > 1000 and frame.len < 1500"

实际业务场景应用

场景 1:Web 应用性能监控

监控命令示例:

bash
# 监控 Web 服务器响应时间
tshark -i eth0 -f "port 80" -T fields -e frame.time_relative -e http.response.code -e http.time

# 分析数据库连接性能
tshark -i eth0 -f "port 3306" -Y "mysql.query" -T fields -e frame.time_relative -e mysql.query

# 检测慢响应
tshark -r capture.pcap -Y "http.time > 2.0"

场景 2:安全事件调查

bash
# 检测可疑的大量连接
tshark -r capture.pcap -Y "tcp.flags.syn == 1" | \
  awk '{print $3}' | sort | uniq -c | sort -nr | head -10

# 检测端口扫描
tshark -r capture.pcap -Y "tcp.flags.syn == 1 and tcp.flags.ack == 0" \
  -T fields -e ip.src -e tcp.dstport | \
  awk '{print $1}' | sort | uniq -c | sort -nr

# 检测异常 DNS 查询
tshark -r capture.pcap -Y 'dns.qry.name matches ".*\.tk$|.*\.ml$"'

场景 3:网络故障诊断

bash
# 检测网络连接问题
tshark -i eth0 -f "icmp" -Y "icmp.type == 3"

# 分析 TCP 重传问题
tshark -r capture.pcap -Y "tcp.analysis.retransmission" \
  -T fields -e frame.time_relative -e ip.src -e ip.dst -e tcp.seq

# 检测网络拥塞
tshark -r capture.pcap -Y "tcp.analysis.window_full"

常用显示过滤器表达式

时间相关过滤

bash
# 特定时间范围内的数据包
tshark -r capture.pcap -Y "frame.time >= \"2024-01-01 00:00:00\" and frame.time <= \"2024-01-01 23:59:59\""

# 相对时间过滤(从开始后10秒内)
tshark -r capture.pcap -Y "frame.time_relative <= 10"

字符串匹配过滤

bash
# 包含特定字符串的数据包
tshark -r capture.pcap -Y 'data contains "password"'

# 正则表达式匹配
tshark -r capture.pcap -Y 'http.host matches ".*\.evil\.com"'

# HTTP 响应状态码过滤
tshark -r capture.pcap -Y "http.response.code >= 400"

协议层过滤

bash
# 应用层数据过滤
tshark -r capture.pcap -Y "data.len > 0"

# SSL/TLS 握手分析
tshark -r capture.pcap -Y "ssl.handshake.type == 1"

# 检测未加密的敏感数据传输
tshark -r capture.pcap -Y 'data contains "username" and not ssl'

性能优化建议

IMPORTANT

在高流量环境下使用 tshark 时,应该注意以下性能优化策略:

1. 使用捕获过滤器

bash
# 好的做法:在捕获阶段就过滤 #
tshark -i eth0 -f "host 192.168.1.100 and port 80"

# 避免的做法:捕获所有数据包后再过滤 #
tshark -i eth0 -Y "ip.addr == 192.168.1.100 and tcp.port == 80"

2. 限制捕获时间和数量

bash
# 限制捕获时间(60秒)
tshark -i eth0 -a duration:60

# 限制捕获包数量(1000个包)
tshark -i eth0 -c 1000

# 限制文件大小(100MB)
tshark -i eth0 -a filesize:100000

3. 使用环形缓冲区

bash
# 创建环形缓冲区,每个文件10MB,最多保存5个文件
tshark -i eth0 -b filesize:10000 -b files:5 -w capture

故障排除工作流

常见错误和解决方案

1. 权限问题

bash
# 错误:Permission denied #
# 解决方案:使用 sudo 或配置用户权限
sudo tshark -i eth0

# 或者将用户添加到 wireshark 组
sudo usermod -a -G wireshark $USER 

2. 网卡名称错误

bash
# 查看可用网络接口
tshark -D

# 使用正确的接口名称
tshark -i ens33 -f "port 80"

3. 过滤器语法错误

bash
# 错误的语法 #
tshark -f "host = 192.168.1.100"

# 正确的语法 #
tshark -f "host 192.168.1.100"

CAUTION

在生产环境中使用 tshark 进行数据包捕获时,请注意数据隐私和安全合规要求。避免捕获包含敏感信息的数据包,或确保适当的数据处理和存储安全措施。

总结

tshark 的过滤器是网络分析的强大工具,通过合理使用各种过滤器组合,可以高效地解决网络故障、性能优化和安全分析等问题。关键是要根据具体的业务场景选择合适的过滤策略,并注意性能优化和安全合规。