Работа с Pcap-записью

Примечание

Данный раздел основан на опыте компании Elecard по внедрению и эксплуатации Boro-зондов. Большинство практических советов в данном разделе касается операционной системы Linux, если это не оговаривается отдельно. Рекомендуется использовать именно ОС Linux для запуска Boro-зондов в высоконагруженных приложениях.

Чтобы проанализировать Pcap-запись, необходимо получить из нее транспортный поток. Затем вы можете начать вещание потока по сети или проиграть его на локальном компьютере, чтобы воспроизвести состояние ошибки. Поток можно получить из нескольких записей, предварительно «склеив» их.

Получение потока из Pcap-записи

Чтобы извлечь поток из Pcap-записи, воспользуйтесь одним из инструментов ниже.

Gstreamer

Gstreamer предназначен для построения мультимедийных приложений, например для воспроизведения видеофайлов. Он включен в большинство дистрибутивов Linux. Если необходимо, установите Gstreamer, используя права суперпользователя.

Примечание

Gstreamer не поддерживает формат pcapng. Его необходимо конвертировать в pcap (см. соответствующий раздел).

  • Получить поток из Pcap-записи можно с помощью команды:

    gst-launch-1.0 -v filesrc location=/path/to/file.pcap ! pcapparse dst-ip=239.1.13.102 dst-port=1234 ! filesink location=/path/to/file.ts
    

    В этом примере будет получен поток с мультикаст-адресом 239.1.13.102:1234. Вы можете найти адрес в JSON-описании записи. Вместо /path/to/file, укажите путь к Pcap-записи, например /opt/myDump/dump.pcap. Таким же образом укажите место, где будет располагаться конечный файл потока с расширением ts.

    Если Pcap-запись содержит множество потоков (записана сторонним приложением без фильтрации), то для извлечения нужного потока вы можете использовать следующие аргументы в pcapparse в любом сочетании: src-ip, src-port, dst-ip, dst-port.

  • Также можно получить поток из нескольких Pcap-файлов (файлы будут отсортированы и склеены по имени!):

    gst-launch-1.0 -v filesrc location=<(mergecap -w - path/to/pcap/files/*.pcap) ! \
    pcapparse dst-ip=239.1.13.102 dst-port=1234 ! \
    filesink location=path/to/file.ts
    
  • Иногда MPEG-TS дополнительно обернут в протокол RTP. Характерным признаком этого является размер данных в UDP-датаграмме, равный 1328 байтам (RTP-заголовок размером 12 байт + 7 транспортных пакетов). Если необходимо извлечь такой поток, используйте команду:

    gst-launch-1.0 -v filesrc location=/path/to/file.pcap ! pcapparse dst-ip=239.1.13.102 dst-port=1234 ! \
    application/x-rtp,encoding-name=MP2T,clock-rate=90000 ! rtpmp2tdepay ! filesink location=path/to/file.ts
    

tshark

Утилита tshark — консольная версия программы Wireshark для захвата пакетов. Чтобы получить поток с помощью tshark, выполните команду:

tshark -r "/path/to/file.pcap" -z follow,udp,raw,0 -q |
grep -Ev '^(Follow|Filter|Node [01]): ' |
grep -Ev '^={60,80}$' |
xxd -r -p >"/path/to/file.ts"

В примере tshark извлечет первый UDP-поток, обозначенный цифрой 0. Вместо выбора по UDP-потоку, можно задать более явную фильтрацию с помощью выражения follow,udp,raw,<src-ip>:<src-port>,<dst-ip>:<dst-port>. Утилита tshark поддерживает как формат pcap, так и pcapng.

Wireshark

Чтобы извлечь поток в программе Wireshark, воспользуйтесь специальным lua-скриптом. Скрипт и инструкция по его использованию на английском языке находятся по ссылке. Скрипт работает медленно.

Вещание потока из Pcap-записи в сеть

Вы можете организовать вещание записи в сеть с помощью одного из приведенных далее инструментов.

Gstreamer

Для воспроизведения потока в Gstreamer понадобится фильтр из модуля gstreamer1.0-plugins-bad.

Примечание

Gstreamer не поддерживает формат pcapng. Его необходимо конвертировать в pcap (см. соответствующий раздел).

Чтобы начать вещание, выполните команду:

gst-launch-1.0 -v filesrc location=/path/to/file.pcap ! pcapparse dst-ip=239.1.13.102 dst-port=1234 ! udpsink bind-address=127.0.0.1 host=224.1.1.1 port=5000 auto-multicast=true

В примере поток с адресом 239.1.13.102:1234 извлекается из Pcap-записи, а затем вещается по адресу 224.1.1.1:5000 в localhost.

Скорость вещания будет соответствовать скорости в оригинальном потоке. При воспроизведении потока с большой вероятностью сохранится mapping (количество TS-пакетов, упакованных в IP-пакет), но не сохранятся TTL и TOS/DSCP. Их можно задать в фильтре udpsink после номера порта, например ttl-mc=1, qos-dscp=0.

tcpreplay

Pcap-файл можно вещать в сеть с помощью утилиты tcpreplay (официальная документация). Отправляемые пакеты будут полностью идентичны сохранённым в записи. При необходимости вы можете изменить МАС- и IP-адреса, а также номера портов в записи с помощью утилиты tcprewrite.

Внимание

При использовании tcpreplay нельзя принять потоки на той же машине, откуда производится вещание. Кроме этого, программа полностью использует одно ядро процессора для синхронизации времен отправки пакетов с временами в записи.

Полезная информация

В этом разделе описаны дополнительные действия, которые могут быть полезны при анализе Pcap-записи.

Конвертация pcapng в pcap

Плагин pcapparse в Gstreamer принимает файлы в формате pcap. Чтобы преобразовать pcapng в pcap, воспользуйтесь одним из двух способов ниже:

  1. Откройте файл в Wireshark и сохраните его в нужном формате.

  2. Преобразуйте файл с помощью команды mergecap в tshark:

    mergecap -F pcap in.pcapng -w out.pcap
    

    Вместо in.pcapng и out.pcap, укажите путь к исходному Pcapng-файлу и путь, где будет находиться Pcap-файл соответственно.

Склейка нескольких Pcap-записей

Несколько записей можно объединить в одну (файлы будут отсортированы и склеены по имени!) с помощью команды:

mergecap -F pcap path/to/pcap/files/*.pcap -w result.pcap

Просмотр статистики трафика

Вы можете посмотреть статистику UDP-трафика в потоке c помощью команды:

tshark -nq -r in.pcap -z conv,udp
Пример исполнения команды
# ================================================================================
# UDP Conversations
# Filter:<No Filter>
#                                                            |       <-      | |       ->      | |     Total     |    Relative    |   Duration   |
#                                                            | Frames  Bytes | | Frames  Bytes | | Frames  Bytes |      Start     |              |
# 172.20.7.1:2021            <-> 231.14.7.1:2021                  0         0  110342 149844436  110342 149844436     0,000000000        64,5365
# ================================================================================

Чтобы посмотреть статистику для потока, обернутого в RTP, воспользуйтесь командой:

tshark -nq -r in.pcap -z 'io,stat,0,
AVG(udp.length)udp.length,
MIN(udp.length)udp.length,
MAX(udp.length)udp.length,
COUNT(udp)udp'
Пример исполнения команды
# ================================================
# | IO Statistics                                |
# |                                              |
# | Duration: 119.9 secs                         |
# | Interval: 119.9 secs                         |
# |                                              |
# | Col 1: AVG(udp.length)udp.length             |
# |     2: MIN(udp.length)udp.length             |
# |     3: MAX(udp.length)udp.length             |
# |     4: COUNT(udp)udp                         |
# |----------------------------------------------|
# |                |1     |2     |3     |4       |
# | Interval       |  AVG |  MIN |  MAX |  COUNT |
# |----------------------------------------------|
# |   0.0 <> 119.9 | 1336 | 1336 | 1336 | 341626 |
# ================================================