一、 简介
在IP地址规划中,涉及到计算大量的IP地址,包括网段、网络掩码、广播地址、子网数、IP类型等,即便是专业的网络人员也要进行繁琐的计算,而IPy模块提供了专门针对IPV4地址与IPV6地址的类与工具,可以帮助实现计算子网掩码、网络掩码、广播地址、子网数、IP类型等。
二、 安装
pip install IPy
三、 基本使用
IPy模块内部主要主要提供了IP类、IPint类,IPset类.
我们常用的就是IP类,这个类可以接受几乎任何格式的IP地址和网段。
A、获取IP地址信息
1、version():获取IP地址的版本
x = IPy.IP('192.168.1.1').version() #该IP地址的版本为:4
x = IPy.IP('192.168.1.0/30').version() #该IP地址的版本为:4
x = IPy.IP('::1').version() #该IP地址的版本为:6
2、len():获取子网IP地址的个数
x = IPy.IP('192.168.1.0').len() #子网IP地址的个数:1
x = IPy.IP('192.168.1.0/30').len() #子网IP地址的个数:4
x = IPy.IP('192.168.1.0/24').len() #子网IP地址的个数:256 32-24=8个网络号 2的8次方为256
# IPV4后面如果没有/的话,按单个IP地址计算,有/的话,根据子网计算
3、iptpe():获取IP地址的类型
x = IPy.IP('192.168.1.0').iptype() #IP地址类型:PRIVATE
x = IPy.IP('8.8.8.8').iptype() #IP地址类型:PUBLIC
x = IPy.IP('127.0.0.1').iptype() #IP地址类型:LOOPBACK
# PRIVATE表示私有地址,PUBLIC表示公有地址,LOOPBACK表示环回地址
#IPv6的类型信息与实际不同步。
4、net():作为IP对象返回网络的第一个地址,即基址
x = IPy.IP('192.168.1.0/24')() #IP地址的基址:192.168.1.0
x = IPy.IP('8.8.8.0/24')() #IP地址的基址:8.8.0.0
x = IPy.IP('127.0.0.0/8')() #IP地址的基址:127.0.0.0
5、broadcast():作为IP对象返回网络的最后地址,即广播地址
x = IPy.IP('192.168.1.0/24').broadcast() #IP地址的广播地址:192.168.1.255
x = IPy.IP('8.0.0.0/8').broadcast() #IP地址的广播地址:8.255.255.255
x = IPy.IP('0.0.0.1').broadcast() #IP地址的广播地址:0.0.0.1# 注意:在这里单个IP地址的广播地址为本身
6、netmask():以IP对象的形式返回网络掩码
x = IPy.IP('192.168.1.1')mask() #IP地址的子网掩码:255.255.255.255
x = IPy.IP('8.8.8.0/24')mask() #IP地址的子网掩码:255.255.255.0
x = IPy.IP('127.0.0.0/8')mask() #IP地址的子网掩码:255.0.0.0
#单个返回四个255,一般是加入的是网段
7、reverseName():返回reverse lookup/PTR记录的值
x = IPy.IP('192.168.1.1').reverseName() #IP的反向显示:1.1.168.192.in-addr.arpa.
x = IPy.IP('8.8.8.0/24').reverseName() #IP的反向显示:8.8.8.in-addr.arpa.
x = IPy.IP('127.0.0.0/8').reverseName() #IP的反向显示:127.in-addr.arpa.#这个我也不是很清楚,感觉就是把IP地址反过来写,而且不管是不是IP地址段
8、reverseNames():返回一个包含形成反向查找的值的列表
x = IPy.IP('192.168.1.1').reverseNames() #IP以列表的显示反向显示:['1.1.168.192.in-addr.arpa.']
x = IPy.IP('8.8.8.0/30').reverseNames() #IP以列表的显示反向显示:['0.8.8.8.in-addr.arpa.', '1.8.8.8.in-addr.arpa.', '2.8.8.8.in-addr.arpa.', '3.8.8.8.in-addr.arpa.']
x = IPy.IP('127.0.0.0/8').reverseNames() #IP以列表的显示反向显示:['127.in-addr.arpa.']#和上面的差不多,不过是列表的形式
9、prefixlen():返回网络前缀
x = IPy.IP('192.168.1.0').prefixlen() #IP的前缀是:32
x = IPy.IP('192.168.0.0/23').prefixlen() #IP的前缀是:23
x = IPy.IP('192.168.1.0/24').prefixlen() #IP的前缀是:24#必须是网段
B、IP地址格式转换
1、int():返回IP地址的十进制整数格式
x = IPy.IP('192.168.1.0').int() #IP地址的十进制整数格式:3232235776
x = IPy.IP('8.8.8.8').int() #IP地址的十进制整数格式:134744072
x = IPy.IP('0.0.0.1').int() #IP地址的十进制整数格式:1
2、strHex():返回IP地址的十六进制格式
x = IPy.IP('192.168.1.0').strHex() #IP地址的十六进制整数格式:0xc0a80100
x = IPy.IP('8.8.8.8').strHex() #IP地址的十六进制整数格式:0x8080808
x = IPy.IP('0.0.0.1').strHex() #IP地址的十六进制整数格式:0x1
3、strBin():返回IP地址的二进制格式
x = IPy.IP('192.168.1.0').strBin() #IP地址的二进制整数格式:11000000101010000000000100000000
x = IPy.IP('8.8.8.8').strBin() #IP地址的二进制整数格式:00001000000010000000100000001000
x = IPy.IP('0.0.0.1').strBin() #IP地址的二进制整数格式:00000000000000000000000000000001
- 注意:在数据库中存储IP地址有两种形式:
a、以变长字符串的形式将IP地址保存在数据库中
b、将IP地址转换为整数以后保存到数据库中
所以有时候可以使用整数的IP形式或者字符串形式注入
4、v46map():IPv4、IPv6地址互相映射
x = IPy.IP('192.168.1.1').v46map() #IP的IPV6地址是:::ffff:192.168.1.1
x = IPy.IP('::ffff:1.1.1.1').v46map() #IP的IPV4地址是:1.1.1.1#返回IPv4、IPv6地址互相映射,如果IPv6地址不可在IPv4地址范围,则为ValueError。
5、strCompressed():返回字符串表示形式
x = IPy.IP('192.168.1.0').strCompressed() #IP的字符串:192.168.1.0
x = IPy.IP('192.168.0.0/23').strCompressed() #IP的字符串:192.168.0.0/23
x = IPy.IP('192.168.1.0/24').strCompressed() #IP的字符串:192.168.1.0/24
6、strFullsize():返回非损坏格式的字符串表示形式
x = IPy.IP('192.168.1.0').strFullsize() #IP的字符串:192.168.1.0
x = IPy.IP('192.168.0.0/23').strFullsize() #IP的字符串:192.168.0.0/23
x = IPy.IP('192.168.1.0/24').strFullsize() #IP的字符串:192.168.1.0/24
7、strNetmask():以字符串形式返回netmask
x = IPy.IP('192.168.1.0').strNetmask() #IP的子网掩码:255.255.255.255
x = IPy.IP('192.168.0.0/23').strNetmask() #IP的子网掩码:255.255.254.0
x = IPy.IP('192.168.1.0/24').strNetmask() #IP的子网掩码:255.255.255.0#以字符串形式返回netmask,主要用于IPv6
8、strNormal():以常规格式返回字符串表示形式,
x = IPy.IP('192.168.1.0').strNormal() #IP地址:255.255.255.255
x = IPy.IP('192.168.0.0/23').strNormal() #IP地址:255.255.254.0
x = IPy.IP('192.168.1.0/24').strNormal() #IP地址:255.255.255.0
IP地址转换成各种格式的字符串(与上面存在冲突?)
>>> IP('10.0.0.0/32').strNormal() # '10.0.0.0'
>>> IP('10.0.0.0/24').strNormal() # '10.0.0.0/24'
>>> IP('10.0.0.0/24').strNormal(0) # '10.0.0.0'
>>> IP('10.0.0.0/24').strNormal(1) # '10.0.0.0/24'
>>> IP('10.0.0.0/24').strNormal(2) # '10.0.0.0/255.255.255.0'
>>> IP('10.0.0.0/24').strNormal(3) # '10.0.0.0-10.0.0.255'
C、设置IP一些参数
1、make_net():通过给定的网络掩码将单个IP地址转换为网络规范
x = IPy.IP('192.168.1.4').make_net('255.0.0.0') #IP地址的规范化:192.0.0.0/8
x = IPy.IP('8.8.8.8').make_net('255.255.0.0') #IP地址的规范化:8.8.0.0/16
x = IPy.IP('172.1.1.1').make_net('255.255.255.0') #IP地址的规范化:172.1.1.0/24# make_net里面的参数是反子网掩码
x = IP('192.168.3.0-192.168.3.255', make_net=True) # 192.168.3.0
D、地址比较
1、overlaps():检查两个IP地址范围是否重叠
x = IPy.IP('192.168.1.1').overlaps('192.168.1.2') #IP的是否重叠:0
x = IPy.IP('192.168.1.0/24').overlaps('192.168.1.5') #IP的是否重叠:1
x = IPy.IP('192.168.1.0/24').overlaps('192.168.0.0/23') #IP的是否重叠:-1
#如果两个范围不重叠,则返回0;如果给定范围在末尾重叠,则返回1;如果在开头重叠,则返回-1。
#注意:这里说的是范围,不是单个IP对比
2、IP地址 in IPy.IP(‘IP段’)
print( '192.168.1.1' in IPy.IP('192.168.1.0/24')) #True
print( '192.168.1.2' in IPy.IP('192.168.2.0/24')) #False
print( '192.168.1.3' in IPy.IP('192.168.1.3')) #True
E、格式化输出
1、格式化输出IPv4和IPv6的地址
print(IP('127.0.0.1')) # 127.0.0.1
print(IP('10')) # 10.0.0.0
print(IP('0x7f000001')) # 127.0.0.1
print(IP(0x7f000001)) # 127.0.0.1
print(IP('1080:0:0:0:8:800:200C:417A')) # 1080::8:800:200c:417a
print(IP('1080::8:800:200C:417A')) #1080::8:800:200c:417a
print(IP('::1')) # ::1
print(IP('::13.1.68.3')) # ::d01:4403
# 注意输出的不是字符串,是IPy.IP类型
2、子网掩码及网段前缀转换
print(IP('1.0.0.0/8')) # 1.0.0.0/8
print(IP('1.0.0.0/255.0.0.0')) #1.0.0.0/8
print(IP('1.0.0.0-1.255.255.255')) #1.0.0.0/8
print(IP('127.0.0.0-127.255.255.255')) # 127.0.0.0/8
3、解析CIDR网址
>>> from IPy import IP
>>> ip = IP('127.0.0.0/30')
>>> for x in ip:
... print(x)
...
127.0.0.0
127.0.0.1
127.0.0.2
127.0.0.3