我正在寻找一种快速检查IP地址是否属于CIDR标记IP范围列表的方法。我在使用netaddr之前见过例子:
from netaddr import IPNetwork, IPAddress
for CIDR in CIDRLIST:
if IPAddress(row[0]) in IPNetwork(CIDR):
print('success')
然而,这个解决方案对我的问题来说太慢了(CIDR中的800个IP范围和500.000个IP地址)。
有什么方法可以更快地完成这项工作?我读过关于使用pytry的内容,但我不确定这是解决方案。
答案 0 :(得分:1)
Patricia / Radix tree / tries似乎就是答案。我通过搜索查找路由表的算法找到了它们。
有一个python实现here。
过了一会儿:我现在在Ruby中工作得很好:
require 'rpatricia' require 'uoainfoblox' ib = UoAIinfoblox.new ({'user' => 'xxxxx', 'password' => 'yyyy', 'host' => 'ipam.auckland.ac.nz'}) pt = Patricia.new ib.get_networks('*roaming_network=true').each do |net, info | pt.add(net) end puts "'130.216.66.65 #{ pt.include?('130.216.66.65')}" puts "130.216.5.128 #{pt.include?('130.216.5.128') }"
Infoblox是一个IP管理系统,UoAInfoblox是他们的网络API的包装。所以在这里我得到一个漫游网络列表,将它们添加到patricia树中,然后检查两个IP地址(我知道其状态)。
编辑:我刚刚从一位使用python的朋友那里发现,他在我的CS部门教授网络,他在他的研究脚本中使用了python radix模块。我知道他正在为CAIDA处理来自/ 8 darkenet的大量数据。