Разбор формата BGP MRT

Я пытаюсь проанализировать загруженную трассировку BGP здесь. Говорят, что трассировки пакетов BGP хранятся в файлах с префиксом обновления, и эти файлы формата MRT могут быть прочитаны с помощью PyBGPdump.

Я скачал один файл и следовал инструкция (или этот лучше отформатирован):

cnt = 0
dump = pybgpdump.BGPDump('sample.dump.gz')
for mrt_h, bgp_h, bgp_m in dump:
    cnt += 1
print cnt, 'BGP messages in the MRT dump'

Однако я получил эту ошибку:

Traceback (most recent call last):
  File "bgp-stats.py", line 8, in <module>
    for mrt_h, bgp_h, bgp_m in dump:
  File "/usr/local/lib/python2.7/dist-packages/pybgpdump.py", line 61, in next
    bgp_m = dpkt.bgp.BGP(bgp_h.data)
  File "/usr/local/lib/python2.7/dist-packages/dpkt/dpkt.py", line 89, in __init__
    self.unpack(args[0])
  File "/usr/local/lib/python2.7/dist-packages/dpkt/bgp.py", line 152, in unpack
    self.data = self.update = self.Update(self.data)
  File "/usr/local/lib/python2.7/dist-packages/dpkt/dpkt.py", line 89, in __init__
    self.unpack(args[0])
  File "/usr/local/lib/python2.7/dist-packages/dpkt/bgp.py", line 247, in unpack
    attr = self.Attribute(self.data)
  File "/usr/local/lib/python2.7/dist-packages/dpkt/dpkt.py", line 89, in __init__
    self.unpack(args[0])
  File "/usr/local/lib/python2.7/dist-packages/dpkt/bgp.py", line 326, in unpack
    self.data = self.as_path = self.ASPath(self.data)
  File "/usr/local/lib/python2.7/dist-packages/dpkt/dpkt.py", line 89, in __init__
    self.unpack(args[0])
  File "/usr/local/lib/python2.7/dist-packages/dpkt/bgp.py", line 376, in unpack
    seg = self.ASPathSegment(self.data)
  File "/usr/local/lib/python2.7/dist-packages/dpkt/dpkt.py", line 94, in __init__
    (self.__class__.__name__, args[0]))
dpkt.dpkt.UnpackError: invalid ASPathSegment: '\x1d\xf6\x00\x00\x1d\xf6\x00\x00\x1d\xf6\x00\x00F\xe0'

Кажется, проблема в формате. Я искал «sample.dump.gz» и нашел здесь. Результат просто отличный:

(999, 'BGP messages in the MRT dump')

Любые идеи, что здесь происходит? Все файлы трассировки не читаются, и я понятия не имею, как разобрать файлы из найденного мной репо.

Большое спасибо!

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
560
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В настоящее время это ошибка в библиотеке dpkt. В официальном репозитории есть открытый вопрос, но он 2015 года. Проблема заключается в том, что синтаксический анализатор обновлений BGP обрабатывает номера AS в пути AS как номера AS размером 2 октета/байта, хотя они закодированы как номера AS размером 4 октета/байта. Поэтому, когда он достигает начала 4-байтового закодированного пути AS длиной два

\x00\x00\xab\xcd   \x00\x00\x12\x34

он попытается прочитать два 2-байтовых номера AS, а затем остановится. Поэтому вместо 43981 4660 он читает 0 43981 и неправильно интерпретирует оставшиеся байты.

В настоящее время нет быстрого решения, так как проблема довольно сложная. Чтобы узнать, как кодируется путь AS, нужно посмотреть на возможности, которые были согласованы в сообщении BGP Open. Не уверен, как другие парсеры справляются с этим.

Вы можете решить проблему в репозитории или попробовать альтернативную библиотеку, например mrtparse.

Спасибо @Sarch! Приятно знать, что это известная проблема. Я пытался bgpdump разобрать, и это дало мне разумные результаты.

zzy 27.08.2019 16:29

Другие вопросы по теме