应公司要求编写了一个流量转发加消息格式转换的程序,但是老是报错。于是使用 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 |
- 流量回放
参考链接
- pcap回放——tcpreplay,by zhuxian2009.
- TCPreplay网络报文/流量重放实战指南: PCAP包的重写与重放,by RokasYang.
- 使用 wireshark 查看 tcpdump 的抓包结果,by mozillazg.
- Linux下Pcap包重放工具Tcpreplay的简单使用,by yuanfan2012.