WireGuard-Verbesserungen bei Fly.io
- Fly.io wandelt Container in VMs um und betreibt sie weltweit auf Hardware mit der Leistung von Firecracker.
- Es nutzt WireGuard intensiv, und es ist inzwischen Teil der Kunden-API.
- Bei jedem Ausführen der
flyctl-CLI wird ein TCP/IP-Stack erzeugt, der mit einer eindeutigen IPv6-Adresse direkt mit Fly Machines kommuniziert.
- Dieser Ansatz hat Vor- und Nachteile, und es gibt einige Verbesserungen.
Die bisherige Situation
- Weltweit verteilte „Gateway“-Server akzeptieren WireGuard-Verbindungen und verbinden sie mit dem passenden privaten Netzwerk.
- Bei jedem Ausführen von
flyctl wird ein Hintergrund-Agent-Prozess erzeugt oder verbunden.
- Der Agent erstellt über die GraphQL-API eine neue WireGuard-Peer-Konfiguration.
- Die API überträgt die Peer-Konfiguration über das NATS-Messaging-System an das passende Gateway.
- Auf dem Gateway empfängt der Dienst
wggwd die Konfiguration, speichert sie in einer SQLite-Datenbank und fügt sie dem Kernel hinzu.
- Die API antwortet auf die GraphQL-Anfrage mit der Konfiguration, und
flyctl verbindet sich mit dem WireGuard-Peer.
- NATS ist schnell, garantiert aber keine Zustellung und räumt veraltete Peers auf den Gateways nicht auf.
Ein besserer Weg
- Zum Speichern von WireGuard-Peers ist keine komplexe Datenbank nötig.
- Stattdessen wurden die Gateways so geändert, dass sie die Konfiguration bei Bedarf von der API abrufen.
- Peers können nur dann dem Kernel hinzugefügt werden, wenn ein Client eine Verbindung aufbauen möchte, und entfernt werden, wenn sie nicht mehr benötigt werden.
JIT-WireGuard-Peers ermöglichen
- Die WireGuard-Konfigurationsschnittstelle im Linux-Kernel verwendet Netlink.
- WireGuard-Verbindungsanfragepakete lassen sich mit BPF-Filtern und Packet Sockets identifizieren und abfangen.
- WireGuard kennt keine Konzepte von „Client“ und „Server“, sondern ist ein Punkt-zu-Punkt-Protokoll.
- Wenn
flyctl ein UDP-Paket an ein Gateway sendet, ist das eine handshake initiation.
- Mit einem BPF-Filter lassen sich eingehende Verbindungen abfangen.
- Da WireGuard auf dem Noise Protocol Framework basiert, muss die Verschlüsselung aufgehoben werden, um Anfragen zu identifizieren.
- Es lässt sich ein Event-Feed erzeugen, der die öffentlichen Schlüssel aller Nutzer liefert, die versuchen, sich mit einem Gateway zu verbinden.
- Jedes Mal, wenn ein neuer Peer erkannt wird, werden die zugehörigen Peer-Informationen über eine interne HTTP-API-Anfrage abgerufen und installiert.
Apps minutenschnell starten
- Auf Fly.io lassen sich Apps schnell bereitstellen und dabei eigene JIT-WireGuard-Peers erhalten.
Ein Blick auf die Grafiken
- Das System lief über mehrere Wochen und reduzierte die Zahl veralteter WireGuard-Peers, die auf den Gateways verblieben, deutlich.
- Die Gateways halten dadurch weniger Zustand vor, und die Peer-Konfiguration wird schneller.
- Über Grafana-Diagramme werden die erfolgreichen Ergebnisse des Umschalttags gezeigt.
Meinung von GN⁺
- Die WireGuard-Verbesserungen von Fly.io sind ein gutes Beispiel dafür, wie sich Netzwerkleistung und Stabilität deutlich steigern lassen.
- Dieser Ansatz kann besonders bei Cloud-basierten Diensten helfen, Netzwerkverkehr und Sicherheit zu verbessern.
- Ähnliche Projekte sind Tailscale und ZeroTier, die ebenfalls VPN-Alternativen für private und geschäftliche Nutzer anbieten.
- Bei der Einführung von WireGuard sollten Netzwerkkonfiguration, Sicherheitsrichtlinien und Kompatibilität berücksichtigt werden.
- Die Vorteile dieser Technik liegen in hoher Geschwindigkeit und einfacher Konfiguration, während die Integration in bestehende Infrastruktur und das Management Herausforderungen darstellen können.
1 Kommentare
Hacker-News-Kommentare