Je suis Charlie

Autres trucs

Accueil

Seulement les RFC

Seulement les fiches de lecture

Mon livre « Cyberstructure »

Ève

Outils pour obtenir des informations BGP publiques

Première rédaction de cet article le 4 septembre 2020
Dernière mise à jour le 19 mai 2022


Cette page (que j'espère maintenir à jour) rassemble les outils existants pour obtenir de l'information sur les annonces BGP, même si on n'a pas d'accès à des routeurs BGP.

Le protocole de routage BGP est sans doute le système le plus crucial pour le bon fonctionnement de l'Internet. Contrairement à des protocoles applicatifs comme HTTP, il n'est pas prévu que tout le monde puisse parler BGP : seule une partie des routeurs le fait et, sauf si vous travaillez chez un acteur important de l'Internet, vous n'avez probablement pas accès à un routeur BGP, encore moins un routeur de la DFZ. D'où l'intérêt de divers outils et services qui permettent d'obtenir des informations BGP sans avoir cet accès privilégié.

D'ailleurs, même si vous avez accès à un ou plusieurs routeurs BGP, cela n'est pas forcément suffisant. Vu la façon dont fonctionne BGP, tous les routeurs ne voient pas la même chose (même les routeurs de la DFZ) et de tels outils sont donc utiles même pour les professionnels du réseau. Attention, certains de ces outils sont simples à utiliser, d'autres plus complexes mais dans tous les cas, comprendre ce qu'ils affichent nécessitent des compétences dans le fonctionnement de l'Internet, et dans le protocole BGP.

Cet article regroupe les outils que j'utilise. Vous pouvez m'en suggérer d'autres (ou bien corriger des erreurs) mais cette liste est forcément incomplète et subjective. Alors, commençons tout de suite par le principal outil dont je me sers, RIPEstat. RIPEstat est une interface Web notamment vers les données récoltées par le RIS (Routing Information Service), un ensemble de centaines de machines parlant BGP et qui s'appairent avec tout le monde pour récolter le plus d'informations BGP possibles. En échange d'une adresse IP, d'un préfixe ou d'un AS, vous pouvez obtenir plein d'informations. On va se concentrer sur celles liées au routage. Prenons par exemple le préfixe 2a01:e30::/28, utilisé pour les clients de Free. (Si vous ne connaissez pas le préfixe, entrez l'adresse IP, RIPEstat trouvera le préfixe englobant le plus spécifique.) Voici ce qu'affiche l'onglet « Routage » de RIPEstat, en https://stat.ripe.net/2a01%3Ae34%3A%3A%2F28#tabId=routing : ripe-stat-free-routing.png

(Une minorité de routeurs du RIS voit ce préfixe ; il n'est sans doute pas annoncé à tout le monde, et il existe un /26 plus générique. Rappelez-vous ce que j'ai dit que tout les routeurs BGP ne voient pas la même chose.) Ce Routing status n'est qu'un des widgets disponible, plus bas dans la page vous trouverez de nombreuses autres informations. J'aime bien le widget historique qui permet de voir comment a été annoncé ce préfixe dans le passé : ripe-stat-free-history.png

Et aussi le rythme des mises à jour, souvent indicatifs d'un problème. Ici, par exemple, le widget BGP update activity montre la panne de Level 3/CenturyLink du 30 août 2020. On a donné comme ressource à voir l'AS 3356 (celui de Level 3) et zoomé pour n'avoir que la partie intéressante. On voit alors le gros surcroit d'activité BGP engendré par le problème chez Level 3. C'est toujours visitable aujourd'hui, grâce aux URL intégrant la date : https://stat.ripe.net/widget/bgp-update-activity#w.starttime=2020-08-19T09%3A00%3A00&w.endtime=2020-09-02T09%3A00%3A00&w.resource=AS3356. ripe-stat-level3.png

Du fait qu'il existe un URL stable pour les informations de RIPEstat, on peut facilement embarquer du RIPEstat dans ses pages Web, ses outils de supervision, etc.

RIPEstat est très gourmand en ressources, vu son utilisation massive de plein de JavaScript. Vous avez intérêt à avoir une machine riche en RAM et, même ainsi, vous verrez souvent l'avertissement (ici de Firefox) comme quoi un script ralentit la machine : ripe-stat-slow.png

Le RIS, le réseau derrière RIPE stat peut aussi être interrogé en ligne de commande. C'est ce RIS qui alimente mon service bgp.bortzmeyer.org :

% curl -s https://bgp.bortzmeyer.org/2a03:2880:f0fc:c:face:b00c:0:35
2a03:2880:f0fc::/48 32934
  

Cette petite fonction shell peut vous faciliter la vie :

bgprouteris () {
	if [ -z "$1" ]
	then
		echo "Usage: bgprouteris IP-address"
		return 1
	fi
	curl -s https://bgp.bortzmeyer.org/$1
	echo ""
}
  

Il est de toute façon bon de ne pas dépendre d'un seul service, même géré par une organisation sans but lucratif et fondée sur un projet commun comme l'est le RIPE-NCC. Tout service peut disparaitre ou tomber en panne précisement au moment où on en a besoin (si on veut investiguer un problème en cours, par exemple). Une alternative intéressante est bgp.tools. C'est plus léger que RIPEstat (mais moins riche) et cela se concentre sur des informations essentielles, donc cela peut être pratique pour des utilisateurs moins familiers de BGP. (Je ne trouve pas sur quelles données ils s'appuient pour afficher leurs informations : rappelez-vous que les informations BGP ne sont pas les mêmes partout, d'où l'importance d'avoir un grand nombre de routeurs situés un peu partout, comme le RIS. Je ne connais pas la représentativité des collecteurs d'informations de bgp.tools.)

Voici par exemple ce que voit bgp.tools sur le préfixe 2a01:e30::/28 cité plus haut (URL https://bgp.tools/prefix/2a01:e30::/28) : bgptools-prefix-specific.png

Et sur l'AS associé : bgptools-as.png

Vous avez noté que dans les informations sur le préfixe, la rubrique Upstreams (transitaires) était vide. bgp.tools ne l'affiche pas lorsqu'il y a un préfixe plus général et visible plus globalement, ce qui est le cas ici (rappelez-vous que le 2a01:e30::/28 n'est pas annoncé partout). Avec le préfixe général, on a bien l'information : bgptools-prefix-generic.png

En prime, bgp.tools nous prévient que Free n'a qu'un seul transitaire en IPv6, Cogent et que celui-ci refuse de s'appairer avec Hurricane Electric, ce qui prive les abonnés Free d'une partie de l'Internet.

Dans la série « sites Web pour récupérer des informations BGP », beaucoup de gens utilisent https://bgp.he.net/ qui donne, par exemple : he-bgp-free.png

Pour les amateurs de ligne de commande, il y a aussi bgpstuff.net :

% curl -s https://bgpstuff.net/route/185.89.219.12
Route is 185.89.219.0/24 for 185.89.219.12
  

Et si on veut le numéro d'AS, pas juste les préfixes :

% curl https://bgpstuff.net/origin/185.89.219.12
The origin AS for 185.89.219.12 is AS32934
  

Jusqu'ici, je n'ai listé que des outils Web (ou en tout cas HTTP). Et si on n'aime pas le Web ? Les mêmes informations sont souvent disponibles par d'autres protocoles, par exemple whois. (RIPEstat a également une API, que je n'utilise personnellement pas.) Le RIS est ainsi interrogeable par whois :

% whois -h riswhois.ripe.net 2a01:e30::/28
...
route6:       2a01:e30::/28
origin:       AS12322
descr:        PROXAD Free SAS, FR
lastupd-frst: 2020-04-13 01:00Z  2001:7f8:20:101::208:223@rrc13
lastupd-last: 2020-09-02 07:37Z  2001:7f8:20:101::209:93@rrc13
seen-at:      rrc00,rrc01,rrc03,rrc04,rrc05,rrc07,rrc10,rrc11,rrc12,rrc13,rrc15,rrc20,rrc21,rrc23
num-rispeers: 156
source:       RISWHOIS

Il y a évidemment moins d'information que par le Web mais cela peut suffire. Si on veut juste une correspondance entre une adresse IP et l'AS qui l'annonce, Team Cymru propose plusieurs outils comme whois :

% whois -h whois.cymru.com 80.67.169.12
AS      | IP               | AS Name
20766   | 80.67.169.12     | GITOYEN-MAIN-AS The main Autonomous System of Gitoyen (Paris, France)., FR

Autre serveur whois, chez bgp.tools :

% whois -h bgp.tools 2a00:e00:0:5::2
AS      | IP                                       | BGP Prefix          | CC | Registry | Allocated  | AS Name
8304    | 2a00:e00:0:5::2                          | 2a00:e00::/32       | FR | RIPE     | 2008-11-07 | Ecritel SASU

Team Cymru a aussi une passerelle DNS. Celle-ci nécessite d'inverser les différents composants de l'adresse IP. Par exemple, pour 204.62.14.153, il faudra interroger 153.14.62.204.origin.asn.cymru.com. Ça peut s'automatiser avec awk :

% dig +short  TXT $(echo 204.62.14.153 | awk -F. '{print $4 "." $3 "." $2 "." $1 ".origin.asn.cymru.com" }')
"46636 | 204.62.12.0/22 | US | arin | 2008-12-24"
   

Pour IPv6, cette inversion peut se faire avec le programme ipv6calc. On peut créer une fonction shell pour se faciliter la vie :

% which bgproutednscymru
bgproutednscymru () {
	address=$1
	if echo $address | fgrep -q : -; then
	    domain=$(echo $1 | ipv6calc --addr2ip6_arpa | sed 's/ip6\.arpa\.$/origin6.asn.cymru.com./') 
	else
	    domain=$(echo $1 | awk -F. '{print $4 "." $3 "." $2 "." $1 ".origin.asn.cymru.com" }')
	fi
	dig +short TXT $domain
}

% bgproutednscymru 80.67.169.12
"20766 | 80.67.160.0/19 | FR | ripencc | 2001-05-21"

% bgproutednscymru 2001:910:800::12
"20766 | 2001:910::/32 | FR | ripencc | 2002-09-24"

Le service RouteViews a également une passerelle DNS, mais uniquement pour IPv4, avec le domaine aspath.routeviews.org. Elle indique le chemin d'AS (vers le collecteur de RouteViews), pas uniquement l'origine. Avec une fonction analogue à celle ci-dessus, on obtient :

% which bgproutednsrouteviews
...
	dig +short TXT `echo $1 | awk -F. '{print $4 "." $3 "." $2 "." $1 ".aspath.routeviews.org" }'` | \
              awk -F\" '{print "AS path: " $2 "\nRoute: " $4 "/" $6}'
}

% bgproutednsrouteviews 80.67.169.12
AS path: 53767 3257 1299 20766
Route: 80.67.160.0/19
   

Un exemple de son utilisation figure dans mon article sur un opérateur nord-coréen.

Plus original, il existe un bot sur le fédivers (documenté ici) pour récupérer l'AS d'origine d'une adresse IP : fediverse-bgp-free.png.

J'ai parlé d'API à propos de RIPEstat. Personnellement, j'utilise l'API de QRator. Il faut s'enregistrer sur le site (la plupart des services présentés ici ne nécessitent pas d'enregistrement) pour obtenir une clé d'API puis lire la documentation (l'API produit évidemment du JSON). J'ai fait une fonction shell pour me faciliter la vie :

bgpqrator () {
    if [ -z "$1" ]; then
	echo "Usage: bgpqrator IP-address"
	return 1
    fi
    curl -s -X GET "https://api.radar.qrator.net/v1/lookup/ip?query=$1" \
	 -H  "accept: application/json" -H "QRADAR-API-KEY: $(cat ~/.qrator)" | \
	jq .
}
  

Et cela me permet de faire :

% bgpqrator 2a01:e30::/28
{
  "meta": {
    "status": "success",
    "code": 200
  },
  "data": [
    {
      "id": "12322",
      "name": "PROXAD",
      "short_descr": "Free SAS",
      "prefix": "2a01:e00::/26",
      "as_num": "12322",
      "found_ips": "{2a01:e30::/28}"
    },
    {
      "id": "12322",
      "name": "PROXAD",
      "short_descr": "Free SAS",
      "prefix": "2a01:e30::/28",
      "as_num": "12322",
      "found_ips": "{2a01:e30::/28}"
    }
  ]
}
  

Un point important de BGP aujourd'hui est la possibilité de signer les informations pour améliorer la sécurité, avec l'infrastructure nommée RPKI. Pour vérifier ces signatures, on peut installer son propre validateur comme Routinator (après tout, toutes les données de la RPKI sont publiques) mais c'est un peu compliqué à faire et surtout à maintenir, donc il peut être plus intéressant d'utiliser des services en ligne. Par exemple, https://bgp.he.net fait cette vérification et vous affiche le résultat (cf. la copie d'écran plus haut). De même, RIPEstat affiche la validité d'une annonce comparée aux IRR et aux ROA : ripe-stat-rpki.png

Autre excellent outil de vérification de la cohérence entre ce qui est annoncé et les bases de données (IRR) et la RPKI, IRRexplorer (c'est un logiciel libre, vous pouvez aussi l'installer chez vous).

Notez que je ne connais pas encore de moyen simple de récupérer les ROA sur un site Web. Les services ci-dessus indiquent juste le résultat de la validation, pas le ROA d'origine. La seule méthode pour l'instant semble être de récupérer tout le contenu de la RPKI connu d'un point de publication (pour le RIPE-NCC, c'est avec rsync en rsync://rpki.ripe.net/repository) puis de le lire avec des outils comme OpenSSL (pour un certificat, openssl x509 -inform DER -text -in NOMDUFICHIER.cer).

Jusqu'à présent, on a vu des techniques qui indiquaient une vue « globale », supposant qu'on avait à peu près le même résultat sur tous les routeurs BGP. En pratique, on sait que ce n'est pas vrai, les différents routeurs ne voient pas exactement la même chose, et il est souvent utile de regarder ce que voit un routeur particulier. C'est le rôle des Looking Glasses. Il en existe beaucoup, mais pas toujours là où on voudrait. (Pour un problème récent, je cherchais un looking glass chez Algérie Télécom, sans en trouver.) Bref, il faut utiliser les annuaires comme http://www.traceroute.org/#Looking%20Glass et ils ne sont évidemment jamais à jour, on a des mauvaises surprises. C'est un cas où il faut parfois compter sur les moteurs de recherche.

Aux joies du Web moderne avec tous ses gadgets et son interactivité graphique, et même aux outils plus techniques qu'on vient de voir, on peut souhaiter préférer l'analyse qu'on fait soi-même à partir de données brutes. On télécharge des fichiers rassemblant les données BGP (soit l'état de la RIB du routeur, soit les annonces BGP) et on les analyse avec le programme de son choix. Un format standard existe même pour ces fichiers, MRT, normalisé dans le RFC 6396. Un exemple d'utilisation de ces fichiers figure dans mon article sur une panne à Saint-Pierre-et-Miquelon.

Où peut-on trouver de tels fichiers ? RouteViews en fournit, une archive qui remonte à 2001… Chose amusante, la seule taille de ces fichiers peut indiquer un problème car les perturbations de l'Internet se traduisent en général par une augmentation importante des mises à jour BGP. Ainsi, la panne de Level 3/CenturyLink du 30 août 2020 se voit très bien (à partir de 10:00 h UTC) : routeviews-level3.png

On peut aussi avoir de telles données via le RIS, cf. la documentation. C'est sur ces fichiers issus du RIS que s'appuie le bot fédivers cité plus haut.

Version PDF de cette page (mais vous pouvez aussi imprimer depuis votre navigateur, il y a une feuille de style prévue pour cela)

Source XML de cette page (cette page est distribuée sous les termes de la licence GFDL)