Python Scapy wrpcap-как добавить пакеты в файл pcap?

у меня есть программное обеспечение, которое может эмулировать такие вещи, как BER и задержки в сети. Мне нужен способ проверить модуль BER программного обеспечения, чтобы убедиться, что он действительно работает правильно. Мое решение-создать программу, которая отправляет необработанные кадры Ethernet с полем типа set на неиспользуемый тип. Внутри фрейма Ethernet есть только случайные биты. Для каждого отправленного кадра мне нужно записать кадр в . На другой стороне сетевой ссылки будет принимающее приложение, которое просто записывает каждый пакет, который он видит, в свой pcap log. После завершения теста два журнала pcap будут сравниваться, чтобы получить BER.

Я использую модуль python Scapy и до сих пор он сделал все, что мне нужно. Я могу отправлять необработанные кадры Ethernet со случайными данными и видеть их в Wireshark. Однако, я не знаю, как получить wrpcap() метод добавления в файл pcap вместо перезаписи. Я знаю, что могу написать список пакетов в wrpcap, но это приложение должно иметь возможность работать в течение неопределенного времени, и я не хочу ждать, пока приложение завершит работу, чтобы записать все пакеты, отправленные на жесткий диск. Поскольку это было бы много, чтобы сохранить в памяти, и если что-то произойдет, мне придется начать тест с нуля.

мой вопрос: Как добавить к pcap файл с помощью scapy вместо перезаписи ? Это вообще возможно? Если нет, то какой модуль может сделать то, что мне нужно?

в то время как ищет что-то с Scapyвозможности, с которыми я столкнулся dpkt, но я не нашел много документации на него. Может dpkt сделайте то, что я прошу, и если да, то где я могу получить хорошую документацию для него?

4 ответов


есть способ сделать то, что вы хотите, но это означает либо:

  • [память свинья с одним большим pcap]: прочитать существующие pcap с диска с rdpcap() на scapy PacketList() а затем запись кадров в PacketList как они получены. Вы можете выборочно сохранить intermediate PacketList до pcap по желанию, но я не думаю, что есть что-то вроде возможности добавления в scapy ' s wrpcap(). Как вы упомянули, эта техника также означает, что вы сохраняя все 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)
...

Я думаю, что я следую за вами здесь, поскольку пакеты обнюхиваются, вы хотели бы, чтобы все они были записаны в один файл 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, как предлагает Майк, если хотите. Дай мне знать, если это сработает.


на 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().