L'azienda Cloudflare ha pubblicato il rilascio del framework Pingora 0.7, progettato per lo sviluppo di servizi di rete protetti e ad alte prestazioni in linguaggio Rust. Un proxy costruito con Pingora è già utilizzato da oltre due anni nella rete di distribuzione dei contenuti Cloudflare in sostituzione di nginx e gestisce oltre 40 milioni di richieste al secondo. Il codice è scritto in linguaggio Rust ed è pubblicato con licenza Apache 2.0.
Caratteristiche principali di Pingora:
- Supporto per HTTP/1 e HTTP/2 (in programma HTTP/3), e possibilità di creare servizi che utilizzano i propri protocolli o UDP/TCP.
- Supporto per l'elaborazione multithreading delle richieste in modalità asincrona.
- Possibilità di allegare callback e filtri che permettono di gestire le varie fasi dell'elaborazione della richiesta, oltre a modificare, reindirizzare, bloccare e registrare richieste e risposte.
- Proxy per gRPC e WebSocket.
- Bilanciatori di carico plug-in.
- Possibilità di modifica della configurazione senza riavvio.
- Supporto per l'aggiornamento del codice dell'app senza interruzione delle connessioni.
- Strumenti per il failover in caso di guasti.
- Integrazione con vari sistemi di monitoraggio e logging (Syslog, Prometheus, Sentry, OpenTelemetry).
- Supporto per la crittografia TLS (viene utilizzato OpenSSL, BoringSSL o Rustls).
- Pacchetti Rust pronti per la creazione di proxy HTTP, lavorare con protocolli di rete, analizzare gli header HTTP, monitorare e limitare il traffico, bilanciamento del carico, lavorare con tabelle hash distribuite Ketama, mantenere una cache in memoria e gestione asincrona dei timeout.
Tra le novità nella nuova versione:
- Nella struttura SslDigest è stato aggiunto il campo "extension", e per il tipo TlsAccept è stato implementato il gestore handshake_complete_callback, che consente di allegare dati arbitrari specifici dell'applicazione alla connessione TLS. Come esempio, viene mostrato come utilizzare questa possibilità per creare server, che legge le informazioni dal certificato del cliente e le restituisce nella risposta HTTP.
- È stato aggiunto il tipo ConnectionFilter per filtrare le connessioni TCP nella fase di pre-negoziazione dei parametri TLS, risparmiando risorse e resettando le connessioni nelle fasi iniziali.
- È stato aggiunto il supporto per flussi virtuali di livello di trasporto (Virtual L4 Streams), che permette di integrare nel pingora-proxy implementazioni personalizzate di protocolli di rete.
- È stata implementata la possibilità di utilizzare le opzioni verify_cert e verify_hostname nelle configurazioni con rustls.
- Per i pacchetti esterni crate è stato consentito l'accesso alla struttura HttpProxy per ridefinire la logica di proxy delle richieste.
- È stato consentito di isolare gestori di richieste secondarie dal gestore principale della sessione.
- È stata fornita la possibilità di monitorare le dimensioni del corpo delle richieste HTTP1 e HTTP2, così come le metriche di funzionamento del proxy.
- È stata aggiunta la possibilità di creare sessioni personalizzate per il traffico HTTP incapsulato.
- È stata impostata una limitazione sull'uso delle versioni della libreria lru (0.16.3 o più recenti) a causa di una vulnerabilità nell'implementazione dell'iteratore IterMut, che può portare a terminazioni anomale a causa dell'attivazione del controllo dei prestiti (borrow checker).
Fonte: opennet.ru
