Realice una búsqueda masiva de ASN localizada en un conjunto de datos masivo de direcciones IP
Descargue los dos conjuntos de datos BGP vinculados en la parte superior del documento (http://thyme.apnic.net/current/data-raw-table y http://thyme.apnic.net/current/data-used-autnums) . El primero de ellos contiene todos los rangos de subred asignados por la IANA y sus números ASN asociados. El segundo una lista de números ASN y descriptores. Ambos se actualizan diariamente entre las 4 a.m. y las 9 a.m. +10GMT como se describe en http://thyme.apnic.net. Coloque estos dos archivos y la lista de IP que desea buscar denominada uniq_ip.txt, dentro de la misma carpeta que el script ip2asn.py. Ejecute Bulk-ip-to-asn-correlation.py. Se le proporcionarán dos archivos de salida: ip2asn--invalids.txt que contiene una lista de todas las direcciones IP no válidas identificadas (incluidas las direcciones locales y reservadas) e ip2asn-results.txt que contiene csv. resultados formateados con un encabezado de marca de tiempo, ip, asn, "descriptor asn".
Me tomó un tiempo descubrir la forma más eficiente de realizar la correlación entre una dirección IP proporcionada y su subred asociada registrada en la IANA.
La clave de mi implementación se explica en los primeros "Otros ejemplos" en https://docs.python.org/3/library/bisect.html, donde asocian una calificación con letras a una puntuación de prueba basada en una escala de calificaciones.
Tenga en cuenta que todas las direcciones IP se convierten a su valor entero para su cálculo.
Primero, creo una tupla del número total de direcciones IP contenidas en cada prefijo CIDR, desde /1 hasta /32 y las almaceno en NETMASK_MAP. Pienso crear una lista limpia de direcciones IP que se buscarán en el archivo proporcionado, filtrando las direcciones no válidas. Durante este proceso también extraigo una lista única de los primeros octetos para nuestras direcciones de consulta. Esto se utilizará para filtrar muchos de los rangos innecesarios de los conjuntos de datos BGP.
A continuación, construyo dos tablas de búsqueda utilizando el archivo de tabla de datos sin procesar que contiene las subredes registradas por la IANA y sus respectivos ASN. Para cada subred en el conjunto de datos BGP, primero determinamos si el primer octeto está incluido en nuestra lista única de octetos de las direcciones IP de consulta. Si es así, calculamos la dirección IP máxima (calculate_net_rage()) en el rango CIDR especificado. Estas IP máximas se agregan a subnet_lookup_table. Se crea una segunda tabla, asn_lookup_table, en secuencia y contiene el número ASN correspondiente para cada dirección IP máxima. Esto sigue el ejemplo de bisección de calificaciones donde subnet_lookup_table es la variable de puntos de interrupción y asn_lookup_table son las calificaciones en letras.
Luego construimos una tabla final a partir del conjunto de datos BGP data-used-autnums que contiene una correlación de los números ASN con su texto descriptor.
Finalmente, para cada dirección IP en nuestra lista de consultas limpias, realizamos una bisección como se describe en la documentación de Python vinculada para correlacionar a qué dirección IP máxima se encuentra la IP dada y su número ASN asociado. Luego se correlaciona con el texto del descriptor.
Si la IP que proporcionas no existe, no tengo idea de qué pasará. Probablemente explotará. Buena suerte.