需求:给定一个ip:172.28.68.0和一个CIDR格式的ip配置项ipConfig="172.28.64.0/22,172.28.72.11;172.16.0.0/12,172.28.80.27",判断该IP是在哪个cidr表示的地址段,并获取cidr格式后面的一个ip地址。
首先,要对cidr表示法要有所了解。
例如:172.28.64.0/22表示前22位不变,用1表示,后10位表示网络主机范围,相应的掩码表示为:11111111 11111111 11111100 00000000即该CIDR的掩码为:255.255.252.0
然后根据公式计算地址范围:
- 网络地址 = IP address & Mask
- 网络广播地址 = Network address + Mask反码
- 地址范围 = { 网络地址, 网络地址 + Mask反码}
方法一:使用IPy库
- >>> from IPy import IP
- >>> ip = IP('127.0.0.0/30')
- >>> for x in ip:
- ... print(x) ##print前需要有tab空格
- ... ##此处回车即可
- 127.0.0.0
- 127.0.0.1
- 127.0.0.2
- 127.0.0.3
方法二:使用netaddr库
- CIDR也能直接转成IP地址段
- >>> from netaddr import *
- >>> ip = IPNetwork('192.0.2.16/29')
- >>> ip_list = list(ip)
- >>> print(ip_list)
- [IPAddress('192.0.2.16'), IPAddress('192.0.2.17'), IPAddress('192.0.2.18'), IPAddress('192.0.2.19'), IPAddress('192.0.2.20'), IPAddress('192.0.2.21'), IPAddress('192.0.2.22'), IPAddress('192.0.2.23')]
- IP段208.130.29.30-35转换成CIDR格式
- >>> from netaddr import *
- >>> startip = '208.130.29.30'
- >>> endip = '208.130.29.35'
- >>> cidrs = netaddr.iprange_to_cidrs(startip, endip)
- >>> for k, v in enumerate(cidrs):
- ... iplist = v
- ... print iplist
- ...
- 208.130.29.30/31
- 208.130.29.32/30