Die Firma Cloudflare hat die Version 0.7 des Pingora-Frameworks veröffentlicht, das zur Entwicklung von sicheren, leistungsstarken Netzwerkdiensten in der Programmiersprache Rust dient. Der mit Pingora erstellte Proxy wird seit ĂŒber zwei Jahren im Content Delivery Network von Cloudflare anstelle von nginx eingesetzt und verarbeitet ĂŒber 40 Millionen Anfragen pro Sekunde. Der Code ist in Rust geschrieben und unter der Lizenz Apache 2.0 veröffentlicht.
Hauptfunktionen von Pingora:
- UnterstĂŒtzung von HTTP/1 und HTTP/2 (HTTP/3 ist geplant), sowie die Möglichkeit, Dienste zu erstellen, die eigene Protokolle oder UDP/TCP verwenden.
- UnterstĂŒtzung fĂŒr multithreaded Bearbeitung von Anfragen im asynchronen Modus.
- Möglichkeit, Callback-Handler und Filter anzuhÀngen, die es ermöglichen, verschiedene Phasen der Anfrageverarbeitung zu steuern sowie Anfragen und Antworten zu Àndern, umzuleiten, zu blockieren und zu protokollieren.
- Proxy fĂŒr gRPC und WebSocket.
- Erweiterbare Lastenausgleichsmechanismen.
- Die Möglichkeit, die Konfiguration ohne Neustart zu Àndern.
- UnterstĂŒtzung fĂŒr die Aktualisierung des Anwendungscodes ohne Unterbrechung der Verbindungen.
- Werkzeuge zum Lastenwechsel im Falle eines Ausfalls (Failover).
- Integration mit verschiedenen Ăberwachungs- und Protokollierungssystemen (Syslog, Prometheus, Sentry, OpenTelemetry).
- UnterstĂŒtzung fĂŒr TLS-VerschlĂŒsselung (OpenSSL, BoringSSL oder Rustls werden verwendet).
- Fertige Rust-Pakete zur Erstellung von HTTP-Proxys, zur Arbeit mit Netzwerkprotokollen, zur Analyse von HTTP-Headern, zur Erfassung und Begrenzung des Datenverkehrs, zur Lastenverteilung, zur Arbeit mit einer verteilten Hash-Tabelle Ketama, zur Cache-Verwaltung im RAM und zur asynchronen Bearbeitung von ZeitĂŒberschreitungen.
Zu den Neuerungen in der neuen Version gehören:
- Das SslDigest-Struktur wurde um das Feld âextensionâ erweitert, und fĂŒr den Typ TlsAccept wurde ein Handler namens handshake_complete_callback implementiert, der es ermöglicht, an die TLS-Verbindung anwendungsspezifische Daten anzuhĂ€ngen. Als Beispiel wird gezeigt, wie diese Möglichkeit genutzt werden kann, um ServerInformationen aus dem Clientzertifikat zu lesen und sie in der HTTP-Antwort zurĂŒckzugeben.
- Ein Typ ConnectionFilter wurde hinzugefĂŒgt, um TCP-Verbindungen in der Phase vor der Aushandlung der TLS-Parameter zu filtern, was ermöglicht, Ressourcen zu sparen, indem Verbindungen frĂŒhzeitig abgebrochen werden.
- Die UnterstĂŒtzung fĂŒr virtuelle Transportebene-Ströme (Virtual L4 Streams) wurde hinzugefĂŒgt, sodass eigene Implementierungen von Netzwerkprotokollen in den pingora-proxy integriert werden können.
- Die Möglichkeit zur Nutzung der Optionen verify_cert und verify_hostname in Konfigurationen mit rustls wurde implementiert.
- Externen Crate-Paketen wurde der Zugriff auf die Struktur HttpProxy ermöglicht, um die Logik der Proxy-Anfragen zu ĂŒberschreiben.
- Es wurde erlaubt, Hintergrund-Handler fĂŒr Unteranfragen vom Haupt-Session-Handler abzutrennen.
- Die Möglichkeit, die GröĂe des Anfragekörpers von HTTP1 und HTTP2 sowie Metriken der Proxy-Arbeit zu verfolgen, wurde bereitgestellt.
- Die Möglichkeit zur Erstellung eigener Sessions fĂŒr gekapselten HTTP-Verkehr wurde hinzugefĂŒgt.
- Es wurden EinschrĂ€nkungen fĂŒr die Verwendung von Versionen der lru-Bibliothek (0.16.3 oder neuer) aufgrund einer SicherheitsanfĂ€lligkeit in der Implementierung des Iterators IterMut festgelegt, die zu einem Absturz fĂŒhrt, wenn die ĂberprĂŒfung des Variablenzugriffs (borrow checker) aktiviert ist.
Quelle: opennet.ru
