Effectuer une recherche ASN de masse localisée sur un ensemble de données en masse d'adresses IP
Téléchargez les deux ensembles de données BGP liés en haut du document (http://thyme.apnic.net/current/data-raw-table et http://thyme.apnic.net/current/data-used-autnums) . Le premier contient toutes les plages de sous-réseaux attribuées par l'IANA et leurs numéros ASN associés. La seconde une liste de numéros ASN et de descripteur. Ils sont tous deux mis à jour quotidiennement entre 4h et 9h +10GMT, comme indiqué sur http://thyme.apnic.net. Placez ces deux fichiers, ainsi que la liste des adresses IP que vous souhaitez rechercher, nommée uniq_ip.txt, dans le même dossier que le script ip2asn.py. Exécutez Bulk-ip-to-asn-correlation.py Vous recevrez deux fichiers de sortie : ip2asn--invalids.txt contenant une liste de toutes les adresses IP invalides identifiées (y compris les adresses locales et réservées) et ip2asn-results.txt contenant un fichier CSV. résultats formatés avec un en-tête timestamp,ip,asn, "asn descriptor".
Il m'a fallu un certain temps pour trouver le moyen le plus efficace d'effectuer la corrélation entre une adresse IP fournie et son sous-réseau associé tel qu'enregistré auprès de l'IANA.
La clé de mon implémentation est expliquée dans les premiers « Autres exemples » sur https://docs.python.org/3/library/bisect.html où ils associent une note alphabétique à un résultat de test basé sur une échelle de notation.
Notez que toutes les adresses IP sont converties en leur valeur entière pour le calcul.
Tout d'abord, je crée un tuple du nombre total d'adresses IP contenues dans chaque préfixe CIDR, de /1 à /32, et je les stocke dans NETMASK_MAP. Je pense créer une liste propre d'adresses IP qui seront recherchées à partir du fichier fourni, en filtrant les adresses invalides. Au cours de ce processus, j'extrais également une liste unique des premiers octets pour nos adresses de requête. Cela sera utilisé pour filtrer de nombreuses plages inutiles des ensembles de données BGP.
Ensuite, je crée deux tables de recherche en utilisant le fichier de table brute de données contenant les sous-réseaux enregistrés par l'IANA et leurs ASN respectifs. Pour chaque sous-réseau de l'ensemble de données BGP, nous déterminons d'abord si le premier octet est inclus dans notre liste unique d'octets provenant des adresses IP de requête. Si tel est le cas, nous calculons ensuite l'adresse IP maximale (calculate_net_rage()) dans la plage CIDR spécifiée. Ces adresses IP maximales sont ajoutées à subnet_lookup_table. Une deuxième table, asn_lookup_table, est créée en séquence avec celle-ci contenant le numéro ASN correspondant pour chaque adresse IP maximale. Cela suit l'exemple de la bissecte des notes où subnet_lookup_table est la variable des points d'arrêt et asn_lookup_table les notes des lettres.
Nous construisons ensuite un tableau final à partir de l'ensemble de données BGP data-used-autnums qui contient une corrélation des numéros ASN avec leur texte descripteur.
Enfin, pour chaque adresse IP de notre liste de requêtes nettoyée, nous effectuons une bissectrice comme indiqué dans la documentation python liée pour corréler l'adresse IP maximale à laquelle appartient l'adresse IP donnée et le numéro ASN associé. Celui-ci est ensuite corrélé au texte du descripteur.
Si l'adresse IP que vous fournissez n'existe pas, je n'ai aucune idée de ce qui se passera. Il va probablement exploser. Bonne chance.