子网掩码:

知识点补充:

对于IP192.168.1.0/24,其中/24是子网掩码,表示255.255.255.0,子网掩码也是用32位二进制来表示的。其中/24表示前24位全部表示为1,将其转换为255.255.255.0。同理,对于/16,则为255.255.0.0。

示例代码:

from netaddr import IPNetwork
# ip = IPNetwork("192.168.1.0/32")  # 1
# ip = IPNetwork("192.168.1.0/24")  # 256
ip = IPNetwork("192.168.1.0/16")  # 65536
# ip = IPNetwork("192.168.1.0/8")  # 此时ip表示的数量较大,计算较慢
print(ip)
ip_list = list(ip)
# print(ip_list)
print(len(ip_list), ip_list[0], ip_list[1])
print(ip.cidr)
print(ip_list[0:10])

运行结果:

 合并IP:

import netaddr
ip_list = [netaddr.IPAddress("1.1.1.1"), netaddr.IPAddress("1.1.1.2")]
print(netaddr.cidr_merge(ip_list))

运行结果:

 合并网段:

import netaddr
ip_list = [netaddr.IPNetwork("1.1.3.0/23"), netaddr.IPNetwork("1.1.0.0/22")]
print(netaddr.cidr_merge(ip_list))

运行结果:

IPSet()用法:

创建IP集,创建空集方法,也可以将IP地址和网络指定为字符串。

示例代码:

from netaddr import IPSet, IPAddress, IPNetwork, IPRange
# 创建一个空集合
aa = IPSet()
print(aa)
bb = IPSet(['192.168.1.1'])
print(bb)
cc = IPSet([IPAddress('192.168.1.1')])
print(cc)
# dd = IPSet(IPNetwork('192.168.1.1'))
dd = IPSet([IPNetwork('192.168.1.1')])
print(dd)
ee = IPSet([IPNetwork('1234::/32')])
print(ee)
ff = IPSet([IPNetwork('192.168.1.1/32')])
print(ff)
gg = IPSet(IPRange('10.0.0.0', '10.0.1.31'))
print(gg)
hh = IPSet(IPRange('0.0.0.0', '255.255.255.255'))
print(hh)

运行结果:

为 IP 集成员的所有 IP 地址进行交互

示例代码:

from netaddr import IPSet
for ip in IPSet(['192.0.2.0/28', '::192.0.2.0/124']):
    print(ip)

运行结果:

192.0.2.0
192.0.2.1
192.0.2.2
192.0.2.3
192.0.2.4
192.0.2.5
192.0.2.6
192.0.2.7
192.0.2.8
192.0.2.9
192.0.2.10
192.0.2.11
192.0.2.12
192.0.2.13
192.0.2.14
192.0.2.15
::192.0.2.0
::192.0.2.1
::192.0.2.2
::192.0.2.3
::192.0.2.4
::192.0.2.5
::192.0.2.6
::192.0.2.7
::192.0.2.8
::192.0.2.9
::192.0.2.10
::192.0.2.11
::192.0.2.12
::192.0.2.13
::192.0.2.14
::192.0.2.15
Process finished with exit code 0

示例代码:

from netaddr import IPNetwork, IPSet, INET_PTON
ip_list = IPNetwork('192.168.1.1/28', flags=INET_PTON)
print(len(ip_list))
for ip in IPSet(ip_list):
    print(ip)

运行结果:

添加和删除集合元素

示例代码:

from netaddr import IPSet, IPRange
aa = IPSet()
aa.add('192.0.2.0')
print(aa)
aa.remove('192.0.2.0')  # 当删除的IP不存在时不会报错
print(aa)
aa.add(IPRange('10.0.0.0', '10.0.0.255'))
print(aa)
aa.remove(IPRange('10.0.0.128', '10.10.10.10'))
print(aa)

运行结果:

Set membership

示例代码:

from netaddr import IPSet, IPRange, IPAddress, IPNetwork
# 一个简单的任意 IP 地址范围
iprange = IPRange('192.0.1.255', '192.0.2.16')
# 在这个定义范围内可以存在的 CIDR 网络
print(iprange.cidrs())
print("*" * 100)
# 一个IP集
ipset = IPSet(['192.0.2.0/28'])
# 遍历任意 IP 地址范围内的 IP 地址,看看它们是否在 IP 集中找到
for ip in iprange:
    print(ip, ip in ipset)
print("*" * 100)
# 更多奇特的 IPSet
bigone = IPSet(['0.0.0.0/0'])
print(IPAddress("10.0.0.1") in bigone)
print(IPAddress("0.0.0.0") in bigone)
print(IPAddress("255.255.255") in bigone)
print(IPNetwork("10.0.0.0/24") in bigone)
print(IPAddress("::1") in bigone)
print("*" * 100)
smallone = IPSet(["10.0.0.42/32"])
print(IPAddress("10.0.0.42") in smallone)
print(IPAddress("10.0.0.41") in smallone)
print(IPAddress("10.0.0.43") in smallone)
print(IPNetwork("10.0.0.42/32") in smallone)
print(IPNetwork("10.0.0.42/31") in smallone)

运行结果:

[IPNetwork('192.0.1.255/32'), IPNetwork('192.0.2.0/28'), IPNetwork('192.0.2.16/32')]
****************************************************************************************************
192.0.1.255 False
192.0.2.0 True
192.0.2.1 True
192.0.2.2 True
192.0.2.3 True
192.0.2.4 True
192.0.2.5 True
192.0.2.6 True
192.0.2.7 True
192.0.2.8 True
192.0.2.9 True
192.0.2.10 True
192.0.2.11 True
192.0.2.12 True
192.0.2.13 True
192.0.2.14 True
192.0.2.15 True
192.0.2.16 False
****************************************************************************************************
False
****************************************************************************************************
False
False
False
Process finished with exit code 0

联合、交叉和差异

示例代码:

from netaddr import IPSet, IPRange, IPAddress, IPNetwork
# 联合操作的一些示例
aa = IPSet(['192.0.2.0'])
print(aa)
bb = IPSet(['192.0.2.0']) | IPSet(['192.0.2.1'])
print(bb)
cc = IPSet(['192.0.2.0']) | IPSet(['192.0.2.1']) | IPSet(['192.0.2.3'])
print(cc)
dd = IPSet(['192.0.2.0']) | IPSet(['192.0.2.1']) | IPSet(['192.0.2.3/30'])
print(dd)
ee = IPSet(['192.0.2.0']) | IPSet(['192.0.2.1']) | IPSet(['192.0.2.3/31'])
print(ee)
ff = IPSet(['192.0.2.0/24']) | IPSet(['192.0.3.0/24']) | IPSet(['192.0.4.0/24'])
print(ff)

运行结果:

示例代码:

from netaddr import IPSet, IPRange, IPAddress, IPNetwork
# 这是一个同时进行的并集、交集和对称差分操作的示例
adj_cidrs = list(IPNetwork('192.0.2.0/24').subnet(28))
print(adj_cidrs)
even_cidrs = adj_cidrs[::2]
print(even_cidrs)
evens = IPSet(even_cidrs)
print(evens)
print(IPSet(['192.0.2.0/24']) & evens)
odds = IPSet(['192.0.2.0/24']) ^ evens
print(odds)
print(evens | odds)
print(evens & odds)
print(evens ^ odds)

运行结果:

超集和子集

示例代码:

from netaddr import IPSet, IPRange, IPAddress, IPNetwork
# IP 集提供了测试一组地址范围是否适合另一组地址范围的能力
s1 = IPSet(['192.0.2.0/24', '192.0.4.0/24'])
print(s1)
s2 = IPSet(['192.0.2.0', '192.0.4.0'])
print(s2)
print(s1.issuperset(s2))
print(s2.issubset(s1))
print(s2.issuperset(s1))
print(s1.issubset(s2))

运行结果:

示例代码:

from netaddr import IPSet, IPRange, IPAddress, IPNetwork
# IP  以IPv4 地址范围示例
ipv4_addr_space = IPSet(['0.0.0.0/0'])
private = IPSet(['10.0.0.0/8', '172.16.0.0/12', '192.0.2.0/24', '192.168.0.0/16', '239.192.0.0/14'])
reserved = IPSet(['225.0.0.0/8', '226.0.0.0/7', '228.0.0.0/6', '234.0.0.0/7', '236.0.0.0/7', '238.0.0.0/8', '240.0.0.0/4'])
unavailable = reserved | private
available = ipv4_addr_space ^ unavailable
print(ipv4_addr_space)
print(private)
print(reserved)
print(unavailable)
print(available)
print("*" * 100)
for cidr in available.iter_cidrs():
    print(cidr, cidr[0], cidr[-1])
print("*" * 100)
print(ipv4_addr_space ^ available)

运行结果:

IPSet(['0.0.0.0/0'])
IPSet(['10.0.0.0/8', '172.16.0.0/12', '192.0.2.0/24', '192.168.0.0/16', '239.192.0.0/14'])
IPSet(['225.0.0.0/8', '226.0.0.0/7', '228.0.0.0/6', '234.0.0.0/7', '236.0.0.0/7', '238.0.0.0/8', '240.0.0.0/4'])
IPSet(['10.0.0.0/8', '172.16.0.0/12', '192.0.2.0/24', '192.168.0.0/16', '225.0.0.0/8', '226.0.0.0/7', '228.0.0.0/6', '234.0.0.0/7', '236.0.0.0/7', '238.0.0.0/8', '239.192.0.0/14', '240.0.0.0/4'])
IPSet(['0.0.0.0/5', '8.0.0.0/7', '11.0.0.0/8', '12.0.0.0/6', '16.0.0.0/4', '32.0.0.0/3', '64.0.0.0/2', '128.0.0.0/3', '160.0.0.0/5', '168.0.0.0/6', '172.0.0.0/12', '172.32.0.0/11', '172.64.0.0/10', '172.128.0.0/9', '173.0.0.0/8', '174.0.0.0/7', '176.0.0.0/4', '192.0.0.0/23', '192.0.3.0/24', '192.0.4.0/22', '192.0.8.0/21', '192.0.16.0/20', '192.0.32.0/19', '192.0.64.0/18', '192.0.128.0/17', '192.1.0.0/16', '192.2.0.0/15', '192.4.0.0/14', '192.8.0.0/13', '192.16.0.0/12', '192.32.0.0/11', '192.64.0.0/10', '192.128.0.0/11', '192.160.0.0/13', '192.169.0.0/16', '192.170.0.0/15', '192.172.0.0/14', '192.176.0.0/12', '192.192.0.0/10', '193.0.0.0/8', '194.0.0.0/7', '196.0.0.0/6', '200.0.0.0/5', '208.0.0.0/4', '224.0.0.0/8', '232.0.0.0/7', '239.0.0.0/9', '239.128.0.0/10', '239.196.0.0/14', '239.200.0.0/13', '239.208.0.0/12', '239.224.0.0/11'])
****************************************************************************************************
0.0.0.0/5 0.0.0.0 7.255.255.255
8.0.0.0/7 8.0.0.0 9.255.255.255
11.0.0.0/8 11.0.0.0 11.255.255.255
12.0.0.0/6 12.0.0.0 15.255.255.255
16.0.0.0/4 16.0.0.0 31.255.255.255
32.0.0.0/3 32.0.0.0 63.255.255.255
64.0.0.0/2 64.0.0.0 127.255.255.255
128.0.0.0/3 128.0.0.0 159.255.255.255
160.0.0.0/5 160.0.0.0 167.255.255.255
168.0.0.0/6 168.0.0.0 171.255.255.255
172.0.0.0/12 172.0.0.0 172.15.255.255
172.32.0.0/11 172.32.0.0 172.63.255.255
172.64.0.0/10 172.64.0.0 172.127.255.255
172.128.0.0/9 172.128.0.0 172.255.255.255
173.0.0.0/8 173.0.0.0 173.255.255.255
174.0.0.0/7 174.0.0.0 175.255.255.255
176.0.0.0/4 176.0.0.0 191.255.255.255
192.0.0.0/23 192.0.0.0 192.0.1.255
192.0.3.0/24 192.0.3.0 192.0.3.255
192.0.4.0/22 192.0.4.0 192.0.7.255
192.0.8.0/21 192.0.8.0 192.0.15.255
192.0.16.0/20 192.0.16.0 192.0.31.255
192.0.32.0/19 192.0.32.0 192.0.63.255
192.0.64.0/18 192.0.64.0 192.0.127.255
192.0.128.0/17 192.0.128.0 192.0.255.255
192.1.0.0/16 192.1.0.0 192.1.255.255
192.2.0.0/15 192.2.0.0 192.3.255.255
192.4.0.0/14 192.4.0.0 192.7.255.255
192.8.0.0/13 192.8.0.0 192.15.255.255
192.16.0.0/12 192.16.0.0 192.31.255.255
192.32.0.0/11 192.32.0.0 192.63.255.255
192.64.0.0/10 192.64.0.0 192.127.255.255
192.128.0.0/11 192.128.0.0 192.159.255.255
192.160.0.0/13 192.160.0.0 192.167.255.255
192.169.0.0/16 192.169.0.0 192.169.255.255
192.170.0.0/15 192.170.0.0 192.171.255.255
192.172.0.0/14 192.172.0.0 192.175.255.255
192.176.0.0/12 192.176.0.0 192.191.255.255
192.192.0.0/10 192.192.0.0 192.255.255.255
193.0.0.0/8 193.0.0.0 193.255.255.255
194.0.0.0/7 194.0.0.0 195.255.255.255
196.0.0.0/6 196.0.0.0 199.255.255.255
200.0.0.0/5 200.0.0.0 207.255.255.255
208.0.0.0/4 208.0.0.0 223.255.255.255
224.0.0.0/8 224.0.0.0 224.255.255.255
232.0.0.0/7 232.0.0.0 233.255.255.255
239.0.0.0/9 239.0.0.0 239.127.255.255
239.128.0.0/10 239.128.0.0 239.191.255.255
239.196.0.0/14 239.196.0.0 239.199.255.255
239.200.0.0/13 239.200.0.0 239.207.255.255
239.208.0.0/12 239.208.0.0 239.223.255.255
239.224.0.0/11 239.224.0.0 239.255.255.255
****************************************************************************************************
IPSet(['10.0.0.0/8', '172.16.0.0/12', '192.0.2.0/24', '192.168.0.0/16', '225.0.0.0/8', '226.0.0.0/7', '228.0.0.0/6', '234.0.0.0/7', '236.0.0.0/7', '238.0.0.0/8', '239.192.0.0/14', '240.0.0.0/4'])
Process finished with exit code 0

示例代码:

from netaddr import IPSet
ip_list = ['0.0.0.1/0', '1.0.0.0/0']
aa = IPSet(ip_list)
print(aa)

运行结果:

 更多IPSet()用法参考官网:Tutorial 3: Working with IP sets — netaddr 0.8.0 documentation

其它功能:

import netaddr
ip_str = '192.168.1.1/28'
print(ip_str)
ip = netaddr.IPNetwork(ip_str)
print(ip)
# 子网掩码
print(ip.netmask)
# 广播地址
print(ip.broadcast)
# 网络地址
print(ip.network)
# 取反掩码
print(ip.hostmask)
# 同一段IP总数
print(ip.size)
# 修改地址的掩码长度为28
ip.prefixlen = 28
print(ip)
# 将同一网段的ip,再化为掩码长度为30的几个子网段
ips_list = [x for x in ip.subnet(30)]
print(ips_list)
# 获取某一网段的所有主机地址
ips_len = []
for ip in netaddr.IPNetwork(ip_str).iter_hosts():
    # print(ip)
    ips_len.append(ip)
print(len(ips_len))

运行结果:

IP范围:

import netaddr
def func(ips):
    lst = []
    if "-" in ips:
        first, last = ips.split("-")
        lst.append(netaddr.IPRange(first, last, flags=netaddr.INET_PTON))
    else:
        lst.append(netaddr.IPNetwork(ips, flags=netaddr.INET_PTON))
    return lst
ip1 = "192.168.1.1"
ret1 = func(ip1)
print(ret1)
ip2 = "192.168.1.1-192.168.1.10"
ret2 = func(ip2)
print(ret2)
print(ret2[0])

运行结果:

案例分析1

        给出一串带有ip的数据,通过处理后得到所有的ip列表。如数据:"10.1.1.3||10.1.1.6||10.1.1.9-10.1.1.15"

示例代码:

import netaddr
txt = "10.1.1.3||10.1.1.6||10.1.1.9-10.1.1.15"
ips = txt.split("||")
# print(ips)
ips_lst = []
for ip in ips:
    if "-" not in ip:
        ips_lst.append(ip)
    else:
        ip_2 = ip.split('-')
        ip_range = netaddr.IPRange(ip_2[0], ip_2[1])
        ip_lst = [str(ip) for ip in ip_range]
        ips_lst.extend(ip_lst)
print(ips_lst)

运行结果:

案例分析2

        给出一串带有ip的数据,通过处理后得到所有的ip列表。如数据:"10.1.1.3||10.1.1.6||10.1.1.9-10.1.1.15||10.1.2.20||10.1.1.9-10.1.2.15"

示例代码:

import netaddr
txt = "10.1.1.3||10.1.1.6||10.1.1.9-10.1.1.15||10.1.2.20||10.1.1.9-10.1.2.15"
ips = txt.split("||")
# print(ips)
ips_lst = []
for ip in ips:
    if "-" not in ip:
        ips_lst.append(ip)
    else:
        ip_2 = ip.split('-')
        ip_range = netaddr.IPRange(ip_2[0], ip_2[1])
        ip_lst = [str(ip) for ip in ip_range]
        ips_lst.extend(ip_lst)
print(ips_lst)
print(len(ips_lst))

运行结果:

适用于Python 2.7和3.5+的独立于系统的网络地址操作。 (不建议使用Python 2.7和3.5)。 提供以下支持: 第3层地址 IPv4和IPv6地址,子网,掩码,前缀 迭代,切片,分类,汇总和分类IP网络 处理各种范围格式(CIDR,任意范围和glob,nmap) 设置基于IP地址和子网的操作(联合,交叉点等) 解析各种不同的格式和符号 查找IANA IP阻止信息 生成DNS反向查询 超级网络和子网划分 第2层地址 表示和操作MAC地址和EUI-64标识符 查找IEEE组织信息(OUI,IAB) 生成派生的IPv6地址 从Python 3.3开始,Python标准提供了一个模块,该模块提供了与netaddr重叠的第3层地址处理功能。 分享并享受! (“网络:重新考虑IP的表示形式”) (“网络:ParseIP应该返回错误,就像其他Parse函数一样”) (“网络:无法可靠地将IPv4映射的IPv6地址与常规IPv4地址区分开”) 合并net.IPAddr和net.IP(由于遗留原因,Go net软件包之间有些破译) 待办事项:完成此列表 该软件包已成熟,经过优化,并且已在生产。但是,尚不能保证API的稳定性。 除了常规的Go测试之外,netaddr还使用模糊测试。语料单独存储在子模块,以最大程度地减少对其他所有人的影响。 使用方法: $ git submodule update --init $ go get -u gi IPNetwork对象用于表示接受CIDR前缀和网络掩码的子网,网络或vlan import netaddr ip=netaddr.IPNetwork('192.168.1.0/24') print(ip.ip) print(ip
  互联网上分布着很多设备,如电脑、手机、智能手表等。设备与设备之间会互相通信,如你给朋友发送一条微信语音信息,其实就是你的手机在与朋友的手机进行通信。   但是,这条信息为什么会准确到达你朋友的手机,而不是其他设备?这是因为网络上的每台设备都有一个唯一的网络地址。如果把网络信息看作日常生活的信件,网络地址就是信件上的收件人地址,有了这个地址,信息就能准确到达网络上的某一设备。   网络地址有不同类型,如 MAC 地址、IP 地址、URL 等,本关针对的是 IP 地址。IP 地址目前主要有两个版本:I..
[TOC] 0. 前言 IP地址目前存在两个版本:IPv4和IPv6,平常我们见到最多的就是IPv4了,如192.168.1.1/24,当然,IPv4地址池资源紧缺,IPv6已悄然大量部署了。 我们在设计网络架构时必须要对设备互联地址、环回地址、业务地址进行规划,那怎么规划?给你一个A类地址你怎么办?最重要是不是得计算?口算怕不准确吧?心算行不行,就不怕你没这本事,哈哈! 下面请用python帮...
from netaddr import IPNetwork # IPNetwork('192.168.7.80/30'), IPNetwork('192.168.7.84/30'), IPNetwork('192.168.7.88/30'), IPNetwork('192.168.7.92/30') ip_str...
Python关于IP处理的两个模块 这里介绍的两个处理IP好用的Python名为:ipaddr和netaddr 顺便提一个不好用的:IPy。上面两个能完全胜任这个的功能,但这个容错性不好,常报错。 1.ipaddr简单介绍: Google开发的IP处理模块,地址:http://pythonhosted.org/ipaddr/ 可用pip安装:pip install ipaddr 所有包含的类和方法使用help命令查看: help(ipaddr) Class总共分为:BaseIP、IPv4、IPv6 python netaddr的常用方法包括:IPv4Network类用于构建IPv4网络对象;IPv6Network类用于构建IPv6网络对象;IPRange类用于构建IPv4或IPv6的范围对象;IPGlob类用于构建IPv4或IPv6的通配符对象;IPv4Interface类用于构建IPv4接口对象;IPv6Interface类用于构建IPv6接口对象;IPv4Address类用于构建IPv4地址对象;IPv6Address类用于构建IPv6地址对象;IPv6Prefix类用于构建IPv6前缀对象;IPv4Prefix类用于构建IPv4前缀对象;IPv4Network类用于构建IPv4网络对象;IPv6Network类用于构建IPv6网络对象;IPNetwork类用于构建IPv4或IPv6的网络对象;IPv4Supernet类用于构建IPv4超网络对象;IPv6Supernet类用于构建IPv6超网络对象;IPSupernet类用于构建IPv4或IPv6的超网络对象;IPv6Map类用于构建IPv6映射对象;IPv4Map类用于构建IPv4映射对象。