将CIDR /8,/9转换并扩展为/10

3 投票
2 回答
3088 浏览
提问于 2025-04-17 23:53

我想在我的Python脚本中,把一个特定范围的CIDR(无类域间路由)改成另一个CIDR。比如,我有这些范围:

8.0.0.0/8
9.0.0.0/9

我想通过我的Python脚本把这些CIDR分成一个/10的CIDR,并且把结果显示成这样:

8.0.0.0/10
8.64.0.0/10
8.128.0.0/10
8.192.0.0/10
9.0.0.0/10
9.64.0.0/10

我知道,/8的CIDR应该可以转换成4个/10的CIDR。

有没有人能帮帮我?我对网络知识还很陌生,不知道该怎么做,也不知道怎么用Python来编写代码。

谢谢!

2 个回答

3

在Python 3.3及以上版本中,可以使用@Thomas Orozco建议的方法,利用ipaddress模块来处理IP地址。

#!/usr/bin/env python3
import ipaddress
import fileinput

for line in fileinput.input():
    for subnet in ipaddress.ip_network(line.strip()).subnets(new_prefix=10):
        print(subnet)

示例:

$ ./convert-cidr input.txt

输出结果

8.0.0.0/10
8.64.0.0/10
8.128.0.0/10
8.192.0.0/10
9.0.0.0/10
9.64.0.0/10
7

我建议你使用netaddr这个模块。

你可以查看它的文档,特别是里面关于超级网和子网的部分。

举个例子:

from netaddr import IPNetwork

net = IPNetwork('8.0.0.0/8')

subnets = net.subnet(10)
for subnet in subnets:
    print subnet

输出结果:

8.0.0.0/10
8.64.0.0/10
8.128.0.0/10
8.192.0.0/10

注意,net.subnet()会返回一个生成器对象。所以你需要对它进行遍历,一旦遍历完了,它就会被耗尽。如果你不想这样,可以用list(net.subnet())把它转换成一个列表。

撰写回答