【问题标题】:summarizing adjacent subnets with python netaddr cidr_merge使用 python netaddr cidr_merge 总结相邻子网
【发布时间】:2014-07-09 17:30:22
【问题描述】:

python 3.3.4 网络地址 7.12 Mac OSX 10.8.5

我有一个不会与 netaddr.cidr_merge() 合并的 IPNetworks 列表,即使其中一些是相邻的。我是不是做错了什么?

import netaddr
from netaddr import IPNetwork
iplist =[
    IPNetwork('10.105.205.8/29'), 
    IPNetwork('10.105.205.16/28'), 
    IPNetwork('10.105.205.32/27'), 
    IPNetwork('10.105.205.64/26'), 
    IPNetwork('10.105.205.128/26'),
    IPNetwork('10.105.205.192/28'),
    IPNetwork('10.105.205.208/29'),
    IPNetwork('10.105.206.48/28'),
    IPNetwork('10.105.206.80/28')
    ]

>>> summary = netaddr.cidr_merge(iplist)
>>> summary == iplist
    True

from the documentation:

netaddr.cidr_merge(ip_addrs)

一个函数,它接受可迭代的 IP 地址和子网序列,将它们合并到尽可能小的 CIDR 列表中。它会尽可能合并相邻的子网以及其他子网中包含的子网,并删除任何重复的子网。

参数:ip_addrs – IP 地址和子网的可迭代序列。 返回:IPNetwork 对象的汇总列表。

【问题讨论】:

  • 在玩过这个之后。我发现如果我将 IPNetwork('10.105.204.0/29') 添加到 iplist 那么它会进一步总结。

标签: python python-3.x


【解决方案1】:

@duskwuff -

感谢您的回复。我同意第一部分,但第二部分......我想我知道你的去向,但它不是 100% 准确的。例如,如果我从上面获取一个已编辑的列表,并附加 10.105.205.0/29。子网将汇总到 /25。是的,它们必须是 2 的幂,但在 netaddr 汇总之前,必须存在整个子网的所有部分,无论它们是否大小相等。

   iplist =[
        IPNetwork('10.105.205.8/29'), 
        IPNetwork('10.105.205.16/28'), 
        IPNetwork('10.105.205.32/27'), 
        IPNetwork('10.105.205.64/26'),
        ]
    >>> iplist.append(IPNetwork('10.105.205.0/29'))
    >>> netaddr.cidr_merge(iplist)
        [IPNetwork('10.105.205.0/25')]

【讨论】:

    【解决方案2】:

    netaddr 在这里正常工作。并非所有相邻子网都可以汇总。

    例如,考虑子网10.255.255.0/2411.0.0.0/24。虽然它们是相邻的——第一个以10.255.255.255 结尾,第二个以11.0.0.0 开头——但它们无法概括,因为它们跨越的边界远大于这两个网络中的任何一个。

    此外,无论它们如何对齐,两个相邻的网络只有在大小相同的情况下才能连接在一起。不匹配的大小不能组合成一个范围,因为组合网络的大小不是 2 的幂。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-31
      • 2011-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多