Выполните локализованный массовый поиск ASN в большом наборе данных IP-адресов.
Загрузите два набора данных BGP, ссылки на которые указаны в верхней части документа (http://thyme.apnic.net/current/data-raw-table и http://thyme.apnic.net/current/data-used-autnums). . Первый из них содержит все присвоенные IANA диапазоны подсетей и связанные с ними номера ASN. Второй — список номеров ASN и дескриптор. Оба они обновляются ежедневно с 4:00 до 9:00 +10GMT, как указано на http://thyme.apnic.net. Поместите эти два файла и список IP-адресов, которые вы хотите найти, с именем uniq_ip.txt, в ту же папку, что и сценарий ip2asn.py. Выполните Bulk-ip-to-asn-correlation.py. Вам будут предоставлены два выходных файла: ip2asn--invalids.txt, содержащий список всех выявленных недействительных IP-адресов (включая локальные и зарезервированные адреса), и ip2asn-results.txt, содержащий CSV. отформатированные результаты с заголовком временной метки,ip,asn,asn descriptor».
Мне потребовалось некоторое время, чтобы найти наиболее эффективный способ корреляции между предоставленным IP-адресом и связанной с ним подсетью, зарегистрированной в IANA.
Ключ к моей реализации объяснен в первых «Других примерах» на странице https://docs.python.org/3/library/bisect.html, где они связывают буквенную оценку с результатом теста на основе шкалы оценок.
Обратите внимание, что все IP-адреса преобразуются в целочисленные значения для вычислений.
Сначала я создаю кортеж из общего количества IP-адресов, содержащихся в каждом префиксе CIDR, от /1 до /32, и сохраняю их в NETMASK_MAP. Я думаю создать чистый список IP-адресов, которые будут искаться в предоставленном файле, отфильтровывая недействительные адреса. Во время этого процесса я также извлекаю уникальный список первых октетов для адресов нашего запроса. Это будет использоваться для фильтрации многих ненужных диапазонов из наборов данных BGP.
Затем я создаю две таблицы поиска, используя файл таблицы необработанных данных, содержащий зарегистрированные в IANA подсети и соответствующие им номера ASN. Для каждой подсети в наборе данных BGP мы сначала определяем, включен ли первый октет в наш уникальный список октетов из IP-адресов запроса. Если да, то мы вычисляем максимальный IP-адрес (calculate_net_rage()) в указанном диапазоне CIDR. Эти максимальные IP-адреса добавляются в таблицу subnet_lookup_table. Вторая таблица, asn_lookup_table, создается последовательно и содержит соответствующий номер ASN для каждого максимального IP-адреса. Это соответствует примеру деления оценок, где subnet_lookup_table — это переменная точек останова, а asn_lookup_table — буквенные оценки.
Затем мы создаем итоговую таблицу на основе набора данных BGP data-used-autnums, которая содержит корреляцию номеров ASN с текстом их дескриптора.
Наконец, для каждого IP-адреса в нашем очищенном списке запросов мы выполняем деление пополам, как описано в связанной документации Python, чтобы сопоставить, под какой максимальный IP-адрес попадает данный IP-адрес, и связанный с ним номер ASN. Затем это соотносится с текстом дескриптора.
Если предоставленный вами IP-адрес не существует, я понятия не имею, что произойдет. Вероятно, он взорвется. Удачи.