Инструмент воспроизведения tcp stream
Я ищу инструмент для записи и воспроизведения одной стороны потока TCP для тестирования.
Я вижу инструменты, которые записывают весь поток TCP (как сервер, так и клиент) для тестирования брандмауэров и т.д., Но то, что я ищу, - это инструмент, который будет записывать только трафик, отправленный клиентом (с информацией о времени), а затем повторно отправить его на сервер для тестирования.
Ответы
Ответ 1
В связи с тем, что TCP обрабатывает повторные передачи, порядковые номера, SACK
, и это может быть более сложной задачей, чем вы себе представляете.
Обычно люди используют tcpreplay для воспроизведения пакетов; однако не поддерживает синхронизацию порядковых номеров TCP. Поскольку вам необходимо иметь двунаправленный поток TCP (и для этого требуется синхронизация нумерации seq), используйте одну из следующих опций:
-
Если это очень интерактивный клиент/серверный протокол, вы можете использовать scapy
, чтобы отключить содержимое TCP вашего поток, анализ времени и интерактивности. Затем используйте эту информацию, откройте новый TCP-сокет на своем сервере и десериализуйте эти данные в новый сокет TCP. Анализ исходного потока с помощью scapy
может быть сложным, если вы запускаете повторные передачи TCP и динамику окон. Написание байтов в новый TCP-сокет не потребует обработки нумерации последовательностей... OS позаботится об этом.
-
Если это простой поток, и вы можете обойтись без синхронизации (или хотите вручную вставить информацию о синхронизации), вы можете использовать wirehark для получения необработанных байтов из паролей TCP, не беспокоясь о разборе с scapy
. После того, как у вас есть необработанные байты, напишите эти байты в новый TCP-сокет (с учетом интерактивности). Написание байтов в новый TCP-сокет не потребует обработки нумерации последовательностей... OS позаботится об этом.
-
Если ваш поток - это строго текстовые (но не html или xml) команды, такие как сеанс telnet, Expect -подобное решение может быть проще, чем вышеупомянутый синтаксический анализ. В этом решении вы не должны открывать TCP-сокет непосредственно из вашего кода, используя ожидание spawn
сеанса telnet (или любого другого) и повторять текстовые команды с помощью send
/expect
. Ваша библиотека ожидания/базовая ОС позаботится о нумерации по порядку.
-
Если вы тестируете веб-сервис, я подозреваю, что было бы намного проще имитировать реального веб-клиента, нажимая ссылки на Selenium
или Splinter
. Ваша библиотека http/базовая ОС позаботится о нумерации номеров в новом потоке.
Ответ 2
Взгляните на WirePlay code.google.com/p/wireplay или github.com/abhisek/wireplay, который promises воспроизводит либо клиентскую, либо серверную сторону захваченного сеанса TCP с модификацией всех порядковых номеров SYN/ACK по мере необходимости.
Я не знаю, есть ли какие-либо бинарные сборки, вам нужно скомпилировать их самостоятельно.
Примечание. Я еще не пробовал это сам, но изучаю его.
Ответ 3
Да, это сложная задача для реализации такого инструмента.
Я начал реализовывать этот инструмент два года назад, и теперь инструмент зрелый.
Попробуйте и, возможно, вы обнаружите, что это инструмент, который вы ищете.
https://github.com/wangbin579/tcpcopy
Ответ 4
Мне нужно нечто похожее, поэтому я немного поработал с scapy и придумал решение, которое сработало для меня. Моя цель состояла в том, чтобы воспроизвести клиентскую часть захваченного файла pcap. Мне было интересно получать ответы с сервера - не обязательно с таймингами. Ниже мое острое решение - оно ни в коем случае не проверено и не завершено, но я сделал то, что хотел. Надеюсь, это хороший пример того, как воспроизводить поток TCP с помощью scapy.
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])
Ответ 5
Запишите пакетный захват полной связи TCP/TCP-клиента. Затем вы можете использовать tcpliveplay для воспроизведения только клиентской стороны связи на реальном сервере. tcpliveplay будет генерировать новые порядковые номера, IP-адреса, MAC-адреса и т.д., поэтому связь будет протекать должным образом.