IP地址处理模块IPy

IP地址规划是网络设计中非常重要的一个环节,规划的好坏会直接影响路由协议算法的效率,包括网络性能、可扩展性等方面。

在这个过程中,免不了要计算大量的IP地址,包括网段、网络掩码、广播地址、子网数、IP类型等

一、IP地址、网段的基本处理

IP类常见的手段包括解析名称、IP类型、IP转化等

In [1]: from IPy import IP

In [2]: len(IP('192.168.0.0/16'))  #统计该网段的IP地址个数
Out[2]: 65536

In [3]: ip = IP("192.168.1.20")   #实例化一个IP

In [4]: ip.reverseNames()   #反向解析地址格式
Out[4]: ['20.1.168.192.in-addr.arpa.']

In [5]: ip.iptype()   #私网类型
Out[5]: 'PRIVATE'

In [6]: IP("8.8.8.8").iptype()   #公网类型
Out[6]: 'PUBLIC'

In [7]: IP("8.8.8.8").int()   #转化成整形格式
Out[7]: 134744072

In [9]: IP("8.8.8.8").strHex()   #转化为十六进制格式
Out[9]: '0x8080808'

In [10]: IP("8.8.8.8").strBin()    #转化为二进制格式
Out[10]: '00001000000010000000100000001000'

In [11]: print(IP(0x8080808))  #将十六进制转化为IP格式
8.8.8.8

IP方法也包括网络地址的转换,例如根据IP与掩码生产网段的格式。

In [12]: print(IP("192.168.1.0").make_net("255.255.255.0"))
192.168.1.0/24

In [13]: print(IP("192.168.1.0/255.255.255.0",make_net=True))
192.168.1.0/24

In [14]: print(IP("192.168.1.0-192.168.1.255",make_net=True))
192.168.1.0/24

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

In [19]: IP("192.168.1.0/24").strNormal(0)  #无返回值
Out[19]: '192.168.1.0'

In [20]: IP("192.168.1.0/24").strNormal(1)  #prefix格式
Out[20]: '192.168.1.0/24'

In [21]: IP("192.168.1.0/24").strNormal(2)  #decimalnetmask格式
Out[21]: '192.168.1.0/255.255.255.0'

In [22]: IP("192.168.1.0/24").strNormal(3)  #lastIP格式
Out[22]: '192.168.1.0-192.168.1.255'

二、多网络计算方法

有时候我们想比较两个网段是否存在包含、重叠关系,IPy就可以支持类似于数据类型的比较。

In [23]: IP("192.168.1.0") < IP("192.168.1.1")
Out[23]: True

In [24]: '192.168.1.10' in IP("192.168.1.0/24")
Out[24]: True  #IP是否包含在另一个网段中

In [26]: IP("192.168.1.0/24") in IP("192.168.0.0/16")
Out[26]: True   #网段是否包含在另一个网段中

#判断两个网段是否存在重叠
In [27]: IP("192.168.0.0/23").overlaps("192.168.1.0/24")
Out[27]: 1  #1代表存在重叠

In [28]: IP("192.168.0.0/23").overlaps("192.168.1.0")
Out[28]: 1

In [29]: IP("192.168.1.0/24").overlaps("192.168.2.0/24")
Out[29]: 0   #0代表不存在重叠

综合实例:根据输入的IP或子网返回网络、掩码、广播、反向解析、子网数等

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

ip_s = raw_input("请输入一个ip或者网段:")
ips = IP(ip_s)
if len(ips) > 1:
    print "网络地址: %s" % ips.net()
    print "子网掩码: %s" % ips.netmask()
    print "网络广播地址 : %s" % ips.broadcast()
    print "地址反向解析: %s" % ips.reverseNames()[0]
    print "网络子网数: %s " % len(ips)
else:
    print "IP反向解析: %s " % ips.reverseNames()[0]

print "十六进制地址: %s " % ips.strHex()
print "二进制地址: %s " % ips.strBin()
print "地址类型: %s " % ips.iptype()

执行结果:

#输入一个网址
[root@localhost script]# python ip.py 
请输入一个ip或者网段:192.168.1.1
IP反向解析: 1.1.168.192.in-addr.arpa. 
十六进制地址: 0xc0a80101 
二进制地址: 11000000101010000000000100000001 
地址类型: PRIVATE 
[root@localhost script]# python ip.py 

#输入一个网段
[root@localhost script]# python ip.py 
请输入一个ip或者网段:192.168.1.0/24
网络地址: 192.168.1.0
子网掩码: 255.255.255.0
网络广播地址 : 192.168.1.255
地址反向解析: 1.168.192.in-addr.arpa.
网络子网数: 256 
十六进制地址: 0xc0a80100 
二进制地址: 11000000101010000000000100000000 
地址类型: PRIVATE 
原文地址:https://www.cnblogs.com/yangmingxianshen/p/7898172.html