TCP流回放工具(tcp stream replay tool)

2019-07-29 16:38发布

我正在寻找记录的工具和重放TCP流的一侧,用于测试。 我看到的工具,记录测试防火墙和整个TCP流(服务器和客户端)这样的,但我正在寻找的是一个工具,它会记录只是由客户提出(与定时信息)的流量,然后重新提交到服务器进行测试。

Answer 1:

由于该TCP处理重传,序列号的方式SACK和窗口,这可能是比你想象的更艰巨的任务。

通常人们使用tcpreplay分组重播; 但是,它不支持同步TCP序列号 。 既然你需要有一个双向的TCP流,(这需要序列编号的同步),使用下列选项之一:

  1. 如果这是一个非常交互式客户/服务器协议 ,您可以使用scapy剥夺了你流的TCP内容,分析了时间和交互性。 接着使用该信息,打开一个新的TCP套接字将您的服务器和数据反序列化为新的TCP套接字。 解析与原始流scapy可能是棘手的,如果碰上TCP重传和窗口动态。 写字节到一个新的TCP套接字将不要求处理顺序编号自己......操作系统将采取照顾。

  2. 如果这是一个简单的流,你可以没有时间做(或要插入手动计时信息),你可以使用Wireshark获取某个TCP蒸汽的原始字节,而不必担心与解析scapy 。 之后,你有原始字节,写这些字节到一个新的TCP套接字(如需要占交互)。 写字节到一个新的TCP套接字将不要求处理顺序编号自己......操作系统将采取照顾。

  3. 如果您的流是严格的文本(而不是HTML或XML)命令,如telnet会话,一个期待样的解决方案可能比上述解析更容易。 在这个解决方案,你就不会直接在代码中打开一个TCP套接字,使用期望spawn一个telnet(或其他)会议和重放与文本命令send / expect 。 你想到库/底层操作系统会照顾序列编号的。

  4. 如果你正在测试一个Web服务,我怀疑这将是更容易模拟一个真正的Web客户端通过与链接点击SeleniumSplinter 。 您的HTTP库/底层操作系统会照顾NGF的新流中的编号。



Answer 2:

看一看WirePlay code.google.com/p/wireplay或github.com/abhisek/wireplay它承诺根据需要与所有的SYN / ACK的序列号的修改来重放所捕获的TCP会话的客户端或服务器端。

我不知道是否有任何二进制生成可用,你需要自己编译。

注意:我还没有尝试过这个自己还没有,但我寻找到它。



Answer 3:

是的,这是实现这类工具的一个艰巨的任务。 我从两年前开始实行这种工具和工具现在是成熟的。 试试吧,也许你会发现,它是您正在寻找的工具。

https://github.com/wangbin579/tcpcopy



Answer 4:

我想类似的东西,所以我与Scapy的工作了位,并为我工作的解决方案上来。 我的目标是重播捕获PCAP文件的客户端部分。 我感兴趣的是从服务器获得响应 - 不一定与时序。 下面是我的Scapy的解决方案 - 这是没有测试或完整的方法,但它确实是我想要做的事。 希望这是一个如何使用重播一Scapy的TCP流一个很好的例子。

from scapy.all import *
import sys

#NOTE - This script assumes that there is only 1 TCP stream in the PCAP file and that 
# you wish to replay the role of the client

#acks
ACK = 0x10
#client closing the connection
RSTACK = 0x14

def replay(infile, inface):
    recvSeqNum = 0
    first = True
    targetIp = None
    #send will put the correct src ip and mac in
    #this assumes that the client portion of the stream is being replayed
    for p in rdpcap(infile):
        if 'IP' in p and 'TCP' in p:
            ip = p[IP]
            eth = p[Ether]
            tcp = p[TCP]
            if targetIp == None:
                #figure out the target ip we're interested in
                targetIp = ip.dst
                print(targetIp)
            elif ip.dst != targetIp:
                # don't replay a packet that isn't to our target ip
                continue
            # delete checksums so that they are recalculated
            del ip.chksum
            del tcp.chksum
            if tcp.flags == ACK or tcp.flags == RSTACK:
                tcp.ack = recvSeqNum+1
                if first or tcp.flags == RSTACK:
                    # don't expect a response from these
                    sendp(p, iface=inface)
                    first=False
                    continue

            rcv = srp1(p, iface=inface)
            recvSeqNum = rcv[TCP].seq

def printUsage(prog):
    print("%s <pcapPath> <interface>" % prog)

if __name__ == "__main__":
    if 3 != len(sys.argv):
        printUsage(sys.argv[0])
        exit(1)
    replay(sys.argv[1], sys.argv[2])


Answer 5:

记录完整的TCP客户机/服务器通信的数据包捕获。 然后,你可以使用tcpliveplay只是通信的客户端重播到一个真正的服务器。 tcpliveplay将生成新的序列号,IP地址,MAC地址等,所以该通信将正常流动。



文章来源: tcp stream replay tool