【问题标题】:BGP MRT format parsingBGP MRT格式解析
【发布时间】:2019-05-20 02:19:46
【问题描述】:

我正在尝试解析下载的 BGP 跟踪 here。据说BGP数据包的踪迹存储在前缀为updates的文件中,这些MRT格式的文件可以被PyBGPdump读取。

我下载了一个文件并关注instruction(或this better formatted one):

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”并找到它here。结果刚刚好:

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

有什么见解吗?所有跟踪文件都不可读,我不知道如何从找到的repo 中解析文件。

非常感谢!

【问题讨论】:

    标签: parsing trace packet-capture bgp


    【解决方案1】:

    这是当前 dpkt 库中的一个错误。官方存储库中有一个open issue,但它是从 2015 年开始的。 问题是 BGP 更新解析器将 AS 路径中的 AS 编号视为 2 个八位字节/字节的 AS 编号,即使它们被编码为 4 个八位字节/字节的 AS 编号。因此,当它到达长度为 2 的 4 字节编码 AS 路径的开头时

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

    它会尝试读取两个 2 字节的 AS 编号然后停止。因此,它读取的不是43981 4660,而是0 43981,并错误地解释了剩余字节。

    目前没有快速解决方案,因为问题非常棘手。为了了解 AS 路径是如何编码的,必须查看在 BGP Open 消息中协商的功能。不确定其他解析器如何处理。

    您可以在 repo 中提出问题或尝试使用替代库,例如 mrtparse。

    【讨论】:

    • 谢谢@Sarch!很高兴知道这是一个众所周知的问题。我试过bgpdump 进行解析,它给了我合理的结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-14
    • 2011-04-19
    • 2021-12-25
    • 2021-11-10
    • 1970-01-01
    • 2016-06-27
    相关资源
    最近更新 更多