将 CIDR 格式的大量重叠网络压缩为 Python 中的最大公分母

Condense large list of overlapping networks in CIDR format to greatest common denominator in Python

我有一个文本文件,其中存储了我们内部使用的大量网络列表 (250k+),格式如下:

10.4.5.0/30
10.4.5.0/24
10.4.7.0/24
10.4.0.0/16
10.3.5.0/24
10.3.0.0/16
172.15.51.0/24
172.0.0.0/8

我想尝试减少列表以使处理更有效率。使用 Python,如何有效地将列表压缩到包含所有 IP 的最大子网中?是否有任何库可以使这更容易?

例如,上面的列表可以简化为:

10.4.0.0/16
10.3.0.0/16
172.0.0.0/8

作为扩展,这在 IPv6 中是否可行?

你可能想试试这个github-IPy 使用 IPSet 合并您的 IP。它适用于 ipv6。但是我不太确定性能。也许 golang 更适合这样的工作。

稍作修改的路由 trie 肯定可以,但我认为当以下算法应该起作用时,这可能有点矫枉过正:

  • 将所有子网转换为两个整数:一个为 ip 值 IP,另一个为子网长度 Subnet
  • 对于每一对,将其与您的根对列表进行比较
for s in subnets:
  markForRoots = False
  for r in roots:
    if ((s.IP ^ r.IP) >> s.Subnet) == 0: #if they share the same prefix
      if s.Subnet > r.Subnet: #if the current subnet is bigger
        # remove r from root
        markForRoots = True
  if markForRoots:
    # add s to roots