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

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

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

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


person zzy    schedule 20.05.2019    source источник


Ответы (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.

person Sarch    schedule 26.08.2019
comment
Спасибо @Sarch! Приятно знать, что это известная проблема. Я пробовал bgpdump анализировать, и это дало мне разумные результаты. - person zzy; 27.08.2019