[PYTHON] Essayez d'utiliser l'API PeeringDB 2.0

Aperçu

Ceci est l'article du 9ème jour de NetOpsCoding AdventCalender.

Cette fois, je vais créer un programme pour acquérir des informations AS en utilisant l'API publiée dans PeeringDB 2.0.

Qu'est-ce que l'appairage

L'interconnexion des réseaux d'organisations avec numéro AS est appelée Peer ou Peering. Plus précisément, le protocole BGP est exploité sur les routeurs des deux organisations, et les adresses IP et les numéros AS de chaque organisation sont exploités. L'appairage est réalisé par paramétrage.

Il existe plusieurs façons de faire du peering, mais je n'entrerai pas dans les détails ici. Si vous êtes intéressé par les détails, De nombreuses informations sont publiées, veuillez donc vous référer aux documents suivants. http://www.slideshare.net/taijitsuchiya5/wakamonog6-tsuchiya-public

Qu'est-ce que PeeringDB

Supposons que vous souhaitiez vous connecter au réseau de l'organisation A. À ce moment-là, "Quel est le numéro AS de l'organisation A?" "Quelle base DC possède le routeur de connexion?" "Quel opérateur IX est utilisé?" "Quelle adresse IP est utilisée?" "Où se trouve le contact? Vous devez connaître des informations telles que "?"

Si vous envisagez le Peering et souhaitez obtenir des informations sur l'organisation partenaire, les informations les plus utilisées au monde sont PeeringDB. PeeringDB est un système Web développé et exploité par une organisation à but non lucratif et des organisations du monde entier qui possèdent des informations de publication AS sur PeeringDB. (Cependant, étant donné que la publication d'informations est confiée à l'organisation propriétaire du SA, les informations peuvent être obsolètes ou ne pas être publiées en premier lieu.)

Peering DB 2.0 a été publié en version bêta en 2015. L'interface utilisateur et les fonctions ont été considérablement améliorées par rapport à la précédente PeeringDB, et des informations peuvent être obtenues à l'aide de l'API RESTful. http://docs.peeringdb.com/

Essayez d'utiliser PeeringDB

Tout le monde peut voir PeeringDB gratuitement. Par exemple, les informations AS de BIGLOBE peuvent être vérifiées comme suit. http://as2518.peeringdb.com/

En examinant PeeringDB, vous pouvez trouver des informations telles que "informations sur la société", "numéro AS", "flux de trafic approximatif", "politique de peering (critères de jugement du peering)" et "base de peering".

Presque le même contenu est publié dans PeeringDB 2.0. https://beta.peeringdb.com/net/2229

Essayez d'utiliser l'API PeeringDB 2.0

Les spécifications de l'API PeeringDB 2.0 sont publiées sur la page suivante. https://beta.peeringdb.com/apidocs/

Par exemple, si vous souhaitez obtenir toutes les informations BIGLOBE (AS2518) en même temps, accédez comme suit.

# Linux/Lors de l'acquisition depuis le terminal Mac
% curl https://beta.peeringdb.com/api/asn/2518

{
  "meta": {}, 
  "data": [
    {
      "id": 2229, 
      "org_id": 2934, 
      "org": {
        "id": 2934, 
        "name": "BIGLOBE Inc.", 
        "website": "", 
        "notes": "", 
        "net_set": [
          2229
        ], 
     
      (Partiellement omis)

      "name": "BIGLOBE Inc.", 
      "aka": "FullRoute", 
      "website": "http://www.biglobe.co.jp/en/", 
      "asn": 2518, 
      "looking_glass": "http://lg.fullroute.net/lg/", 
      "route_server": "", 
      "irr_as_set": "AS-MESH", 
      "info_type": "NSP", 
      "info_prefixes4": 750, 
      "info_prefixes6": 750, 
      "info_traffic": "200-300 Gbps", 
      "info_ratio": "Balanced", 
      "info_scope": "Asia Pacific", 
      "info_unicast": true, 
      "info_multicast": false, 
      "info_ipv6": true, 
      "notes": "We are connected to BBIX Singapore but not Hong Kong. We will only peer with Singapore switch participants.\r\n\r\nYou can ping and trace to ping.mesh.ad.jp(both IPv4 and IPv6).\r\n\r\nIRR Records should be viewed with source set to RADB or JPIRR. There are colliding records with the same AS-SET name, but from a different AS on RIPE. \r\n\r\nSee here for Japanese version of the peering policy http://www.biglobe.co.jp/pdf/PeeringPolicy2013_jp_03.pdf",
      "policy_url": "http://www.biglobe.co.jp/en/peering_policy.pdf",
      "policy_general": "Selective",
      "policy_locations": "Preferred",
      "policy_ratio": false,
      "policy_contracts": "Not Required",
      "netfac_set": [
        {
          "id": 17472,
          "fac_id": 19,
          "avail_sonet": false,
          "avail_ethernet": true,
          "avail_atm": false,
          "local_asn": 2518,
          "created": null,
          "updated": "2015-12-05T04:29:57Z",
          "status": ""
        },
        {
          "id": 9426,
          "fac_id": 142,
          "avail_sonet": false,
          "avail_ethernet": true,
          "avail_atm": false,
          "local_asn": 2518,
          "created": null,
          "updated": "2015-12-05T04:25:36Z",
          "status": ""
        },
        (Omis ci-dessous)

Il convient de noter ici que l'élément "netfac_set" contient des informations DC et des informations IX, mais puisque les données de "netfac_set" se réfèrent à une autre table en tant que clé externe, seul l'ID est inclus. ne pas. Si vous voulez en savoir plus sur les informations IX, vous devez créer une autre URL et l'exécuter.

Par exemple, si vous souhaitez voir plus d'informations spécifiées par "fac_id": 19 dans "netfac_set", vous devez exécuter une requête HTTP avec l'URL suivante.

% curl https://beta.peeringdb.com/api/fac/19                                                                                                                                                 (git)-[master]
{
  "meta": {},
  "data": [
    {
      "id": 19,
      "org_id": 618,
      "org_name": "CoreSite",
      "org": {
        "id": 618,
        "name": "CoreSite",
        "website": "",
        "notes": "",
        "net_set": [],
        "fac_set": [
          19,
          20,
          286,
          363,
          440,
          584,
          668,
          669,
          670,
          671,
          1229,
          1619,
          1671
        ],
        "ix_set": [],
        "address1": "",
        "address2": "",
        "city": "",
        "country": "",
        "state": "",
        "zipcode": "",
        "created": "2015-10-12T08:14:45Z",
        "updated": "2015-12-05T09:07:24Z",
        "status": "0"
      },
      "name": "CoreSite - LA1 - One Wilshire",
      "website": "http://www.coresite.com",
      "clli": "LSANCA",
      "rencode": "",
      "npanxx": "213-489",
      "notes": "",
      "created": null,
      "updated": "2015-12-05T09:05:59Z",
      "status": "0",
      "address1": "624 S. Grand Ave.",
      "address2": "Suite 110",
      "city": "Los Angeles",
      "country": "US",
      "state": "CA",
      "zipcode": "90017"
    }
  ]
}%

Dans l'API PeeringDB, les tables d'informations telles que les informations AS (asn), les informations DC (fac) et les informations IX (ix) sont stockées séparément telles que publiées sur https://beta.peeringdb.com/apidocs/. Elle est référencée comme clé externe.

De cette manière, si vous souhaitez obtenir les informations que vous souhaitez connaître avec l'API, vous devez obtenir la clé externe et exécuter la requête HTTP plusieurs fois tout en modifiant l'URL.

Programme d'acquisition d'informations avec l'API PeeringDB2.0

Créez un programme pour obtenir des informations à l'aide de l'API.

Ici, j'ai créé un programme Python qui génère les informations de tous les IX connectés aux informations de l'entreprise en donnant le numéro AS à l'argument et en l'exécutant comme indiqué ci-dessous.

% python get_peeringdb.py <Numéro AS cible>

Le programme est également disponible sur github. https://github.com/netops-coding/sample_peeringdb

get_peeringdb.py


#! /usr/bin/env python
# -*- coding: utf-8 -*-

from urllib2 import urlopen, HTTPError
from json import loads
import sys

def get_peeringdb(pdp_type, pdp_id):
    pdb_url = 'https://beta.peeringdb.com/api/%s/%s'% (pdp_type, pdp_id)

    try :
        result_json = urlopen(pdb_url).read()
        result_dict = loads(result_json)
    except HTTPError, err:
        if err.code == 404:
            return None
    return result_dict


if __name__ == '__main__' :
    as_num = sys.argv[1]

    # get company and AS information
    as_info_dict = get_peeringdb('asn', as_num)
    company_name = as_info_dict["data"][0]["org"]["name"]
    company_website = as_info_dict["data"][0]["website"]

    print as_num
    print company_name
    print company_website

    print '='*30

    # get IX information
    for netixlan_set in as_info_dict["data"][0]["netixlan_set"]:
        ixlan_id = netixlan_set["ixlan_id"]
        ipaddr4 = netixlan_set["ipaddr4"]
        ipaddr6 = netixlan_set["ipaddr6"]

        ixlan_info_dict = get_peeringdb('ixlan', ixlan_id)
        ix_name =  ixlan_info_dict["data"][0]["ix"]["org"]["name"]

        print ix_name
        print ipaddr4
        print ipaddr6
        print '='*30

Exécutez-le avec la commande suivante. Ici, BIGLOBE (AS2518) est spécifié.

% python get_peeringdb.py 2518

                                                                                                                                                         (git)-[master]
2518
BIGLOBE Inc.
http://www.biglobe.co.jp/en/
==============================
Equinix Osaka
None
None
==============================
Equinix San Jose
206.223.116.156
2001:504:0:1::2518:1
==============================
Equinix Singapore
202.79.197.180
2001:de8:4::2518:1
==============================
HKIX
123.255.90.157
2001:7fa:0:1::ca28:a09d
==============================
Equinix Tokyo
203.190.230.56
2001:de8:5::2518:2
==============================
Equinix Tokyo
203.190.230.83
2001:de8:5::2518:3
==============================
SGIX
103.16.102.69
2001:de8:12:100::69
==============================
CoreSite - Any2 California
206.72.210.154
2001:504:13::210:154
==============================
BBIX Hong Kong / Singapore
103.231.152.25
2001:df5:b800:bb00::2518:1
==============================
JPIX
210.171.224.181
2001:de8:8::2518:2
==============================
BBIX Tokyo
218.100.6.47
2001:de8:c::2518:1
==============================
BBIX Tokyo
218.100.6.73
2001:de8:c::2518:2
==============================
JPNAP Tokyo
210.173.176.14
2001:7fa:7:1::2518:2
==============================
JPNAP Tokyo
210.173.176.124
2001:7fa:7:1::2518:3
==============================

Comme décrit ci-dessus, nous avons pu créer un programme qui acquiert une liste d'informations IX auxquelles l'organisation est connectée simplement en spécifiant le numéro AS.

Package Python publié

En regardant le programme créé cette fois, la structure de données de PeeringDB 2.0 telle que "as_info_dict [" data "] [0] [" org "] [" name "]" est utilisée telle quelle, et un tiers la programme. C'est très difficile à comprendre quand on y regarde, et lors du développement de fonctions supplémentaires, il est nécessaire de procéder au développement tout en examinant la structure des données, qui a tendance à être compliquée.

En utilisant le package Python qui a déjà été publié, vous pouvez développer des logiciels sans avoir connaissance de ces structures de données.

J'ai trouvé deux packages Python: En conclusion, le deuxième package est efficace pour faciliter le développement de logiciels, mais il y a des problèmes et il est encore complètement difficile à utiliser. Nous attendons avec impatience le développement de la deuxième réparation et des fonctions supplémentaires.

finalement

Cette fois, j'ai créé un logiciel pour obtenir les informations publiées dans PeeringDB via API. Il est très pratique d'obtenir des informations publiques de PeeringDB lors de la création d'une base de données d'informations d'entreprise et d'informations sur le réseau qui est Peering avec votre propre réseau. Veuillez l'utiliser si vous avez une chance.

Recommended Posts

Essayez d'utiliser l'API PeeringDB 2.0
Essayez d'utiliser l'API Twitter
Essayez d'utiliser l'API Twitter
Essayez d'utiliser l'API Wunderlist en Python
Essayez d'utiliser l'API Kraken avec Python
Essayez d'utiliser l'API DropBox Core avec Python
Essayez d'utiliser l'API Admin de la passerelle Janus
Essayez d'utiliser l'API de Pleasant (python / FastAPI)
Essayez d'utiliser l'API d'action de Python argparse
Essayez d'utiliser le module Python Cmd
J'ai essayé d'utiliser l'API checkio
Pour le moment, essayez d'utiliser l'API de dialogue de discussion docomo
Essayez d'utiliser Tkinter
Essayez d'utiliser le framework d'application Web Flask
Essayez d'utiliser le LiDAR de 6 $ de réduction (Camsense X1)
Essayez d'utiliser la bande HL dans l'ordre
Essayez d'utiliser Cookiecutter
Essayez d'utiliser PDFMiner
Essayez l'API de visage de Microsoft Cognitive Services
Tweet à l'aide de l'API Twitter en Python
Essayez d'utiliser des géopandas
Essayez d'utiliser Selenium
Essayez d'utiliser scipy
Essayez l'analyse de cluster par K-means
Créer une application à l'aide de l'API Spotify
Essayez d'utiliser pandas.DataFrame
Essayez d'utiliser django-swiftbrowser
Essayez d'utiliser matplotlib
Essayez d'utiliser tf.metrics
Jouez avec Dajare en utilisant l'API COTOHA
Essayez d'utiliser PyODE
Essayez d'accéder à l'API Spotify dans Django.
Enregistrez des événements personnalisés à l'aide de l'API Shotgun
J'ai essayé d'utiliser l'API BigQuery Storage
J'ai recherché dans la bibliothèque l'utilisation de l'API Gracenote
Accédez à l'API Web à l'aide de requêtes Exemple: Flickr
Python: essayez d'utiliser l'interface utilisateur sur Pythonista 3 sur iPad
Essayez d'utiliser jieba, un moteur d'analyse morphologique chinois
J'ai essayé d'utiliser l'API Google Cloud Vision
Essayez d'utiliser le framework Web Python Tornado Partie 1
Essayez d'utiliser LINE Notify pour le moment
Essayez d'utiliser le module de collections (ChainMap) de python3
Essayez d'utiliser l'API kabu station de au Kabucom Securities
Essayez d'utiliser le framework Web Python Tornado Partie 2
Essayez d'accéder à l'API YQL directement depuis Python 3
Essayez d'utiliser l'API ChatWork et l'API Qiita en Python
Essayez d'utiliser virtualenv (virtualenvwrapper)
[Azure] Essayez d'utiliser Azure Functions
Essayez d'utiliser virtualenv maintenant
Essayez d'utiliser W & B
Essayez d'utiliser Django templates.html
[Kaggle] Essayez d'utiliser LGBM
Essayez d'utiliser l'analyseur de flux de Python.
Essayez d'utiliser Tkinter de Python
Essayez l'API C ++ de NNabla
Essayez d'utiliser Tweepy [Python2.7]
Essayez d'utiliser collate_fn de Pytorch
Essayez de dessiner un graphe social à l'aide de l'API Twitter v2
Paramètres initiaux lors de l'utilisation de l'API foursquare avec python