tshark vs tcpdump:哪个命令行抓包神器更适合你?(内附常用参数与实战技巧)

337 阅读8分钟

在网络问题排查、安全分析或性能调优时,抓取和分析网络数据包是至关重要的环节。虽然 Wireshark 提供了强大的图形化界面,但在服务器环境、自动化脚本或偏好命令行的场景下,tsharktcpdump 是两款非常得力的工具。

一、tshark:Wireshark 的命令行兄弟

tshark 是 Wireshark 网络协议分析器的命令行版本。它能够捕获实时数据包或读取已保存的捕获文件,并打印已解码的数据包摘要或详细信息。tshark 最大的优势在于它继承了 Wireshark 对海量协议的解析能力和强大的显示过滤器语法。

1.1 tshark 是什么?

tshark 允许你在终端中执行 Wireshark 的许多功能,特别适合在没有图形界面的服务器上进行抓包和初步分析,或者集成到自动化脚本中。

1.2 tshark 常用参数

以下是一些 tshark 的常用参数:

  • 接口与捕获控制:

    • -D: 列出可用的网络接口。
      tshark -D
      
    • -i <interface_name>: 指定捕获的网络接口。例如,捕获 eth0 接口的数据。
      tshark -i eth0
      
    • -c <packet_count>: 捕获指定数量的数据包后停止。
      tshark -i eth0 -c 1000
      
    • -a <duration:seconds>: 捕获指定时长后停止。例如,捕获60秒。
      tshark -i eth0 -a duration:60
      
  • 文件操作:

    • -w <output_file.pcapng>: 将捕获的原始数据包写入文件(推荐使用 .pcapng 格式,但 .pcap 也很常见)。
      tshark -i eth0 -w capture.pcapng
      
    • -r <input_file.pcapng>: 从文件中读取数据包进行分析。
      tshark -r capture.pcapng
      
    • -F <file_format>: 设置输出文件的格式,如 pcap
      tshark -i eth0 -F pcap -w capture.pcap
      
  • 过滤:

    • -f <capture_filter>: 使用捕获过滤器(BPF 语法,与 tcpdump 类似),在捕获时过滤数据包。
      tshark -i eth0 -f "tcp port 80"
      
    • -Y <display_filter>: 使用显示过滤器(Wireshark 的强大过滤语法),在分析时过滤数据包。这是 tshark 相对于 tcpdump 的一大优势。
      tshark -r capture.pcapng -Y "http.request.method == GET"
      tshark -r capture.pcapng -Y "tcp.flags.syn == 1 && tcp.flags.ack == 0"
      
  • 输出格式与字段选择:

    • -T <fields|ek|json|pdml|ps|psml|tabs|text>: 控制输出格式。
      • fields: 用于配合 -e 选择特定字段输出。
      • ek: Elasticsearch 的批量提交格式.
      • json: JSON 格式.
      • pdml: xml 格式t.
      • text: 默认的摘要行输出。
    • -e <field_name>: 当 -T fields 时,指定要输出的协议字段。Wireshark 有非常丰富的字段可供选择。
      tshark -r capture.pcapng -T fields -e frame.number -e ip.src -e ip.dst -e tcp.port -e _ws.col.Protocol -e _ws.col.Info
      
      _ws.col.Protocol_ws.col.Info 是 Wireshark 列的特殊字段)
    • -E <separator=c>: 在 -T fields 模式下,指定字段间的分隔符,默认为制表符。例如,使用逗号分隔:
      tshark -r capture.pcapng -T fields -e ip.src -e ip.dst -E separator=,
      
    • -q: 安静模式,通常与 -z 选项一起使用,禁止标准输出上的数据包详情。
  • 常用字段示例*

    -e 参数支持几乎所有 Wireshark 的显示过滤器字段。常见字段如下:

    字段分类示例字段说明
    通用元信息frame.number数据包序号
    frame.time捕获时间
    frame.len数据包长度
    IP 层ip.src源 IP 地址
    ip.dst目标 IP 地址
    ip.protoIP 协议类型(如 TCP=6)
    TCP/UDPtcp.srcportTCP 源端口
    tcp.dstportTCP 目标端口
    udp.srcportUDP 源端口
    HTTPhttp.request.methodHTTP 请求方法(GET/POST)
    http.hostHTTP 请求的 Host 头
    DNSdns.qry.nameDNS 查询的域名
    dns.resp.addrDNS 响应地址
    ICMPicmp.typeICMP 类型字段
    TLS/SSLtls.handshake.extensions_server_nameTLS 服务器名称(SNI)

    可以使用如下命令来查有哪些字段

     tshark -G fields | grep -i "http"
    

    提取 HTTP 请求的 URL 和方法

    tshark -r input.pcap -Y "http" -T fields -e http.request.method -e http.request.uri
    
  • 统计分析:

    • `-z <statistic

    `: 生成各种统计信息。 ```bash

    tshark -r capture.pcapng -q -z conv,ip  # IP 会话统计
    tshark -r capture.pcapng -q -z conv,tcp # TCP 会话统计
    tshark -r capture.pcapng -q -z io,phs   # 协议分层统计
    ```
    

更多参数和详细用法可以参考 tshark 的官方手册:man tshark 或 。

二、tcpdump:经典的网络嗅探器

tcpdump 是一款强大且轻量级的命令行网络数据包分析器,它在 Unix-like 系统(包括 Linux 和 macOS)上几乎是标配。它使用 BPF (Berkeley Packet Filter) 语法进行数据包过滤,非常高效。

2.1 tcpdump 是什么?

tcpdump 直接在链路层捕获数据包,并可以将捕获到的数据包的头部或完整内容打印出来,或者保存到文件中供后续分析。由于其轻量和高效,tcpdump 非常适合在资源受限的服务器上进行长时间的后台抓包。

2.2 tcpdump 常用参数

你平时在 Linux 上用 tcpdump 比较多,应该对这些参数比较熟悉:

  • 接口与捕获控制:

    • -D: 列出系统上可用的网络接口。
      tcpdump -D
      
    • -i <interface_name>: 指定要监听的网络接口。例如 eth0any (监听所有接口)。
      tcpdump -i eth0
      tcpdump -i any
      
    • -c <packet_count>: 捕获指定数量的数据包后停止。
      tcpdump -i eth0 -c 100
      
  • 文件操作:

    • -w <output_file.pcap>: 将捕获的原始数据包写入文件。
      tcpdump -i eth0 -w capture.pcap
      
    • -r <input_file.pcap>: 从文件中读取数据包进行分析。
      tcpdump -r capture.pcap
      
  • 输出详细程度与格式:

    • -n: 不将地址(如 IP 地址)转换为主机名。
    • -nn: 不将地址和端口号转换为名称。
    • -N: 不打印域名。
    • -q: 快速输出,只打印较少的信息。
    • -v, -vv, -vvv: 输出更详细的信息。级别越高,信息越详细。
    • -X: 以十六进制和 ASCII 码形式打印每个数据包的内容(不包括链路层头部)。
    • -XX: 以十六进制和 ASCII 码形式打印每个数据包的内容,包括其链路层头部。
    • -s <snaplen>: 设置每个数据包捕获的字节数(snapshot length)。默认通常是 262144 字节。设置为 0 (-s0) 可以捕获完整的数据包。对于只关心头部信息的情况,可以设置较小的值以节省空间和提高性能。
      tcpdump -i eth0 -s0 -w full_capture.pcap
      
    • -e: 打印链路层头部信息。
  • 过滤 (BPF 表达式): tcpdump 的核心功能之一是其强大的 BPF 过滤表达式。

    • 类型 (Type qualifiers): host, net, port, portrange
      tcpdump host 192.168.1.100
      tcpdump net 192.168.0.0/16
      tcpdump port 80
      tcpdump portrange 21-23
      
    • 方向 (Direction qualifiers): src, dst
      tcpdump src host 192.168.1.100
      tcpdump dst port 80
      
    • 协议 (Proto qualifiers): tcp, udp, icmp, arp, ip, ip6
      tcpdump tcp
      tcpdump udp port 53
      tcpdump icmp
      
    • 逻辑操作符: and (或 &&), or (或 ||), not (或 !)
      tcpdump src host 10.0.0.1 and tcp port 443
      tcpdump 'host www.example.com or host example.org'
      tcpdump 'port 80 or port 443'
      tcpdump 'tcp and (port 80 or port 443)'
      tcpdump 'not arp and not icmp'
      
    • 其他常用表达式:
      • 捕获 SYN 包: tcp[tcpflags] & tcp-syn != 0
      • 捕获 FIN 包: tcp[tcpflags] & tcp-fin != 0
      • 捕获 RST 包: tcp[tcpflags] & tcp-rst != 0
      • 捕获特定大小的数据包: less <length>, greater <length>
        tcpdump less 32
        tcpdump greater 1024
        

更多参数和 BPF 语法可以参考 tcpdump 的官方手册:man tcpdump

三、tshark vs. tcpdump 对比

特性tsharktcpdump
基本定位Wireshark 的命令行版本经典的轻量级命令行抓包工具
协议解析非常强大,支持数千种协议的深度解析基本的协议识别,不如 tshark 详细
过滤支持捕获过滤器 (BPF) 和显示过滤器 (Wireshark)主要使用 BPF 捕获过滤器
输出灵活多样,可输出详细字段、JSON、XML 等主要是文本摘要,可输出十六进制/ASCII
资源消耗相对较高,尤其在进行复杂解析时非常轻量,资源消耗低
依赖通常随 Wireshark 安装,依赖 Wireshark 库通常系统自带或易于安装,依赖 libpcap
易用性显示过滤器语法更直观易懂,字段名明确BPF 语法灵活但可能需要学习曲线
主要优势强大的协议解析和显示过滤能力,输出格式丰富轻量高效,广泛可用,BPF 性能好
适用场景需要详细协议分析、自动化脚本、服务器端分析快速抓包、长时间监控、资源受限环境、BPF 过滤

3.1 过滤能力的差异

  • tcpdump: 主要依赖 BPF (Berkeley Packet Filter) 语法进行 捕获时 过滤。这意味着只有符合条件的数据包才会被 tcpdump 处理和记录。BPF 非常高效,直接在内核层面工作。
  • tshark:
    • 可以使用 -f 参数配合 BPF 语法进行 捕获时 过滤,与 tcpdump 类似。
    • 其更强大的特性是 -Y 参数,使用 Wireshark 的显示过滤器语法,在 读取或显示时 进行过滤。这意味着 tshark 可以先捕获所有数据(或经过 BPF 初步过滤的数据),然后在分析阶段使用更灵活和丰富的显示过滤器进行筛选。显示过滤器可以直接引用协议的深层字段,例如 http.request.method

3.2 输出和分析能力的差异

  • tcpdump: 输出相对简洁,主要提供数据包的摘要信息。通过 -X-XX 可以查看原始数据,但协议解析的深度和友好性不如 tshark
  • tshark: 能够利用 Wireshark 的协议解析引擎,输出非常详细的协议字段信息。-T fields -e <field> 组合非常强大,可以精确提取所需信息。同时支持 JSON、PDML 等多种格式,方便与其他工具集成。

3.3 使用场景建议

  • 当你需要快速在服务器上抓取特定流量并保存,且对协议细节分析要求不高时tcpdump 通常是首选,因为它轻量且高效。例如,抓取某个 IP 或端口的所有流量用于后续分析。

    # 在服务器上抓取所有到 1.2.3.4 的 TCP 流量,保存到文件
    tcpdump -i eth0 -w capture.pcap host 1.2.3.4 and tcp
    
  • 当你需要在服务器上进行初步的协议分析,或者需要提取特定协议的特定字段时tshark 更具优势。

    # 在服务器上分析 pcap 文件,找出所有 HTTP GET 请求的 Host 和 URI
    tshark -r capture.pcap -Y "http.request.method == GET" -T fields -e http.host -e http.request.uri
    
  • 当你需要进行自动化抓包和分析,并利用 Wireshark 强大的协议解析能力时tshark 是不二之选。

  • 当你需要在资源非常受限的环境中抓包时tcpdump 的资源消耗更低。

  • 当你已经有一个 .pcap 文件,想用命令行快速过滤和查看,且熟悉 Wireshark 显示过滤器时tshark-r-Y 组合非常方便。