我正在寻找记录的工具和重放TCP流的一侧,用于测试。 我看到的工具,记录测试防火墙和整个TCP流(服务器和客户端)这样的,但我正在寻找的是一个工具,它会记录只是由客户提出(与定时信息)的流量,然后重新提交到服务器进行测试。
Answer 1:
由于该TCP处理重传,序列号的方式SACK
和窗口,这可能是比你想象的更艰巨的任务。
通常人们使用tcpreplay分组重播; 但是,它不支持同步TCP序列号 。 既然你需要有一个双向的TCP流,(这需要序列编号的同步),使用下列选项之一:
如果这是一个非常交互式客户/服务器协议 ,您可以使用
scapy
剥夺了你流的TCP内容,分析了时间和交互性。 接着使用该信息,打开一个新的TCP套接字将您的服务器和数据反序列化为新的TCP套接字。 解析与原始流scapy
可能是棘手的,如果碰上TCP重传和窗口动态。 写字节到一个新的TCP套接字将不要求处理顺序编号自己......操作系统将采取照顾。如果这是一个简单的流,你可以没有时间做(或要插入手动计时信息),你可以使用Wireshark获取某个TCP蒸汽的原始字节,而不必担心与解析
scapy
。 之后,你有原始字节,写这些字节到一个新的TCP套接字(如需要占交互)。 写字节到一个新的TCP套接字将不要求处理顺序编号自己......操作系统将采取照顾。如果您的流是严格的文本(而不是HTML或XML)命令,如telnet会话,一个期待样的解决方案可能比上述解析更容易。 在这个解决方案,你就不会直接在代码中打开一个TCP套接字,使用期望
spawn
一个telnet(或其他)会议和重放与文本命令send
/expect
。 你想到库/底层操作系统会照顾序列编号的。如果你正在测试一个Web服务,我怀疑这将是更容易模拟一个真正的Web客户端通过与链接点击
Selenium
或Splinter
。 您的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地址等,所以该通信将正常流动。