二、实用的IP地址处理模块IPy

一、实用的IP地址处理模块IPy

IP地址规划是网络设计中非常重要的一个环节,规划的好坏会直接影响路由协议算法的效率,包括网络性能,可扩展性等方面,在这个过程当中,免不了要计算大量的IP地址,包括网段,网络掩码,广播地址,子网数,ip地址类型等。Python提供了一个强大的第三方模块IPy(https://github.com/haypo/python-ipy/).
IPy模块可以很好地辅助我们高效完成IP的规划工作,下面进程详细介绍。

二、IP地址,网段的基本处理

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

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

print(IP('10.0.0.0/8').version())  # 4代表IPv4类型


print(IP('::1').version())   # 6代表IPv6类型


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

ip = IP('192.168.0.0/16')
print(ip.len())   # 输入192.168.0.0/16网段的IP个数
for x in ip:
    print(x)



ip = IP('192.168.1.20')
print(ip.reverseNames())   # 反向解析地址格式

print(ip.iptype())    # 192.168.1.20为私网类型"PRIVATE"

print(IP('8.8.8.8').iptype())  # 8.8.8.8为公网类型

print(IP('8.8.8.8').int())   # 转换成整型格式

print(IP('8.8.8.8').strHex()) # 转换成十六进制格式

print(IP('8.8.8.8').strBin())  # 转换成二进制格式

print(IP(0x8080808))   # 十六进制转成IP


# run
/usr/local/bin/python3.6 /Users/xcn/PycharmProjects/自动化运维/IPy实用的IP地址处理模块/IP地址,网段的基本处理.py
4
6
['20.1.168.192.in-addr.arpa.']
PRIVATE
PUBLIC
134744072
0x8080808
00001000000010000000100000001000
8.8.8.8

二、地址转换

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


print(IP('192.168.1.0').make_net('255.255.255.0'))

print(IP('192.168.1.0/255.255.255.0',make_net=True))


# 通过strNormal方法指定不同wantprefixlen参数值以指定不同输出类型的网段

print(IP('192.168.1.0/24').strNormal(0))
print(IP('192.168.1.0/24').strNormal(1))
print(IP('192.168.1.0/24').strNormal(2))
print(IP('192.168.1.0/24').strNormal(3))

# run

/usr/local/bin/python3.6 /Users/xcn/PycharmProjects/自动化运维/IPy实用的IP地址处理模块/网络地址转换.py
192.168.1.0/24
192.168.1.0/24
192.168.1.0
192.168.1.0/24
192.168.1.0/255.255.255.0
192.168.1.0-192.168.1.255

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

三、多网络计算方法详解

有时候我们想比较两个网段是否存在包含,重叠等关系,比如同网络但不同prefixlen会认为是不相等的网段,如10.0.0.0/16。IPy支持类似于数值型数据的比较,以帮助IP对象进行比较:

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

print(IP('10.0.0.0/24') < IP('12.0.0.0/24'))

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

print('192.168.1.100' in IP('192.168.1.0/24'))

print(IP('192.168.1.0/24') in IP('192.168.0.0/16'))


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

print(IP('192.168.0.0/23').overlaps('192.168.1.0/24'))  # 返回1代表存在重叠

print(IP('192.168.1.0/24').overlaps('192.168.2.0'))  # 返回0代表不存在重叠


# run
/usr/local/bin/python3.6 /Users/xcn/PycharmProjects/自动化运维/IPy实用的IP地址处理模块/多网络计算方法.py
True
True
True
1
0

四、案例

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

#!/usr/bin/env python
# -*- coding: utf-8 -*-

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

from IPy import IP

ip_s = input("Please input an IP or net-range:")   # 接受用户输入,参数为ip地址或网段地址
ip_s = IP(ip_s)

if len(ip_s) > 1:  # 为一个网络地址
    print('net: %s' % ip_s.net())   # 输入网络地址
    print('netmask: %s' % ip_s.netmask())  # 输出网络掩码地址
    print('broadcast: %s' % ip_s.broadcast())  # 输入网络广播地址
    print('reverse address: %s' % ip_s.reverseName()[0])  # 输出反向地址解析
    print('subnet: %s' %len(ip_s))   # 输出网络子网数
else:
    print('reverse address: %s' % ip_s.reverseName()[0])  # 输出IP反向解析
    print('hexadecimal: %s' % ip_s.strHex())   # 输出十六进制地址
    print('binary IP: %s' % ip_s.strBin())   # 输出二进制地址
    print('iptype: %s' % ip_s.iptype())   # 输出地址类型
    

# run

/usr/local/bin/python3.6 /Users/xcn/PycharmProjects/自动化运维/IPy实用的IP地址处理模块/案例.py
Please input an IP or net-range:192.168.1.0/24
net: 192.168.1.0
netmask: 255.255.255.0
broadcast: 192.168.1.255
reverse address: 1
subnet: 256
posted @ 2018-06-03 11:37  云原生运维社区  阅读(361)  评论(0)    收藏  举报