Les améliorations de WireGuard chez Fly.io
- Fly.io convertit des conteneurs en VM et les exécute sur du matériel dans le monde entier en s'appuyant sur la puissance de Firecracker.
- WireGuard est largement utilisé et fait désormais partie de l'API client.
- À chaque exécution du CLI
flyctl, une pile TCP/IP est créée et communique directement avec les Fly Machines en utilisant une adresse IPv6 unique.
- Cette approche présente des avantages et des inconvénients, et quelques améliorations ont été apportées.
Situation précédente
- Des serveurs « gateway » répartis dans le monde entier acceptaient les connexions WireGuard et se chargeaient de les relier au bon réseau privé.
- À chaque exécution de
flyctl, un processus agent en arrière-plan était créé ou réutilisé.
- L'agent créait une nouvelle configuration de pair WireGuard via l'API GraphQL.
- L'API transmettait la configuration du pair à la gateway appropriée via le système de messagerie NATS.
- Sur la gateway, le service
wggwd recevait la configuration, l'enregistrait dans une base SQLite, puis l'ajoutait au noyau.
- L'API répondait à la requête GraphQL en renvoyant la configuration, puis
flyctl se connectait au pair WireGuard.
- NATS est rapide, mais ne garantit pas la livraison et ne nettoyait pas les anciens pairs restés sur les gateways.
Une meilleure méthode
- Le stockage des pairs WireGuard ne nécessite pas de base de données complexe.
- Le système a été modifié pour que les gateways récupèrent la configuration depuis l'API chaque fois que nécessaire.
- Il devient possible d'ajouter des pairs au noyau uniquement quand un client veut se connecter, puis de les supprimer lorsqu'ils ne sont plus nécessaires.
Des pairs WireGuard JIT rendus possibles
- L'interface de configuration de WireGuard dans le noyau Linux utilise Netlink.
- Il est possible d'identifier et d'intercepter les paquets de demande de connexion WireGuard avec un filtre BPF et un packet socket.
- WireGuard n'a pas de notion de « client » et de « serveur » ; c'est un protocole point à point.
- Quand
flyctl envoie un paquet UDP à une gateway, il s'agit d'une handshake initiation.
- Un filtre BPF permet de capter les connexions entrantes.
- Comme le système repose sur le framework du protocole Noise, il faut déchiffrer pour identifier la requête.
- En créant un flux d'événements, il est possible d'obtenir les clés publiques de tous les utilisateurs qui tentent de se connecter à une gateway.
- Chaque fois qu'un nouveau pair est détecté, ses informations sont récupérées et installées via une requête vers l'API HTTP interne.
Lancer des apps à la minute près
- Sur Fly.io, il est possible de déployer rapidement des apps et d'obtenir son propre pair WireGuard JIT.
Coup d'œil aux graphiques
- Après plusieurs semaines d'exploitation de ce système, le nombre d'anciens pairs WireGuard restés sur les gateways a nettement diminué.
- Les gateways conservent moins d'état et la configuration des pairs est plus rapide.
- Des graphiques Grafana illustrent les résultats positifs obtenus le jour de la bascule.
L'avis de GN⁺
- Les améliorations de WireGuard chez Fly.io constituent un bon exemple d'optimisation des performances et de la fiabilité réseau.
- Cette approche peut être particulièrement utile pour renforcer la gestion du trafic réseau et la sécurité dans les services basés sur le cloud.
- Parmi les autres projets offrant des fonctionnalités similaires, on peut citer Tailscale et ZeroTier, qui proposent eux aussi des alternatives VPN pour les particuliers et les entreprises.
- Lors de l'adoption de WireGuard, il faut prendre en compte la configuration réseau, les politiques de sécurité et la compatibilité.
- Les avantages de ce choix sont des performances élevées et une configuration simple, mais l'intégration à l'infrastructure existante et la gestion peuvent représenter un défi.
1 commentaires
Commentaires Hacker News