用Python netaddr 的 cidr_merge 汇总相邻子网
我有一组IP网络,它们即使有些是相邻的,也无法用netaddr.cidr_merge
这个工具合并。请问我是不是做错了什么?
>>> from netaddr import IPNetwork, cidr_merge
>>> 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 = cidr_merge(iplist)
>>> summary == iplist
True
我在Mac OSX 10.8.5上使用的是Python 3.3.4和netaddr 7.12。
2 个回答
4
netaddr
在这里工作得很好。并不是所有相邻的子网都可以合并成一个更大的网络。
举个例子,考虑这两个子网:10.255.255.0/24
和 11.0.0.0/24
。虽然它们是相邻的——第一个子网的最后一个地址是 10.255.255.255
,而第二个子网的第一个地址是 11.0.0.0
——但它们不能合并,因为它们之间跨越了一个比这两个网络都要大的边界。
另外,不管它们怎么排列,两个相邻的网络只有在大小相等的情况下才能合并。如果它们的大小不一样,就不能合成一个范围,因为合并后的网络大小不会是2的幂。
4
@duskwuff -
谢谢你的回复。我同意你说的第一部分,但第二部分……我觉得我明白你想表达的意思,但并不是完全准确。比如说,如果我从上面拿一个编辑过的列表,然后加上 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')]