[PYTHON] Versuchen Sie es mit der PeeringDB 2.0-API

Überblick

Dies ist der Artikel zum 9. Tag von NetOpsCoding AdventCalender.

Dieses Mal werde ich ein Programm zum Abrufen von AS-Informationen mithilfe der in PeeringDB 2.0 veröffentlichten API erstellen.

Was ist Peering?

Die Verbindung von Netzwerken von Organisationen mit AS-Nummer wird als Peer oder Peering bezeichnet. Insbesondere wird das Protokoll BGP auf den Routern beider Organisationen ausgeführt, und die IP-Adressen und AS-Nummern jeder Organisation werden ausgeführt. Peering wird durch Einstellen realisiert.

Es gibt verschiedene Möglichkeiten, Peering durchzuführen, aber ich werde hier nicht auf Details eingehen. Wenn Sie an den Details interessiert sind, Es werden viele Informationen veröffentlicht. Weitere Informationen finden Sie in den folgenden Materialien. http://www.slideshare.net/taijitsuchiya5/wakamonog6-tsuchiya-public

Was ist PeeringDB?

Angenommen, Sie möchten eine Verbindung zum Netzwerk von Organisation A herstellen. Zu diesem Zeitpunkt: „Wie lautet die AS-Nummer von Organisation A?“ „Welche DC-Basis hat den Verbindungsrouter?“ „Welcher IX-Operator wird verwendet?“ „Welche IP-Adresse wird verwendet?“ „Wo ist der Kontakt? Sie müssen Informationen wie "?"

Wenn Sie über Peering nachdenken und Informationen über die Partnerorganisation erhalten möchten, ist PeeringDB die weltweit am häufigsten verwendete Information. PeeringDB ist ein Web-System, das von einer gemeinnützigen Organisation und Organisationen auf der ganzen Welt entwickelt und betrieben wird, die AS-Post-Informationen zu PeeringDB besitzen. (Da die Veröffentlichung von Informationen jedoch der Organisation anvertraut wird, der der AS gehört, sind die Informationen möglicherweise veraltet oder werden möglicherweise gar nicht erst veröffentlicht.)

Peering DB 2.0 wurde 2015 als Beta-Version veröffentlicht. Die Benutzeroberfläche und die Funktionen wurden gegenüber der vorherigen PeeringDB erheblich verbessert, und Informationen können mithilfe der RESTful-API abgerufen werden. http://docs.peeringdb.com/

Versuchen Sie es mit PeeringDB

Jeder kann PeeringDB kostenlos sehen. Beispielsweise können die AS-Informationen von BIGLOBE wie folgt überprüft werden. http://as2518.peeringdb.com/

Durch Überprüfen der PeeringDB finden Sie Informationen wie "Unternehmensinformationen", "AS-Nummer", "grober Verkehrsfluss", "Peering-Richtlinie (Peering-Beurteilungskriterien)" und "Peering-Basis".

Fast der gleiche Inhalt wird in PeeringDB 2.0 veröffentlicht. https://beta.peeringdb.com/net/2229

Versuchen Sie es mit der PeeringDB 2.0-API

Die Spezifikationen der PeeringDB 2.0-API werden auf der folgenden Seite veröffentlicht. https://beta.peeringdb.com/apidocs/

Wenn Sie beispielsweise BIGLOBE (AS2518) -Informationen auf einmal abrufen möchten, greifen Sie wie folgt zu.

# Linux/Beim Erwerb vom Mac-Terminal
% 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
        ], 
     
      (Teilweise weggelassen)

      "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": ""
        },
        (Unten weggelassen)

Hierbei ist zu beachten, dass das Element "netfac_set" DC-Informationen und IX-Informationen enthält. Da sich die Daten von "netfac_set" jedoch auf eine andere Tabelle als externen Schlüssel beziehen, ist nur die ID enthalten. nicht. Wenn Sie mehr über IX-Informationen erfahren möchten, müssen Sie eine andere URL erstellen und ausführen.

Wenn Sie beispielsweise weitere durch "fac_id": 19 in "netfac_set" angegebene Informationen anzeigen möchten, müssen Sie eine HTTP-Anforderung mit der folgenden URL ausführen.

% 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"
    }
  ]
}%

In der PeeringDB-API werden Informationstabellen wie AS-Informationen (asn), DC-Informationen (fac) und IX-Informationen (ix) separat gespeichert, wie unter https://beta.peeringdb.com/apidocs/ veröffentlicht. Es wird als externer Schlüssel bezeichnet.

Auf diese Weise müssen Sie, wenn Sie die Informationen erhalten möchten, die Sie mit der API wissen möchten, den externen Schlüssel abrufen und die HTTP-Anforderung mehrmals ausführen, während Sie die URL ändern.

Programm zum Abrufen von Informationen mit der PeeringDB2.0-API

Erstellen Sie ein Programm, um Informationen mithilfe der API abzurufen.

Hier habe ich ein Python-Programm erstellt, das die Informationen aller mit den Unternehmensinformationen verbundenen IXs ausgibt, indem ich dem Argument die AS-Nummer gebe und sie wie unten gezeigt ausführe.

% python get_peeringdb.py <Ziel-AS-Nummer>

Das Programm ist auch auf Github verfügbar. 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

Führen Sie es mit dem folgenden Befehl aus. Hier wird BIGLOBE (AS2518) angegeben.

% 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
==============================

Wie oben beschrieben, konnten wir ein Programm erstellen, das eine Liste von IX-Informationen abruft, mit denen die Organisation verbunden ist, indem wir einfach die AS-Nummer angeben.

Veröffentlichtes Python-Paket

Mit Blick auf das diesmal erstellte Programm wird die Datenstruktur von PeeringDB 2.0 wie "as_info_dict [" data "] [0] [" org "] [" name "]" unverändert verwendet und von einem Drittanbieter programmiert. Es ist sehr schwer zu verstehen, wenn Sie es betrachten, und wenn Sie zusätzliche Funktionen entwickeln, ist es notwendig, mit der Entwicklung fortzufahren, während Sie die Datenstruktur untersuchen, was tendenziell kompliziert ist.

Mit dem bereits veröffentlichten Python-Paket können Sie Software entwickeln, ohne diese Datenstrukturen zu kennen.

Ich habe zwei Python-Pakete gefunden: Zusammenfassend lässt sich sagen, dass das zweite Paket die Softwareentwicklung erleichtert, es jedoch Probleme gibt und die Verwendung immer noch völlig schwierig ist. Wir freuen uns auf die Entwicklung der zweiten Reparatur und zusätzlicher Funktionen.

Schließlich

Dieses Mal habe ich Software entwickelt, um die in PeeringDB veröffentlichten Informationen über die API zu erhalten. Es ist sehr praktisch, Informationen aus der Öffentlichkeit von PeeringDB abzurufen, wenn Sie eine Datenbank mit Unternehmensinformationen und Netzwerkinformationen erstellen, die Peering mit Ihrem eigenen Netzwerk enthält. Bitte benutzen Sie es, wenn Sie eine Chance haben.

Recommended Posts

Versuchen Sie es mit der PeeringDB 2.0-API
Versuchen Sie es mit der Twitter-API
Versuchen Sie es mit der Twitter-API
Versuchen Sie es mit der Wunderlist-API in Python
Versuchen Sie, die Kraken-API mit Python zu verwenden
Versuchen Sie, die DropBox Core-API mit Python zu verwenden
Versuchen Sie es mit der Admin-API von Janus Gateway
Versuchen Sie es mit der Pleasant-API (Python / FastAPI).
Versuchen Sie es mit der Aktions-API von Python argparse
Versuchen Sie es mit dem Python Cmd-Modul
Ich habe versucht, die checkio-API zu verwenden
Versuchen Sie vorerst, die Docomo-Chat-Dialog-API zu verwenden
Versuchen Sie es mit Tkinter
Versuchen Sie es mit dem Webanwendungsframework Flask
Versuchen Sie es mit dem $ 6 Rabatt LiDAR (Camsense X1)
Versuchen Sie, das HL-Band der Reihe nach zu verwenden
Versuchen Sie es mit einem Ausstecher
Versuchen Sie es mit PDFMiner
Probieren Sie die Microsoft Cognitive Services Face-API aus
Tweet mit der Twitter-API in Python
Versuchen Sie es mit Geopandas
Versuchen Sie es mit Selen
Versuchen Sie es mit scipy
Versuchen Sie die Clusteranalyse mit K-Mitteln
Erstellen Sie eine Anwendung mit der Spotify-API
Versuchen Sie es mit pandas.DataFrame
Versuchen Sie es mit Django-Swiftbrowser
Versuchen Sie es mit matplotlib
Versuchen Sie es mit tf.metrics
Spielen Sie mit Dajare mithilfe der COTOHA-API
Versuchen Sie es mit PyODE
Versuchen Sie, die Spotify-API in Django zu aktivieren.
Zeichnen Sie benutzerdefinierte Ereignisse mit der Shotgun-API auf
Ich habe versucht, die BigQuery-Speicher-API zu verwenden
Ich habe in der Bibliothek nach der Verwendung der Gracenote-API gesucht
Rufen Sie die Web-API mit Anfragen auf. Beispiel: Flickr
Python: Versuchen Sie, die Benutzeroberfläche von Pythonista 3 auf dem iPad zu verwenden
Versuchen Sie es mit Jieba, einer chinesischen morphologischen Analyse-Engine
Ich habe versucht, die Google Cloud Vision-API zu verwenden
Versuchen Sie es mit dem Python-Webframework Tornado Part 1
Versuchen Sie es vorerst mit LINE Notify
Versuchen Sie es mit dem Sammlungsmodul (ChainMap) von python3
Versuchen Sie es mit der Kabu Station API von au Kabucom Securities
Versuchen Sie es mit dem Python-Webframework Tornado Part 2
Versuchen Sie, direkt von Python 3 aus auf die YQL-API zuzugreifen
Versuchen Sie, die ChatWork-API und die Qiita-API in Python zu verwenden
Versuchen Sie es mit virtualenv (virtualenvwrapper)
[Azure] Versuchen Sie, Azure-Funktionen zu verwenden
Versuchen Sie es jetzt mit virtualenv
Versuchen Sie es mit W & B.
Versuchen Sie es mit Django templates.html
[Kaggle] Versuchen Sie es mit LGBM
Versuchen Sie es mit dem Feed-Parser von Python.
Versuchen Sie es mit Pythons Tkinter
Probieren Sie die C ++ - API von NNabla aus
Versuchen Sie es mit Tweepy [Python2.7]
Versuchen Sie es mit Pytorchs collate_fn
Versuchen Sie, mit der Twitter-API v2 ein soziales Diagramm zu zeichnen
Grundeinstellungen bei Verwendung der foursquare-API mit Python