Show HN : comment l’ordinateur a-t-il atteint mon serveur ?
(how-did-i-get-here.net)- Lorsqu’un visiteur ouvre le site web, le serveur exécute un traceroute vers son adresse IP publique et affiche, comme un texte en temps réel, le trajet des paquets à travers les routeurs et les réseaux
- L’outil maison ktr augmente progressivement la valeur TTL des paquets ICMP, collecte les réponses d’erreur à chaque saut et interroge en parallèle les informations réseau de chaque saut
- Le rafraîchissement de l’écran n’est pas implémenté en JavaScript : il consiste à continuer d’envoyer du HTML et du CSS dans une réponse HTTP ouverte, de sorte que les résultats apparaissent progressivement pendant le chargement de la page
- Le chemin affiché est l’inverse d’un traceroute inverse envoyé par le serveur vers l’adresse IP du visiteur ; en raison des différences de routage entre les deux sens, il peut donc ne pas correspondre exactement au chemin réel
- Les chemins Internet sont formés par le peering BGP entre systèmes autonomes (AS) et par la propagation des tables de routage ; le trafic se déplace en suivant des réseaux interconnectés
Un traceroute personnalisé généré à chaque connexion
- Le texte vert en haut de la page n’est pas un exemple préenregistré, mais un traceroute généré à la volée pour le visiteur pendant le chargement du site
- Le traceroute montre le trajet parcouru par l’ordinateur du visiteur, ou par ses paquets, à travers Internet pour atteindre le serveur qui héberge ce site web
- Un chemin d’exemple commence au routeur du visiteur, traverse le réseau du FAI, passe par plusieurs réseaux, entre dans le réseau interne de Hetzner, puis atteint le serveur
- Le premier routeur peut ne pas répondre au ping ; c’est courant derrière un routeur public ou un VPN
- Des entrées
(no response)peuvent apparaître au milieu, car tous les serveurs ne répondent pas toujours
- Des noms comme
core3.sto.hetzner.comsont le résultat d’une résolution DNS inverse effectuée sur l’IP213.239.252.74issue du traceroute, afin de la convertir en un nom lisible par un humain- Les noms DNS inverses servent surtout à faciliter le débogage, et il arrive souvent qu’ils ne se remappent pas vers l’IP d’origine
ktr et le traceroute basé sur ICMP
- L’implémentation du site utilise le programme de traceroute maison ktr
- Le code source du site est également publié sur GitHub
- ktr diffuse les résultats en temps réel tout en interrogeant simultanément les informations de chaque saut
- Dans le routage Internet, l’ordinateur ou le routeur qui traite un paquet choisit le prochain équipement de transmission, et ce processus se poursuit jusqu’à atteindre un routeur capable de l’envoyer directement à destination
- L’implémentation de ktr utilise ICMP
- ICMP est un protocole conçu pour envoyer des informations de diagnostic sur Internet
- Presque tous les appareils connectés à Internet prennent en charge ICMP
- Le champ TTL (time to live) d’un paquet ICMP n’est pas une durée réelle, mais une valeur de compte à rebours
- Chaque fois qu’un routeur transmet un paquet ICMP, il doit réduire le TTL de 1
- Quand le TTL atteint 0, le routeur cesse de transmettre le paquet et envoie à l’adresse IP d’origine un message d’erreur indiquant que le nombre maximal de sauts a été atteint
- traceroute envoie des paquets ICMP avec des TTL progressivement augmentés, comme 1, 2, 3, afin de collecter les réponses d’erreur renvoyées par chaque saut
- Les paquets d’erreur contiennent des informations de diagnostic, comme l’adresse IP de l’appareil qui a envoyé l’erreur
- Cela permet de retracer le chemin approximatif des paquets à travers Internet
Un affichage qui semble temps réel, sans JavaScript
- La page fonctionne même avec JavaScript désactivé
- Du point de vue du navigateur, le site semble simplement se charger lentement
- Pour l’utilisateur, le traceroute semble apparaître en temps réel
- À la connexion, le serveur reçoit la requête HTTP provenant de l’adresse IP du visiteur et lance immédiatement un traceroute vers cette IP
- Le serveur envoie d’abord le début de la réponse HTTP, puis garde la connexion ouverte
- ktr transmet les mises à jour du traceroute au serveur
- Le serveur rend le HTML correspondant et l’envoie à l’ordinateur du visiteur
- Une fois le traceroute terminé, il envoie le reste du texte et du contenu du site web, puis ferme la connexion
- Si les lignes du traceroute semblent se mettre à jour progressivement depuis le haut plutôt que depuis le bas, c’est grâce à une insertion de blocs CSS
- Une page web ne peut, par défaut, se charger que vers l’avant
- À chaque mise à jour de l’affichage du traceroute, le serveur insère aussi du CSS qui masque l’affichage précédent
- Comme le navigateur rend le CSS pendant le chargement, l’écran donne l’impression d’être modifié au fil du temps
Les limites du traceroute inverse
- Le chemin affiché par la page n’est pas exactement « le chemin par lequel les paquets du visiteur ont atteint le serveur »
- Pour calculer le chemin réel, il faudrait pouvoir exécuter un traceroute depuis l’ordinateur du visiteur vers le serveur
- L’implémentation exécute un traceroute depuis le serveur vers l’ordinateur du visiteur, puis affiche le résultat à l’envers
- C’est pourquoi le traceroute en haut de page semble se charger en ordre inverse
- Le traceroute inverse sacrifie une partie de la précision
- Lorsque les paquets circulent dans la direction opposée, chaque appareil peut prendre des décisions de routage différentes
- Il suffit qu’un seul appareil prenne une autre décision pour que le reste du chemin change
- Le chemin reste toutefois globalement similaire ; les différences se situent probablement surtout au niveau du routeur précis qui voit passer le paquet
Systèmes autonomes et requêtes WHOIS
- Les « réseaux » qui apparaissent dans le traceroute désignent des systèmes autonomes (AS)
- Un AS est un ensemble de routeurs et de serveurs interconnectés de manière privée
- Il appartient généralement à la même entreprise
- Le propriétaire d’un AS choisit à quels autres AS se connecter, ce qui détermine la forme d’Internet
- Le trafic Internet circule à travers des AS qui ont conclu entre eux des accords de peering
- Internet ressemble à un réseau ouvert, mais c’est en réalité un réseau de réseaux appartenant à des entreprises, où l’accès et le contrôle dépendent de transactions financières et de procédures bureaucratiques
- Si vous voulez votre propre système autonome, vous pouvez demander un ASN à l’un des cinq registres Internet régionaux (RIR)
- Sans le soutien d’une entreprise ou sans points de contact suffisants avec Internet, la demande a peu de chances d’être acceptée
- Les nombres comme
AS4766dans un traceroute sont des ASN
- ktr utilise le protocole WHOIS pour obtenir les informations sur l’AS propriétaire de chaque IP de saut
- Plusieurs organisations suivent quel AS contient quelles adresses IP
- De nombreuses organisations proposent des recherches d’ASN via WHOIS
- PeeringDB est également utilisé pour identifier les informations d’entreprise
- PeeringDB possède des informations sur environ un tiers de l’ensemble des systèmes autonomes
- Les résultats de recherche sont combinés à plusieurs centaines de lignes d’instructions if pour générer les descriptions de traversée des réseaux
- La spécification du protocole WHOIS définit très peu de structure
- Elle précise essentiellement qu’il faut établir une connexion TCP, envoyer ce que l’on souhaite rechercher, puis que le serveur renvoie des informations avant de fermer la connexion
- La structure réelle des réponses WHOIS relève plutôt de conventions créées par les administrateurs de serveurs, et les noms des champs nécessaires peuvent varier, comme
originouoriginas - Le parseur de ktr ressemble moins à un parseur strict qu’à la façon dont une personne lirait un résultat WHOIS pour y trouver l’ASN nécessaire
Comment BGP crée les chemins sur Internet
- Les routeurs situés aux frontières des réseaux décident vers quel réseau envoyer ensuite un paquet, et le même processus se répète jusqu’à atteindre le réseau où se trouve l’appareil de destination
- Ces routeurs de frontière échangent, via le Border Gateway Protocol (BGP), des informations sur les réseaux qu’ils peuvent atteindre
- BGP est le protocole qui façonne la structure d’Internet
- Un utilisateur ordinaire ne peut pas parler directement BGP
- La première version de BGP est décrite dans la RFC 1105, publiée en 1989 par des ingénieurs de Cisco et d’IBM
- Après l’envoi partiel d’un message sur le prototype ARPANET en 1969, plusieurs universités, agences gouvernementales et entreprises ont commencé à créer leurs propres réseaux et à les interconnecter
- BGP v2 est sorti en 1990
- En 1994, BGP v4 a été spécifié dans la RFC 1654
- BGP v4 a fait l’objet de révisions et de correctifs en 1995 et 2006, et reste utilisé pour choisir les chemins entre réseaux interconnectés dans l’Internet moderne
Chemins BGP, peering et tables de routage
- Un border gateway, routeur situé à la frontière d’un système autonome, maintient une table de routage : la liste de tous les chemins BGP qu’il connaît
- Chaque chemin BGP spécifie un chemin d’ASN pouvant être suivi pour atteindre l’AS qui contrôle un ensemble donné d’adresses IP
- Les chemins BGP se forment au moyen des relations de peering entre AS
- Lorsque les border gateways de deux AS deviennent peers, du trafic peut circuler entre les deux routeurs
- Ils partagent et tiennent à jour les informations de chemins BGP qu’ils connaissent mutuellement
- Par exemple, si le Router A d’AS0001 et le Router B d’AS0002 sont physiquement connectés et veulent établir un peering, ils échangent des messages BGP pour établir une session BGP
- Router A apprend que les chemins BGP commençant par AS0002 doivent passer par Router B
- Router B apprend aussi les informations dans le sens opposé
- Les peers partagent les chemins qu’ils connaissent via le processus d’annonce de routes (route advertisement)
- Si Router A annonce à Router B tous les chemins qu’il connaît, Router B ajoute à sa table de routage les chemins commençant par AS0001
- Si un autre peer de Router A annonce un nouveau chemin, Router A le transmet aussi à Router B
- À mesure que ces annonces se propagent dans l’ensemble du réseau d’AS, chaque border gateway finit par connaître un ou plusieurs AS path permettant d’atteindre une IP donnée sur Internet
- Lorsqu’un routeur doit envoyer un paquet vers une IP donnée, il cherche dans sa table de routage le chemin vers l’AS qui contrôle cette IP
- Il sélectionne ensuite le « meilleur » chemin au moyen de plusieurs heuristiques
- Ces heuristiques incluent la recherche du chemin le plus court et des préférences ou répulsions codées en dur pour certains AS
- Le routeur envoie le paquet au gateway router appairé avec le premier AS du chemin choisi
Lire un résultat de traceroute du point de vue de BGP
- L’AS path du traceroute d’exemple est AS4766 → AS201011 → AS24940
- À un moment donné, le paquet a atteint l’un des routeurs d’AS4766, qui était appairé avec un routeur d’AS201011
- Le routeur a déterminé, à partir de sa table de routage, que l’IP de destination était atteignable via un chemin commençant par AS201011
- Il a ensuite envoyé le paquet au routeur AS201011 connecté
- Plusieurs sauts peuvent apparaître au sein d’un même ASN
- Comme les six sauts à travers Hetzner Online, traceroute montre non seulement les routeurs de frontière entre AS, mais tous les routeurs traversés par le paquet
- Les routeurs internes à un AS peuvent privilégier un chemin interne plutôt qu’un chemin BGP externe s’ils connaissent un itinéraire interne efficace
- Les chemins internes peuvent être appris via BGP interne, via d’autres protocoles de routage internes ou par codage en dur
- Le facteur clé qui détermine la joignabilité sur Internet n’est pas le nombre de sauts internes, mais les accords de peering entre différents AS
1 commentaires
Avis de Hacker News
Bonjour, je suis Lexi. J’ai 17 ans, et en ce moment ce qui m’intéresse, c’est de mieux comprendre comment fonctionnent les ordinateurs et de le montrer d’une façon nouvelle.
Il y a quelques mois, j’ai publié https://cpu.land, avec la discussion associée ici : https://news.ycombinator.com/item?id=37062422
Après cpu.land, je me sentais très poussée à produire un autre gros résultat, mais je n’avais pas vraiment d’idée qui me motivait. J’ai donc bricolé divers projets personnels, puis, en apprenant par hasard comment Internet fonctionne, j’ai fini par créer de zéro un programme traceroute diffusé en temps réel sur un site web.
Je n’avais jamais vu ce genre de chose sur le web, et comme je trouvais que c’était une manière assez nouvelle et sympa de visualiser la structure d’Internet, je l’ai peaufinée et transformée en joli site.
En chemin, j’ai appris beaucoup de choses intéressantes sur BGP et la structure d’Internet, donc j’ai combiné l’outil traceroute avec un article qui partage ces connaissances.
Je continue encore à y travailler, et le code va forcément casser quelque part, donc si vous avez des suggestions, je serais ravie de les entendre.
Au passage, pourquoi Rust ? Je ne pense pas que le choix du langage de programmation soit extrêmement important, mais je voulais écrire rapidement un programme bas niveau fiable, et j’aime les primitives de gestion d’erreurs de Rust.
L’un des premiers programmes CGI que j’ai créés il y a près de 30 ans était un script Perl qui enveloppait traceroute et diffusait les résultats en server push.
Les vieilles choses redeviennent nouvelles, mais la présentation du site est tout de même très réussie.
Au passage, le TTL IPv4 est légalement exprimé en secondes, mais aucun routeur ne consomme plus d’une seconde, et comme la décrémentation minimale est de 1, il est de fait utilisé comme un nombre de sauts. Les middleboxes qui veulent rester cachées peuvent même ne pas le décrémenter du tout.
Autre point : sous Linux/Unix, traceroute utilise par défaut pour ses paquets de sondage de l’UDP vers des ports élevés généralement fermés, plutôt que de l’ICMP, parce qu’historiquement l’UDP avait moins de chances d’être supprimé ou filtré que l’ICMP.
Demander comment fonctionne traceroute fait partie de mes questions d’entretien, mais la plupart des gens ne le savent pas, et s’ils le savent déjà, la question perd de sa valeur. Même quand on pose beaucoup de questions sur TCP/IP, beaucoup n’arrivent pas à raisonner à partir des premiers principes ; voir s’ils peuvent tout de même le déduire me semble une question raisonnable de résolution de problème.
Exemple : https://www.bgplookingglass.com/
https://www.oreilly.com/openbook/cgi/ch06_06.html
Je me demande si utiliser TCP ou UDP au lieu d’ICMP permettrait d’obtenir des résultats plus précis. Le traceroute traditionnel a aussi une option UDP, mtr [1] peut utiliser TCP ou UDP, et tcptraceroute [2] peut utiliser TCP.
Et il y a une citation de Talking Heads qui irait parfaitement : « And you may ask yourself, well, how did I get here? » [3]
[1] https://github.com/traviscross/mtr
[2] https://linux.die.net/man/1/tcptraceroute
[3] https://en.wikipedia.org/wiki/Once_in_a_Lifetime_(Talking_He...
Maintenant, il ne me reste plus qu’à comprendre comment faire fonctionner traceroute à chaque saut depuis un poste donné jusqu’à la table de routage VPC d’une instance EC2, en passant par le switch d’accès Cisco de l’entreprise, le switch cœur, puis le tunnel BGP vers l’AWS Transit Gateway, et on pourra m’appeler responsable réseau.
Malheureusement, trop de nœuds ignorent les paquets traceroute, donc ça donnait seulement l’impression que mon nœud de sortie se connectait à Linode, et que Linode se connectait à ton ordinateur.
Sur un traceroute dans le sens direct, c’est similaire : le routeur répond, le serveur répond, et avec un peu de chance on voit peut-être un nœud du réseau du FAI. Le reste est bien verrouillé.
Il est dit que « BGP est le protocole qui donne sa forme à Internet, et qu’on ne peut pas lui parler directement », mais en réalité, il est étonnamment facile pour un particulier d’obtenir un ASN et de parler BGP.
Si créer ce genre d’outil vous intéresse, ça vaut le coup d’essayer. Si ça vous tente, j’ai aussi un guide d’introduction que j’avais écrit : https://qt.ax/asn
Ce n’est pas tant « comment mon ordinateur atteint ton serveur » que l’inverse de la façon dont ton serveur atteint mon ordinateur. Le routage dans les deux sens a de fortes chances d’être assez différent.
En résumé, d’après mon expérience, les réseaux traversés sont généralement très similaires, et dans les deux sens le contenu est pertinent et intéressant.
Il existe un article intéressant sur le fonctionnement de traceroute. Un point que les personnes qui ne viennent pas du réseau oublient souvent, c’est que traceroute n’est pas forcément symétrique. Le chemin de retour peut être différent
https://archive.nanog.org/sites/default/files/traceroute-201...
C’est sans doute deux fois plus d’ECMP que ce que j’avais vu jusqu’ici sur Internet
Et le trafic entre notre bureau du Caire et le cœur de réseau au Royaume-Uni, ainsi que le trafic dans l’autre sens, empruntent eux aussi des chemins différents. London→Cairo est direct et subit encore de fortes pertes, mais Cairo→London passe maintenant par ntt et semble correct. Si ce n’est pas réparé d’ici demain, il faudra peut-être modifier la préférence locale
Il disait que « WHOIS est un protocole intéressant pour écrire un parseur », mais en réalité c’est presque impossible
Les réponses sont fondamentalement en format libre, et le serveur peut tout simplement ne pas répondre. J’ai essayé aussi : il y a 10 ans, j’avais pu bricoler un parseur ad hoc qui fonctionnait pour 90 % des adresses ou domaines, mais le reste était ingérable
Aujourd’hui, c’est encore pire, et presque tout est caché derrière des protections de confidentialité. On prétend protéger les PII, mais les enregistrements WHOIS n’étaient pas censés contenir des informations personnelles : ils étaient censés contenir les contacts des opérateurs réseau
Pour moi, c’est la faute de l’ICANN. L’ICANN avait une règle obligeant les réseaux à fournir un serveur WHOIS public, mais ne l’a pas appliquée, et a maintenant abandonné cette règle
Cela dit, tout le monde n’exploite pas un serveur RDAP. Ce serait bien que l’ICANN/IANA, ou quelqu’un, l’impose
Les informations sur les opérateurs réseau peuvent aussi être de la PII. Mes informations sont des PII, et puisque j’ai un nom de domaine, mettre mes informations dans WHOIS revient à mettre de la PII dans WHOIS
Les services de protection de la confidentialité ne font que tout me transmettre, sauf le spam
Pour une entreprise, je ne vois pas de bonne raison d’autoriser un service de confidentialité, mais tous les domaines n’appartiennent pas encore à de grandes entreprises
Au lieu d’une trace ICMP ECHO séparée, on peut aller plus loin en exploitant la connexion HTTP TCP existante entre le navigateur client et le serveur web
Cela permettrait de traverser le NAT ou le pare-feu à états côté client
Il existe des travaux antérieurs sur le reverse traceroute
https://research.cs.washington.edu/networking/astronomy/reve...
Article : http://www.cs.washington.edu/homes/ethan/papers/reverse_trac...
Vidéo : http://www.usenix.org/multimedia/nsdi10katz-bassett
Il faut aussi savoir que les paquets d’une session TCP empruntent souvent des chemins asymétriques sur Internet. D’après mon expérience, les raisons les plus courantes étaient des règles métier liées aux coûts, et des erreurs humaines
Quand on réfléchit au fonctionnement de l’IP, ce n’est pas vraiment un problème en soi, mais cela peut rendre le routage plus difficile à comprendre
Boise State University et University of Idaho se trouvent aux deux extrémités de l’État de l’Idaho. UIdaho, au nord, est proche de Spokane et la plupart de ses connexions viennent de Seattle, tandis que Boise est plus proche de Salt Lake et se connecte souvent via Portland ou Salt Lake City
Le centre de l’État entre les deux universités est montagneux et disposait de très peu de grandes liaisons, mais UofIdaho avait autrefois des salles de cours à distance dans le sud, donc il existait une petite ligne
À un moment à la fin des années 90, un ingénieur réseau de BSU et un ingénieur de UofI ont découvert qu’ils avaient des switches et des équipements de routage dans le même bâtiment, et ont tiré un câble Ethernet entre les deux
Le résultat a été catastrophique. Les deux réseaux ont commencé à s’annoncer mutuellement en BGP, et cette liaison a été propagée à tout Internet. Soudain, un saut très court est apparu entre les réseaux côté Seattle et côté Salt Lake City, et la pauvre petite ligne T1 a été totalement saturée
Fait intéressant, cela ne se produisait que dans un sens. Boise annonçait la route, mais Idaho ne le faisait pas, si bien que le trafic était en pratique cassé dans un seul sens
Évidemment, le câble a été débranché, et quelques années plus tard, quand je travaillais à UofIdaho, tout le monde savait qu’il ne fallait absolument jamais reconnecter ces deux réseaux. Ironiquement, à l’époque, je pilotais un programme de déploiement d’I2 dans les deux universités
Sur mon appareil, je ne vois aucune étape intermédiaire entre mon appareil et le serveur. Pour info
Je suis dessus en ce moment même, et j’espère que ça fonctionnera mieux bientôt. En attendant, j’ai augmenté les timeouts : le chargement sera plus long, mais ça devrait mieux marcher
mtr mérite aussi d’être mentionné. Je l’utilise bien plus souvent que traceroute
Il aide à diagnostiquer les pertes de paquets intermittentes et permet d’avoir une vue moyenne du flux
Cet article de l’APNIC explique plus en détail mtr et la manière de lire ses résultats, et aborde aussi la façon dont MPLS peut masquer le chemin réel
https://blog.apnic.net/2022/03/28/how-to-properly-interpret-...
Tracer en UDP est aussi parfois utile, et il faut garder à l’esprit que beaucoup de routeurs suppriment sélectivement l’ICMP lorsqu’ils sont sous charge
Bon article, et très bien formulé