我的 Web 应用程序中有一个我无法重现的错误。所有日志看起来都正常,或者至少我看不到任何异常。但它确实发生了。所以我想我可以记录所有往返于我网站的流量,等待错误发生,然后以某种方式在我的测试环境中重播它。它确实发生了!所以我有这样捕获的数据:
tcpdump -s 1514 -X tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0) -Z root -C 20 -W 1000 -w capture.cap
我不知道该如何处理它。我有一个虚拟机运行着相同版本的 Web 应用程序,我想在其中重播录制的数据。我应该如何处理?
[编辑]
我尝试过这样做tcpreplay下列的这个例子但我的网络服务器没有记录任何流量。
我的测试机器(Fedora 8)在 VMWare Player 中运行。假设机器的 IP 为 192.168.41.128,并且它有一个网络接口:eth0(环回除外)——示例中的步骤 #2 和 #3 在我的例子中应该是什么样子?我应该在同一台机器上运行它还是在另一台机器上运行它?
答案1
您有几个选择,它们都很酷,但没有一个是嵌入式产品。需要组装。
- 这是PERL 应用程序 Sprocket能够重播网络流量。以下是原始的 PERL。
- 有TCP重播。
- 如果你使用 Varnish 服务器,你可以使用varnishreplay。
- 还有一个名为“预播“适用于 Windows 机器。
- JWireReplay将重放 tcpdump 捕获。
您可能想要做的是忘记已经检查过的日志,或者至少放弃重播这些文件的任何想法。设置其中一个系统并以受控的方式使用它来测试您的流量。
答案2
您可以使用tcptrace
将 pcap 文件转换为单独的请求,然后可以使用重放netcat
。以下是示例:
tcpdump -s 0 port http -i en0 -w dump.pcap
tcptrace -e dump.pcap
cat *.dat | nc -v <IP_OF_YOUR_TEST_HOST>
第二步可能会创建太多文件,导致*
无法正常工作。在这种情况下,对第三条命令使用 for 循环:
for file in $(ls | grep .dat); do cat $file | nc -v <IP_OF_YOUR_TEST_HOST>; done
请注意,这可能比您原来的流量慢。
答案3
GoReplay 旨在捕获生产流量并在测试环境中重放。请参阅https://goreplay.org/或者https://github.com/buger/goreplay/wiki了解更多信息。