Wireshark之pcap文件流量回放的方法

应公司要求编写了一个流量转发加消息格式转换的程序,但是老是报错。于是使用 wireshark 抓包保存成 pcap 文件,然后想通过流量回放复现程序报错原因。下面研究一下流量回放的方法。

工具介绍

tcpreplay

tcpreplay是一款强大的网络数据包重放工具,它可以将捕获到的网络流量(通常是pcap格式的文件)重新重放到网络中,实现对网络通信的重现。这在网络故障排查、安全测试、性能测试、开发调试等场景下具有广泛的应用。同时,tcpreplay不仅仅能重放TCP协议报文,它支持重放所有协议报文,同时支持IPv4和IPv6协议栈,不要被命名误导了,类比tcpdump的命名,tcpdump也能抓取所有协议报文而不仅仅是TCP。

TCPReplay包含几个核心组件和功能:

  • tcpreplay,将捕获的网络流量(pcap文件)重放回网络,可控制重放速度、循环次数、输出接口等。
  • tcprewrite,修改pcap文件中的数据包内容,例如修改IP地址、端口号、MAC地址等,用于模拟不同的网络环境或进行安全测试。
  • tcpprep,将pcap文件中的数据包按照客户端和服务器进行分类,为后续的重放做准备。可提高重放效率,特别是对于大型pcap文件。
  • tcpbridge,在两个网络之间建立桥接,将修改后的流量转发到不同的网络。从而实现网络流量的隔离和转发。
  • tcpcapinfo,对pcap文件进行解码和调试。可用于分析pcap文件的内容,检查数据包的格式和内容。

回放操作

在进行重放之前,最好能预先确认是将整个pcap文件重放,还是有选择性的筛选特定报文再重放。

完整重放

具体步骤如下:

  • 使用 wireshark 或 tcpdump 抓包,生成 pcap 文件
1
tcpdump -i eth0 -nn host 192.168.1.8 and \( tcp port 80 or icmp \) -v -w client.pcap
  • 针对TCP流量,更新下client.pcap报文中TCP下的checksum校验和,并输出为client_fix.pcap。
1
tcprewrite --infile=client.pcap --outfile=client_fix.pcap --fixcsum

校验和(checksum)是通过对数据进行计算得到的一个数值,发送方和接收方会对相同的数据计算出相同的校验和。如果接收方计算出的校验和与发送方提供的校验和不一致,就说明数据在传输过程中发生了错误,接收方会丢弃该数据包,比如不做csum更新的话,对端收到重放包,校验不对,是不会正常响应的,直接丢弃掉:

  • 完整回放 pcap 文件
1
tcpreplay -v -t -i eth0 client_fix.pcap #-v参数可以看到重放的每一帧的细节;-t参数尽可能快的重放数据包

筛选重放

具体步骤如下:

  • 筛选 pcap 文件。

Wireshark直接输入过滤表达式后,在左上角选项栏点击 文件(File)–> 导出特定分组(Export Specified Packets)即可。

  • 修改 pcap 文件的 ip 和 mac 。
1
tcprewrite --infile=client_src.pcap --outfile=client_src_rewrite.pcap -S 0.0.0.0/0:192.168.1.12 -D 0.0.0.0/0:192.168.1.72 --enet-smac=00:50:56:81:8e:44 --enet-dmac=00:50:56:81:be:58
  • 流量回放

参考链接

  1. pcap回放——tcpreplay,by zhuxian2009.
  2. TCPreplay网络报文/流量重放实战指南: PCAP包的重写与重放,by RokasYang.
  3. 使用 wireshark 查看 tcpdump 的抓包结果,by mozillazg.
  4. Linux下Pcap包重放工具Tcpreplay的简单使用,by yuanfan2012.