Oltre il firewall con Azure Relay e ASP.NET Core

di Cristian Civera, in Relay,

Il cloud è un'innovazione tecnologica che sicuramente ha cambiato e semplificato il modo di ospitare e fornire applicativi e servizi consentendo anche nuovi scenari, probabilmente irrealizzabili senza di esso. Nonostante questo, sono molteplici ancora le situazioni in cui l'on-premise svolge ancora un ruolo fondamentale. Scarsa connettività, regole restrittive, diffidenza sul cloud sono alcune delle ragioni che portano a non scegliere il cloud pubblico e in alcuni casi neanche a scegliere quello privato. Oltre a questo, dobbiamo considerare anche quegli scenari in cui i dati o i servizi da raggiungere sono forniti un utente finale. Pensiamo, per esempio, ad un dispositivo IoT, un sensore oppure ad una webcam dei quali vogliamo poter consumare delle informazioni.

Tutte queste situazioni hanno in comune un limite nella rete internet che possono sfruttare. Firewall, router, regole di NAT e policy rendono complicata la possibilità di esporre dati su internet e non sono da meno le VPN, alla portata solo di chi ha particolari skill tecniche e giustificabili solo in scenari IT, non certo per un utente domestico.

Una tecnica che risolve velocemente ed efficacemente il problema consiste nell'utilizzo di servizi di relay. Microsoft, attraverso la sua piattaforma Azure, mette a disposizione un servizio di nome Azure Relay che serve proprio a questo scopo. In questo articolo vogliamo affrontarne il suo utilizzo attraverso l'SDK dedicato a .NET, anche se troviamo disponibile quello dedicato a node.js e più in generale possiamo utilizzarlo con qualsiasi tecnologia, perché basato su standard noti ed è ben documentato il suo funzionamento.

Oltre a mostrare il suo funzionamento, vogliamo coniugarne le funzionalità con ASP.NET Core, il framework dedicato allo sviluppo di applicazioni web. La sua modularità è talmente elevata che possiamo prendere un qualsiasi applicativo web e sostituire l'ascolto via HTTP con uno basato su Azure Relay. Allo stesso modo, un altro applicativo ASP.NET Core può ascoltare in HTTP su un indirizzo pubblico e girare tutte le richieste via Azure Relay, verso l'applicativo reale, protetto da firewall.

Partiamo quindi dal capire in cosa consiste il servizio fornito da Microsoft Azure.

Azure Relay

La tecnica di relay menzionata in precedenza è una soluzione semplice che si basa sull'uso di connessioni passive, con le quali consentiamo a tutti i soggetti coinvolti, client e server, di effettuare fisicamente connessioni in uscita, solitamente concesse in quasi tutte gli scenari o, nel caso, che richiedono poco sforzo di configurazione. Queste connessioni sfruttano un intermediario che si fa carico di ricevere le connessioni in ingresso e di mettere in comunicazione client e server.

Stabilito il canale, entrambi i soggetti possono inviare messaggi al relay il quale li indirizza al server destinatario. Quest'ultimo può processare la richiesta e mandare la risposta ancora all'intermediario per poi giungere al client. Sebbene la soluzione sia semplice per il client e per il server, non lo è affatto per l'infrastruttura di relay, la quale ha l'onere di gestire una moltitudine di connessioni, relazionarle tra loro, il tutto in modo scalabile al fine di supportare, 10, 100, 1000 connessioni. Fortunatamente, come tanti servizi PaaS, tutto questo è implementato da Microsoft e a noi resta solo il compito più semplice. Un pricing basato sul numero di listener e sul traffico effettuato, ci permette concentrarci sul servizio e di dimenticarci dei carichi delle macchine che devono gestire le richieste.

Il servizio è adottabile anche da chi non sposa il cloud pubblico, perché le connessioni vengono effettuate con tecnologie standard e protette vie SSL. Un sistema basato su chiavi ci permette di autenticare le connessioni, differenziare i ruoli e i canali di comunicazione. Possiamo sfruttare due layer di comunicazione: WCF Relay e la Hybrid Connection. La prima, disponibile fin dalla nascita del servizio, sfrutta Windows Communication Foundation, una libreria basata su .NET Framework che permette di creare servizi e di astrarre dal layer di comunicazione. Dei particolari binding realizzati appositamente permettono di scrivere e consumare servizi veicolando messaggi SOAP o REST, mettendo dell'overhead in più, non sempre necessario e non sono, cosa ancora più importanti, utilizzabili facilmente da altri linguaggi o tecnologie. La Hybrid Connection, invece, è basata su HTTP e WebSocket e il suo protocollo di comunicazione è molto semplice e documentato qua. Ciò lo rende più interoperabile ed anche molto leggero, perché quello che abbiamo a disposizione è un socket di comunicazione bidirezionale dove transitare byte ed è nostro compito decidere come serializzare i messaggi.

In questo articolo vogliamo sfruttare questo protocollo, perché è nuovo, più leggero ed interoperabile, e con prospettiva di vita più longeva. Il suo SDK .NET è inoltre compatibile con .NET Standard 1.3, perciò utilizzabile su tutti i runtime .NET, compreso quindi .NET Core. Partiamo quindi alla creazione di una Hybrid Connection.

6 pagine in totale: 1 2 3 4 5 6
Contenuti dell'articolo

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

Top Ten Articoli

Articoli via e-mail

Iscriviti alla nostra newsletter nuoviarticoli per ricevere via e-mail le notifiche!

In primo piano

I più letti di oggi

In evidenza

Misc