对 IP 地址的批量数据集执行本地化的批量 ASN 查找
下载文档顶部链接的两个 BGP 数据集(http://thyme.apnic.net/current/data-raw-table 和 http://thyme.apnic.net/current/data-used-autnums) 。其中第一个包含 IANA 分配的所有子网范围及其关联的 ASN 号。第二个是 ASN 编号和描述符列表。它们每天都会在格林尼治标准时间 +10 点之间进行更新,如 http://thyme.apnic.net 中所述。将这两个文件以及您要查找的名为 uniq_ip.txt 的 IP 列表放置在与 ip2asn.py 脚本相同的文件夹中。执行bulk-ip-to-asn-correlation.py 您将获得两个输出文件 – ip2asn--invalids.txt 包含所有已识别的无效 IP 地址(包括本地和保留地址)的列表和 ip2asn-results.txt 包含 csv格式化结果,标头为时间戳、ip、asn、“asn 描述符”。
我花了一段时间才找到最有效的方法来执行所提供的 IP 地址与其从 IANA 注册的关联子网之间的关联。
我的实现的关键在 https://docs.python.org/3/library/bisect.html 的第一个“其他示例”中进行了解释,其中它们根据评分标准将字母等级与测试分数相关联。
请注意,所有 IP 地址都将转换为其整数值以进行计算。
首先,我创建每个 CIDR 前缀中包含的 IP 地址总数(从 /1 到 /32)的元组,并将它们存储在 NETMASK_MAP 中。我认为创建一个干净的 IP 地址列表,将从提供的文件中查找该列表,过滤掉无效地址。在此过程中,我还为我们的查询地址提取了第一个八位字节的唯一列表。这将用于从 BGP 数据集中过滤掉许多不需要的范围。
接下来,我利用包含 IANA 注册子网及其各自 ASN 的 data-raw-table 文件构建两个查找表。对于 BGP 数据集中的每个子网,我们首先确定第一个八位字节是否包含在查询 IP 地址的八位字节的 uniq 列表中。如果是,我们然后计算指定 CIDR 范围内的最大 IP 地址 (calculate_net_rage())。这些最大 IP 数量将添加到subnet_lookup_table 中。第二个表 asn_lookup_table 是按顺序创建的,其中包含每个最大 IP 地址对应的 ASN 编号。这遵循成绩平分示例,其中subnet_lookup_table 是断点变量,asn_lookup_table 是字母成绩。
然后,我们根据 data-used-autnums BGP 数据集构建最终表,其中包含 ASN 编号与其描述符文本的相关性。
最后,对于清理后的查询列表中的每个 IP 地址,我们按照链接的 Python 文档中的概述执行二等分,以关联给定 IP 所属的最大 IP 地址及其关联的 ASN 编号。然后将其与描述符文本相关联。
如果你提供的IP不存在我不知道会发生什么。它可能会爆炸。祝你好运。