Execute uma pesquisa localizada de ASN em massa em um conjunto de dados em massa de endereços IP
Baixe os dois conjuntos de dados BGP vinculados na parte superior do documento (http://thyme.apnic.net/current/data-raw-table e http://thyme.apnic.net/current/data-used-autnums) . O primeiro deles contém todos os intervalos de sub-redes atribuídos pela IANA e seus números ASN associados. O segundo é uma lista de números ASN e descritores. Ambos são atualizados diariamente entre 4h e 9h +10GMT conforme descrito em http://thyme.apnic.net. Coloque esses dois arquivos e a lista de IPs que você deseja pesquisar chamada uniq_ip.txt, na mesma pasta do script ip2asn.py. Execute bulk-ip-to-asn-correlation.py Você receberá dois arquivos de saída – ip2asn--invalids.txt contendo uma lista de todos os endereços IP inválidos identificados (incluindo endereços locais e reservados) e ip2asn-results.txt contendo csv resultados formatados com um cabeçalho de timestamp,ip,asn,”descritor asn”.
Levei algum tempo para descobrir a maneira mais eficiente de realizar a correlação entre um endereço IP fornecido e sua sub-rede associada, conforme registrado pela IANA.
A chave para minha implementação é explicada nos primeiros “Outros exemplos” em https://docs.python.org/3/library/bisect.html, onde eles associam uma nota em letras a uma pontuação de teste baseada em uma escala de notas.
Observe que todos os endereços IP são convertidos em seus valores inteiros para cálculo.
Primeiro, crio uma tupla do número total de endereços IP contidos em cada prefixo CIDR, de /1 a /32 e armazeno-os em NETMASK_MAP. Acho que crie uma lista limpa de endereços IP que serão pesquisados no arquivo fornecido, filtrando endereços inválidos. Durante esse processo, também extraio uma lista exclusiva dos primeiros octetos para nossos endereços de consulta. Isso será utilizado para filtrar muitos dos intervalos desnecessários dos conjuntos de dados BGP.
Em seguida, construo duas tabelas de pesquisa utilizando o arquivo data-raw-table contendo sub-redes registradas na IANA e seus respectivos ASNs. Para cada sub-rede no conjunto de dados BGP, primeiro determinamos se o primeiro octeto está incluído em nossa lista uniq de octetos dos endereços IP da consulta. Se for, calculamos o endereço IP máximo (calculate_net_rage()) no intervalo CIDR especificado. Esses IPs máximos são adicionados a subnet_lookup_table. Uma segunda tabela, asn_lookup_table, é criada em sequência contendo o número ASN correspondente para cada endereço IP máximo. Isso segue o exemplo da bissecção da nota, onde subnet_lookup_table é a variável de pontos de interrupção e asn_lookup_table são as notas das letras.
Em seguida, construímos uma tabela final a partir do conjunto de dados BGP data-used-autnums que contém uma correlação dos números ASN com o texto do descritor.
Finalmente, para cada endereço IP em nossa lista de consulta limpa, realizamos uma bissecção conforme descrito na documentação do python vinculada para correlacionar em qual endereço IP máximo o IP fornecido se enquadra e seu número ASN associado. Isso é então correlacionado ao texto do descritor.
Se o IP que você fornece não existir, não tenho ideia do que acontecerá. Provavelmente explodirá. Boa sorte.