超级实用的IP地址处理模块IPY详解


实用的IP地址处理模块IPY详解

一、IPy模块介绍

IP地址规划是网络设计中非常重要的一个环节,规划的好坏直接影响路由协议算法的效率包括网络性能、可扩展性等方面,在这个过程当中,免不了要计算大量的IP地址,包括网段、网络掩码、广播地址、子网数,IP类型等。

所以,此时此刻你可能躲在某个角落瑟瑟发抖,开始慌了。

众所周知,python是一种很强的语言,它提供了一个很强大的第三方模块–IPy模块。

IPy模块可以拯救你,可以很好的辅助我们高效的完成IP的规划工作。

目前最新官方版本为IPy 1.01,接下来让我们一起愉快的学习吧。

二、安装

这里我们使用源码包安装

1.下载源码包
wget https://pypi.python.org/packages/source/I/IPy/IPy-1.01.tar.gz --no-check-
[root@oldboy ~] # ls
IPy-1.01.tar.gz

2.解压源码包
tar zxvf IPy-1.01.tar.gz 
3.安装IPy库
cd IPy-1.01/
python3 setup.py install #因为我使用的python3.8,所以python加参数3了
image-20210311224616614

image-20210311225149813

image-20210312223954053

三、基本使用

1.IP地址、网段的基本处理

IPy模块包含IP类,使用它可以方便处理绝大部分格式为IPv6及IPv4的网络和地址,比如通过version方法就可以区分出IPv4和IPv6

>>> from IPy import IP #导入模块
>>> IP("10.0.0.0/8").version()
4	#4代表IPv4类型
>>> IP("::1").version()
6	#6代表IPv6类型

image-20210312230541752

通过指定的网断输出该网段的IP个数及所有IP地址清单

>>> ip = IP("192.168.0.0/16")
>>> print(ip.len())	#输出192.168.0.0/16网段的IP个数
65536
>>> for i in ip:	#输出192.168.0.0/16网段的所有IP清单
...     print(i)
... 

image-20210312231530643

下面介绍IP类几个常见的方法,包括反向解析名称、IP类型、IP转换等。

>>> ip = IP ("192.168.1.20")
>>> ip.reverseName()	#反向解析地址格式
'20.1.168.192.in-addr.arpa.'
>>> ip.iptype()	#192.168.1.20为私网类型'PRIVATE'
'PRIVATE'
>>> IP('8.8.8.8'.iptype()	#8.8.8.8为公网类型
'PUBLIC'
>>> IP("8.8.8.8").int()	#转换成整型格式
134744072
>>> IP("8.8.8.8").strHex()	#转换成十六进制格式
'0x8080808'
>>> IP("8.8.8.8").strBin()	#转换成二进制格式
'00001000000010000000100000001000'
>>> print(IP(0x8080808))	#十六进制转成IP格式
8.8.8.8

IP方法也支持网络地址的转换,例如根据IP与掩码生产网段格式,如下:

#采用三种书写方式
>>> print(IP('192.168.1.0').make_net('255.255.255.0'))
192.168.1.0/24
> print(IP('192.168.1.0/255.255.255.0',make_net=True))
192.168.1.0/24
> print(IP('192.168.1.0-192.168.1.255',make_net=True))
192.168.1.0/24

也可以通过strNormal方法指定不同wantprefixlen参数值以定制不同输出类型的网段。输出类型为字符串,如下:

>>> IP('192.168.1.0/24').strNormal(0)
'192.168.1.0'
>>> IP('192.168.1.0/24').strNormal(1)
'192.168.1.0/24'
>>> IP('192.168.1.0/24').strNormal(2)
'192.168.1.0/255.255.255.0'

wantprefixlen的取值及含义:

  • wantprefixlen=0,无返回,如192.168.1.0;
  • wantprefixlen=1,prefix格式,如192.168.1.0/24;
  • wantprefixlen=2,decimalnetmask格式,如192.168.1.0/255.255.255.0;
  • wantprefixlen=3,lastIP格式,如:192.168.1.0-192.168.1.255

2.多网络计算方法详解

有时候我们比较兰格网段是否存在包含、重叠关系,比如同网络但不同prefixlen会认为是不相等的网段,如10.0.0.0/16不等于10.0.0.0.0/24,另外即使具有相同的prefixlen但出于不同的网络地址,同样也视为不相等,如10.0.0.0/16不等于192.0.0.0/16。IPy支持类似于数据型的比较,以帮助IP对象进行比较,如:

>>> IP('10.0.0.0/24') < IP('12.0.0.0/24')
True

判断IP地址和网段是否包含于另一个网段中,如下:

>>> '192.168.1.100' in IP("192.168.1.0/24")
True
>>> IP ('192.168.1.0/24') in IP ('192.168.0.0/16')
True

判断两个网段是否存在于重叠,采用IPy提供的overlaps方法,如:

>>> IP('192.168.0.0/23').overlaps('192.168.1.0/24')
1	#返回1代表重叠
>>> IP('192.168.1.0/24').overlaps('192.168.2.0')
0	#返回0代表不重叠

示例:根据输入的IP或子网返回网络,掩码、广播、反向解析、子网数、IP类型等信息。

#!/usr/bin/python
# --coding:utf-8
from IPy import IP

ip_s = input("Please input an IP or net_range:")  # 接收用户输入,参数为ip地址或网络地址
ips = IP(ip_s)
if len(ips) > 1:
    print("---您输入的是一个网络地址---")
    print(f'net:{ips.net()}')  # 输出网络地址
    print(f'netmask:{ips.netmask()}')  # 输出网络掩码地址
    print(f'broadcast: {ips.broadcast()}')  # 输出网络广播地址
    print(f'reverse address:  {ips.reverseNames()[0]}')  # 输出网络方向解析
    print(f'subnet: {len(ips)}')  # 输出网络子网数
else:  # 为单个ip地址
    print("---您输入的是单个IP地址---")
    print(f'reverse address:{ips.reverseNames()[0]}')  # 输出ip反向解析

print(f'hexadecimal: {ips.strHex()}')  # 输出十六进制地址
print(f'binary ip: {ips.strBin()}')  # 输出二进制地址
print(f'iptype:{ips.iptype()}')  # 输出二进制地址

效果演示:分别输入网段,IP地址的运行结果如下:

image-20210313160706279

四、实战

[root@oldboy ~] # cat ipy2.py 
#!/usr/bin/python
#--coding:utf-8
from IPy import IP
 
#定义ip网段
ip = IP("192.168.0.0/16")
#打印输出该网段的ip个数
print('1.该网段ip数:', ip.len())
#循环遍历打印输出ip
#for x in ip:
#	print(x)
 
#反向解析地址格式
ip = IP('192.168.1.130')
reverse = ip.reverseName()
print("2.反向解析地址格式:", reverse)
#获取地址类型
typeIP = ip.iptype()
print('3.获取地址类型:', typeIP)
print(IP('8.8.8.8').iptype())
#转换成整型格式
print('4.整型格式转换:',ip.int())
print('5.二进制格式转换:', ip.strBin())
print('6.十六进制格式转换:', ip.strHex())
print('7.十六进制转换成ip:',IP(0xc0a80182))
 
#根据ip和掩码生成网段格式
print('8.根据ip和掩码生成网段格式:',IP('192.168.1.0').make_net('255.255.255.0'))
print(IP('192.168.2.0/255.255.255.0', make_net=True))
print(IP('192.168.3.0-192.168.3.255', make_net=True))
 
#strNormal
print('9.strNormal')
#无返回值
print(IP('192.168.1.0/24').strNormal(0))
#prefix格式
print(IP('192.168.2.0/24').strNormal(1))
#decimalnetmask格式
print(IP('192.168.3.0/24').strNormal(2))
#lastIP格式
print(IP('192.168.4.0/24').strNormal(3))
 
#比较两个网段是否重叠 包含 
print('10.比较大小:')
ip1 = IP('192.168.1.0/24')
ip2 = IP('182.168.1.0/24')
#数值类型的比较
print(ip1 > ip2)
#判断包含
print('11.判断包含:')
print(IP('192.168.1.12') in IP('192.168.1.0/24'))
print(IP('192.168.1.0/24') in IP('192.168.0.0/16'))
 
#overlaps  1表示重叠 0不存在重叠
print('12.判断重叠:')
print(IP('192.168.0.0/23').overlaps('192.168.1.0/24'))
print(IP('192.168.1.0/24').overlaps('192.168.2.0/24'))
#区分ipv4与ipv6
print('区分ipv4与ipv6:')
print(IP('10.0.0.0/8').version())
print(IP('::1').version())
[root@oldboy ~] # 

运行结果如下:

[root@oldboy ~] # python3 ipy2.py 
1.该网段ip数: 65536
2.反向解析地址格式: 130.1.168.192.in-addr.arpa.
3.获取地址类型: PRIVATE
PUBLIC
4.整型格式转换: 3232235906
5.二进制格式转换: 11000000101010000000000110000010
6.十六进制格式转换: 0xc0a80182
7.十六进制转换成ip: 192.168.1.130
8.根据ip和掩码生成网段格式: 192.168.1.0/24
192.168.2.0/24
192.168.3.0/24
9.strNormal
192.168.1.0
192.168.2.0/24
192.168.3.0/255.255.255.0
192.168.4.0-192.168.4.255
10.比较大小:
True
11.判断包含:
True
True
12.判断重叠:
1
0
区分ipv4与ipv6:
4
6

image-20210313161959589

参考资料

官方文档:https://pypi.org/project/IPy/

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贾维斯Echo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值