La società Cloudflare ha pubblicato la versione 0.7 del framework Pingora, progettato per lo sviluppo di servizi di rete ad alte prestazioni e sicuri in linguaggio Rust. Già da oltre due anni, i proxy costruiti con Pingora vengono utilizzati nella rete di distribuzione dei contenuti di Cloudflare al posto di nginx e gestiscono oltre 40 milioni di richieste al secondo. Il codice è scritto in Rust ed è pubblicato con licenza Apache 2.0.
Principali funzionalità di Pingora:
- Supporto per HTTP/1 e HTTP/2 (presto anche HTTP/3), con la possibilità di creare servizi che utilizzano i propri protocolli o UDP/TCP.
- Supporto per l'elaborazione multithreading delle richieste in modalità asincrona.
- Possibilità di ancorare gestori di callback e filtri, che permettono di gestire diverse fasi dell'elaborazione della richiesta, oltre a modificare, reindirizzare, bloccare e registrare richieste e risposte.
- Proxy gRPC e WebSocket.
- Bilanciatori di carico plug-and-play.
- Possibilità di modificare la configurazione senza riavviare.
- Supporto per l'aggiornamento del codice dell'applicazione senza interrompere le connessioni.
- Strumenti per il failover in caso di guasti.
- Integrazione con diversi sistemi di monitoraggio e registrazione (Syslog, Prometheus, Sentry, OpenTelemetry).
- Supporto per la crittografia TLS (utilizza OpenSSL, BoringSSL o Rustls).
- Pacchetti Rust pronti per creare proxy HTTP, lavorare con protocolli di rete, analizzare intestazioni HTTP, contare e limitare il traffico, bilanciare il carico, gestire una tabella hash distribuita Ketama, mantenere una cache in memoria e gestire in modo asincrono i timeout.
Tra le modifiche nella nuova versione:
- Nel modello SslDigest è stato aggiunto il campo "extension", e per il tipo TlsAccept è stato implementato un gestore handshake_complete_callback che consente di allegare dati arbitrari, specifici per l'applicazione, alla connessione TLS. Viene mostrato come utilizzare questa funzionalità per creare server, leggendone le informazioni dal certificato del client e restituendole nella risposta HTTP.
- Aggiunto il tipo ConnectionFilter per filtrare le connessioni TCP nella fase precedente alla negoziazione dei parametri TLS, che consente di risparmiare risorse chiudendo le connessioni in una fase iniziale.
- Aggiunto il supporto per flussi virtuali di livello di trasporto (Virtual L4 Streams), che consentono di integrare in pingora-proxy le proprie implementazioni di protocolli di rete.
- È stata implementata la possibilità di utilizzare le opzioni verify_cert e verify_hostname nelle configurazioni con rustls.
- Per i pacchetti crate esterni, è stato consentito l'accesso alla struttura HttpProxy per sovrascrivere la logica di proxying delle richieste.
- È consentita l'assegnazione di gestori in background per le sotto-richieste dal gestore principale della sessione.
- È stata fornita la possibilità di monitorare le dimensioni del corpo delle richieste HTTP1 e HTTP2, oltre a metriche di funzionamento del proxy.
- È stata aggiunta la possibilità di creare sessioni personalizzate per il traffico HTTP incapsulato.
- Sono state imposte restrizioni all'uso di versioni della libreria lru (0.16.3 o successive) a causa di una vulnerabilità nell'implementazione dell'iteratore IterMut, che porta a crash a causa dell'interruzione delle variabili (borrow checker).
Fonte: opennet.ru
