作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在使用 netaddr
模块并试图找出如何/是否可以将网络拆分为不同前缀的子网。例如,将/16 拆分为 X/23s 和 Y/24s。
据我所知,我们可以使用 subnet
函数将网络拆分为 X 个给定前缀,但它只需要 1 个前缀。
上面的代码会从/16 中切出 4 个/23,这很好,但是我如何获取剩余空间并将其切入不同的前缀?
ip = IPNetwork('172.24.0.0/16')
subnets = list(ip.subnet(23, count=4))
有没有一种方法可以实现我想用 netaddr 做的事情?
最佳答案
试试下面的
from netaddr import IPNetwork, cidr_merge, cidr_exclude
class IPSplitter(object):
def __init__(self, base_range):
self.avail_ranges = set((IPNetwork(base_range),))
def get_subnet(self, prefix, count=None):
for ip_network in self.get_available_ranges():
subnets = list(ip_network.subnet(prefix, count=count))
if not subnets:
continue
self.remove_avail_range(ip_network)
self.avail_ranges = self.avail_ranges.union(set(cidr_exclude(ip_network, cidr_merge(subnets)[0])))
return subnets
def get_available_ranges(self):
return sorted(self.avail_ranges, key=lambda x: x.prefixlen, reverse=True)
def remove_avail_range(self, ip_network):
self.avail_ranges.remove(ip_network)
您可以像下面这样使用它。通过更多的数学运算,您可以提高效率,例如当单个 block 的计数不满足时,从两个不同的 block 中切出子网。
In [1]: from ip_splitter import IPSplitter
In [2]: s = IPSplitter('172.24.0.0/16')
In [3]: s.get_available_ranges()
Out[3]: [IPNetwork('172.24.0.0/16')]
In [4]: s.get_subnet(23, count=4)
Out[4]:
[IPNetwork('172.24.0.0/23'),
IPNetwork('172.24.2.0/23'),
IPNetwork('172.24.4.0/23'),
IPNetwork('172.24.6.0/23')]
In [5]: s.get_available_ranges()
Out[5]:
[IPNetwork('172.24.8.0/21'),
IPNetwork('172.24.16.0/20'),
IPNetwork('172.24.32.0/19'),
IPNetwork('172.24.64.0/18'),
IPNetwork('172.24.128.0/17')]
In [6]: s.get_subnet(28, count=10)
Out[6]:
[IPNetwork('172.24.8.0/28'),
IPNetwork('172.24.8.16/28'),
IPNetwork('172.24.8.32/28'),
IPNetwork('172.24.8.48/28'),
IPNetwork('172.24.8.64/28'),
IPNetwork('172.24.8.80/28'),
IPNetwork('172.24.8.96/28'),
IPNetwork('172.24.8.112/28'),
IPNetwork('172.24.8.128/28'),
IPNetwork('172.24.8.144/28')]
In [7]: s.get_available_ranges()
Out[7]:
[IPNetwork('172.24.8.128/25'),
IPNetwork('172.24.9.0/24'),
IPNetwork('172.24.10.0/23'),
IPNetwork('172.24.12.0/22'),
IPNetwork('172.24.16.0/20'),
IPNetwork('172.24.32.0/19'),
IPNetwork('172.24.64.0/18'),
IPNetwork('172.24.128.0/17')]
关于python - 将网络拆分为多个前缀的子网,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38864268/
我是一名优秀的程序员,十分优秀!