二、实用的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

浙公网安备 33010602011771号