PROJET AUTOBLOG


Shaarli - Les discussions de Shaarli

Archivé

Site original : Shaarli - Les discussions de Shaarli du 23/07/2013

⇐ retour index

IP to ASN Mapping - Team Cymru

mercredi 30 septembre 2015 à 13:34
GuiGui's Show - Liens
Dans un programme Python, on souhaite obtenir le nom de la structure (société commerciale, association,...) a laquelle a été attribué un numéro d'AS (exemple : 60630 = ARN). On souhaite aussi avoir le pays de la maison mère de la structure. Pour obtenir cette information, on utilise habituellement whois (exemple : whois AS60630). Mais, quelle lib utiliser dans un programme Python ?

Il y a plusieurs contraintes à prendre en compte :
   * La sortie whois n'est pas normalisée : tous les RIR ont choisi un format « clé: valeur » mais le nom des clés est différent ainsi que la présence/absence de ces clés :
       * Les champs as-name + descr de l'objet aut-num et le champ address dans l'objet organisation associé à l'objet aut-num pour le RIPE ;
       * Les champs as-name + descr + country de l'objet aut-num pour l'APNIC
       * Les champs as-name + descr de l'objet aut-num et le champ country de l'objet organisation associé à l'objet aut-num pour AfriNIC
       * Les champs ASName + OrgName + Country pour l'ARIN
       * Les champs owner et country de l'objet aut-num pour LACNIC
   Il faudra donc parser la sortie whois que l'on obtiendra... Vu le taux d'erreur possibles, ça serait cool de ré-utiliser une lib éprouvée qui fasse le taff pour nous.

   * RDAP, le protocol de remplacement de whois en cours de normalisation à l'IETF (voir : http://www.bortzmeyer.org/weirds-rdap.html) normalise le format de sortie (JSON), la syntaxe (les types utilisables et les classes (domain, ip, autnum, entity,...), le transport des requêtes (REST) et tout un tas d'autres choses mais les informations que les RIR doivent mettre dans la classe autnum comme name et country sont en "peuvent être présentes" (voir https://www.rfc-editor.org/rfc/rfc7483.txt) et donc tous les RIR ne les exposent pas surtout le pays et la description...

   * On peut utiliser les services whois de RADB (http://www.radb.net/, whois.radb.net), service proposé par MERIT (réseau non-lucratif pour éducation gouvernement, organismes de santée et associations principalement au Michigan) ou celui de la team Cymru (https://www.team-cymru.org/IP-ASN-mapping.html) car ils proposent tous deux une syntaxe facilement parsable et invariant. Notons que RADB n'expose pas d'info sur le pays.

   * Les principales lib python (IPWhois, python-whois, pywhois, ...) ne supportent pas les interrogations portant sur un numéro d'AS

   * Le service de la Team Cymru peut être consulté en utilisant le protocole DNS :
     $ dig +short TXT AS60630.asn.cymru.com
       "60630 | FR | ripencc | 2013-06-10 | ARN Association Alsace Reseau Neutre,FR"
   Enjoy \o/


Donc au final, ça donne ça :
« import dns.resolver

_WHOIS_OVER_DNS_EXT_SERVICE_ = '.asn.cymru.com'

[...]

asn = '60630'

dnsresolver = dns.resolver.Resolver()
dnsresolver.timeout = 1
dnsresolver.lifetime = 1

try:
 dnsanswer = dnsresolver.query('AS'+asn+_WHOIS_OVER_DNS_EXT_SERVICE_, 'TXT')
 asowner = str(dnsanswer.rrset).split('|')[4]

except dns.exception.DNSException:
 asowner = 'ERROR'

print 'ASN:'+asn+' ( '+asowner+' )' »
(Permalink)