以CIDR格式获取下一个子网

时间:2018-02-06 18:27:07

标签: python python-2.7 networking

我有以下内容: -

start_range =" 10.40.0.0/16"

end_range =" 10.100.0.0/16"

我必须编写一个逻辑来迭代从startend的所有可能范围(具有相同的子网掩码/ 16)。对于每个子网,我将进行一些处理,然后继续下一个。

我可以通过简单的方式实现这一点,我知道,我必须增加最后一个网络octate(即增量40到41 - > 42 - > 43等等。)

start_subnet = "10.40.0.0/16"
end_subnet = "10.100.0.0/16"


start_val = int(start_subnet.split(".")[1])
end_val = int(end_subnet.split('.')[1])
subnet_split = start_subnet.split(".")
subnet_split[1] = "{}"
subnet_proto = ".".join(subnet_split)  # "10.{}.0.0/16"

for i in range(start_val, end_val+1):  # iterate from 40 to 100
    cur_subnet = subnet_proto.format(i)   # "10.40.0.0/16", "10.41.0.0/16" etc
    # do processing on cur_subnet

是否有更好的(Pythonic)方式来获取下一个子网(采用CIDR格式)。可能netaddr模块有一些我不知道的东西吗?

2 个答案:

答案 0 :(得分:1)

这可能是你的想法(没有经过深思熟虑或经过测试,你已被警告过了!)。

ipaddress模块​​来自python3,但它有一个backport,只需运行

pip install ipaddress

得到它。

import ipaddress


def subnet_range(start_subnet, end_subnet):
    start = ipaddress.ip_network(unicode(start_subnet))
    end = ipaddress.ip_network(unicode(end_subnet))
    assert start.prefixlen == end.prefixlen
    ranges = [
        n
        for ipaddr in ipaddress.summarize_address_range(
            list(start)[0],
            list(end)[0])
        for n in ipaddr.subnets(new_prefix=start.prefixlen)][:-1]
    ranges.append(end)
    return ranges


if __name__ == "__main__":
    start_subnet = "9.250.0.0/16"
    end_subnet = "10.100.0.0/16"


for r in subnet_range(start_subnet, end_subnet):
    print r

答案 1 :(得分:1)

使用netaddr后帮我获得了预期的结果。

from netaddr import IPNetwork

start_range = IPNetwork("10.40.0.0/16")
end_range = IPNetwork("10.45.0.0/16")
allowed_range = []

while start_range<=end_range:
    allowed_range.append(start_range)
    start_range = start_range.next()

print allowed_range

这将打印以下内容: -

[IPNetwork('10.40.0.0/16'), IPNetwork('10.41.0.0/16'),
IPNetwork('10.42.0.0/16'), IPNetwork('10.43.0.0/16'),
IPNetwork('10.44.0.0/16'), IPNetwork('10.45.0.0/16')]