2 points par GN⁺ 2023-09-11 | 1 commentaires | Partager sur WhatsApp
  • Explication, dans l’article, de la manière dont Linux effectue la traduction d’adresses réseau (NAT) pour la commande ping, qui utilise le protocole ICMP (Internet Control Message Protocol)
  • L’auteur a exploré le code réseau de Linux pour comprendre comment le NAT fonctionne pour les paquets ICMP, qui ne comportent pas de champ de port
  • Mise en place expérimentale où l’auteur utilise des espaces de noms réseau pour simuler plusieurs appareils sur une seule machine Linux, et emploie la commande ping pour tester le processus de NAT
  • L’expérience consiste à créer deux clients connectés à un bridge, avec une connexion vers une box NAT et un serveur, en incluant le routage et la configuration NAT
  • L’auteur capture les paquets ICMP dans les espaces de noms réseau du client et du serveur, puis analyse les données des paquets
  • L’auteur constate que chaque client possède un champ id différent, ce qui permet à la box NAT de distinguer les paquets de réponse destinés à chaque client
  • L’auteur explore le code source de Linux ainsi que la RFC 792, qui définit le protocole ICMP, afin de comprendre comment l’ID est choisi
  • L’auteur découvre que la commande ping choisit aléatoirement un identifiant et que, si deux processus ping sur des hôtes différents choisissent le même ID, le noyau Linux sélectionne aléatoirement un port libre, lequel est alors utilisé comme ID du paquet ICMP
  • L’auteur suit les fonctions du noyau et utilise un outil appelé bpftrace pour vérifier sa compréhension du code netfilter
  • La conclusion de l’article est que Linux applique le NAT aux pings en créant une connexion pour chaque client, en réécrivant l’adresse IP source et/ou le champ d’ID ICMP dans les paquets sortants, puis en inversant ensuite ces modifications dans les paquets de réponse
  • L’article fournit une explication détaillée, étape par étape, du processus, de manière accessible à des ingénieurs logiciel débutants disposant de connaissances techniques de base

1 commentaires

 
GN⁺ 2023-09-11
Commentaire Hacker News
  • Un article sur la manière dont la traduction d’adresses réseau (NAT) sous Linux traite les requêtes ping
  • Le serveur envoie des paquets fixes de requête ICMP echo à une adresse fixe, sans s’attendre à ce qu’ils reviennent
  • Lorsqu’un client tente de se connecter, il envoie au serveur un paquet ICMP d’expiration du délai contenant le paquet fixe « original » que le serveur envoyait
  • Le client se comporte comme un saut sur Internet et informe le serveur que le paquet d’origine n’a pas pu être livré
  • L’équipement NAT transmet l’expiration de délai ICMP au serveur derrière le NAT, y compris l’en-tête IP complet du client, ce qui permet au serveur de connaître l’adresse IP du client
  • Quand un ping est envoyé depuis le réseau local vers un équipement sur Internet, le routeur qui effectue le NAT réécrit l’adresse source du ping avec l’adresse IP publique et réécrit le champ ID du paquet ICMP avec une valeur unique
  • Le routeur utilise cette valeur d’ID unique pour acheminer la réponse vers le bon équipement sur le réseau local
  • Le billet fournit aussi des ressources sur un outil appelé Netfilter, utilisé pour corrompre des paquets, faire de la traduction d’adresses réseau et du filtrage de paquets
  • L’article est salué pour son analyse en profondeur, jusqu’au code source, à travers toutes les couches d’abstraction
  • Comme ICMP n’a pas de ports, le NAT n’a pas besoin de gérer le problème du renvoi des réponses ICMP echo vers le bon port
  • Les requêtes ICMP echo ont un ID, qui est en pratique équivalent à un numéro de port source
  • Le traitement NAT d’ICMP echo doit donc remapper l’ID dans les deux sens, de manière similaire au remappage du port source en UDP
  • Certains utilisateurs se plaignent du fait de relier des lignes de code précises dans un billet de blog, car elles changent avec le temps
  • Certains utilisateurs critiquent le NAT comme une mauvaise abstraction et appellent à la fin de l’IPv4
  • Des spéculations portent sur la possibilité d’envoyer de courts messages pour du networking pair à pair via UDP en utilisant le ping, sans serveur central
  • En résumé, l’article explique que les paquets ICMP ont un champ ID et que Netfilter traite les paquets ICMP comme un « cas particulier »