Я пытаюсь проанализировать загруженную трассировку 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')
Любые идеи, что здесь происходит? Все файлы трассировки не читаются, и я понятия не имею, как разобрать файлы из найденного мной репо.
Большое спасибо!





В настоящее время это ошибка в библиотеке 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разобрать, и это дало мне разумные результаты.