Python Scapy wrpcap - Как вы добавляете пакеты в файл pcap?
У меня есть программное обеспечение, которое может эмулировать такие вещи, как BER и задержки в сети. Мне нужен способ протестировать модуль BER программного обеспечения, чтобы убедиться, что он действительно работает правильно. Мое решение состоит в том, чтобы создать программу, которая отправляет необработанные кадры Ethernet с полем типа, установленным в неиспользуемый тип. Внутри кадра Ethernet просто случайные биты. Для каждого отправленного кадра мне нужно записать кадр в pcap
файл. На другой стороне сетевого канала будет получающее приложение, которое просто записывает каждый пакет, который видит pcap
журнал. После того, как тест завершен, два журнала pcap будут сравниваться, чтобы получить BER.
Я использую модуль Python Scapy
и пока что сделано все что мне нужно. Я могу отправить необработанные кадры Ethernet со случайными данными и увидеть их в Wireshark. Тем не менее, я не знаю, как получить wrpcap()
метод для добавления в файл pcap, вместо перезаписи. Я знаю, что могу написать список пакетов wrpcap
, но это приложение должно иметь возможность работать в течение неопределенного периода времени, и я не хочу ждать, пока приложение выйдет, чтобы записать все пакеты, отправленные на жесткий диск. Поскольку это будет много для хранения в памяти, и если что-то случится, мне придется начинать тестирование с нуля.
Мой вопрос: как мне добавить pcap
использование файла scapy
вместо перезаписи pcap
файл? Это вообще возможно? Если нет, то какой модуль может делать то, что мне нужно?
Пока искал что-то с Scapy
возможности, с которыми я столкнулся dpkt
, но я не нашел много документации для этого. Можно dpkt
делать то, что я спрашиваю, и если да, где я могу получить хорошую документацию для этого?
4 ответа
Есть способ сделать то, что вы хотите, но это означает либо:
[Память боров с одним большим
pcap
]: Прочитать существующиеpcap
с диска сrdpcap()
вscapy
PacketList()
а затем писать кадры вPacketList
как они получены. Вы можете выборочно сохранить промежуточныйPacketList
кpcap
по желанию, но я не думаю, что есть что-то вроде способности добавления вscapy
"swrpcap()
, Как вы уже упоминали, эта техника также означает, что вы держите всеPacketList
в памяти до завершения.[Клей индивидуальный
pcap
файлы вместе]: храните только небольшие снимки пакетов в памяти... вы должны сохранитьpcap
делайте снимки на диске по X-минуте, а затем объединяйте эти отдельные файлы по завершении сценария.
Вы можете объединить pcap
файлы в Linux с mergecap
от wireshark
пакет... Следующая команда будет объединять pak1.pcap
а также pak2.pcap
в all_paks.pcap
:
mergecap -w all_paks.pcap pak1.pcap pak2.pcap
Что касается dpkt
Я просмотрел их источник, и он мог бы инкрементно записывать пакеты, но я не могу сказать, насколько стабильна или поддерживается их кодовая база... она выглядит немного пренебрегаемой из журналов фиксации (последний коммит был 9 января 2011).
Для потомков PcapWriter или RawPcapWriter выглядит более простым способом решения этой проблемы в scapy 2.2.0. Не могу найти много документации, кроме просмотра источника, хотя. Краткий пример:
from scapy.utils import PcapWriter
pktdump = PcapWriter("banana.pcap", append=True, sync=True)
...
pktdump.write(pkt)
...
wrpcap()
Функция может быть использована для добавления, если вы включите ключевое слово аргумент append=True
, Например:
pkt = IP()
wrpcap('/path/to/filename.pcap', pkt, append=True)
pkt2 = IP()
wrpcap('/path/to/filename.pcap', pkt2, append=True)
rdpcap('/path/to/filename.pcap')
<filename.pcap: TCP:0 UDP:0 ICMP:0 Other:2>
Примечание: wrpcap открывает и закрывает дескриптор файла при каждом вызове. Если у вас есть дескриптор открытого файла для файла pcap, он будет закрыт после вызова wrpcap()
,
Я думаю, что я слежу за тобой здесь, поскольку пакеты перехвачены, ты хотел бы, чтобы все они были записаны в один файл pcap? Хотя вы не можете добавить к pcap, вы можете добавить пакеты в список, а затем записать их все сразу в pcap.
Я не уверен, если это отвечает на ваш вопрос или помогает вообще, если нет, дайте мне знать, и я могу настроить его для удовлетворения ваших потребностей. В этом примере я установил пороговое значение для создания нового pcap для каждого прослушанного 500 пакетов. Будьте осторожны, если вы запустите это дважды, так как ваши pcaps могут быть перезаписаны на втором ходу.
#!/usr/bin/python -tt
from scapy.all import *
pkts = []
iter = 0
pcapnum = 0
def makecap(x):
global pkts
global iter
global pcapnum
pkts.append(x)
iter += 1
if iter == 500:
pcapnum += 1
pname = "pcap%d.pcap" % pcapnum
wrpcap(pname, pkts)
pkts = []
iter = 0
while 1:
sniff(prn=makecap)
Это должно дать вам немного рычагов, однако последние несколько пакетов могут быть потеряны (уменьшите значение в операторе if, чтобы смягчить это.) Предложите использовать его с обеих сторон одновременно, чтобы каждый pcap выстраивался в линию. Позже вы можете использовать mergepcap, как предлагает Майк, если хотите. Дайте мне знать, если это работает для вас.