Iniziamo chiarendo che con VNC non si intende un particolare programma, ma una categoria di programmi che consentono il controllo remoto di un computer. L'acronimo VNC sta per Virtual Network Computing e la caratteristica che accomuna tali software è l'utilizzo del protocollo RFB, Remote Frame Buffer. In questo articolo vedremo come utilizzare un server VNC su un sistema Linux e su un sistema Windows. Le indicazioni fornite potranno essere d'aiuto comunque in qualsiasi ipotesi di configurazione.
Lo schema di funzionamento è semplice: da un lato il computer da controllare su cui installeremo il software VNC server, dall'altro il computer controllante che utilizza invece la componente client, il cosiddetto viewer. Le due macchine possono essere collegate tra loro tramite una LAN privata o attraverso la rete pubblica Internet. Nella seconda ipotesi il lavoro risulterà probabilmente più gravoso per la necessità di configurare anche altre apparecchiature come firewall e router.
Se dalla postazione client stabiliamo una connessione al server vedremo il desktop della macchina remota in una finestra del programma. Potremo agire su di esso direttamente con la nostra tastiera ed il nostro mouse come se fossimo fisicamente seduti davanti al computer. Il bello di tutto questo è che i sistemi operativi coinvolti nella comunicazione possono essere diversi: Linux, Windows o MacOSX. Potremmo controllare un server Windows 2003 dalla nostra Linux box o, viceversa, un server Linux da una stazione Windows XP.
La tecnologia VNC: Real, Ultra e Tight
È necessario a questo punto un breve cenno storico per capire da dove venga questa tecnologia. Il protocollo RFB fu sviluppato alla fine degli anni novanta negli Olivetti Research Laboratory, che furono successivamente acquisiti da AT&T. Le specifiche del protocollo vennero rese pubbliche ed il software VNC, basato su RFB, rilasciato come open source. Quando nel 2002 il laboratorio fu chiuso una parte dei tecnici fondarono RealVNC Ltd. che proseguì lo sviluppo del programma e del protocollo.
Essendo tutto di dominio pubblico, col tempo, altri gruppi o aziende crearono una propria versione del software. È chiaro dunque perché le implementazioni di VNC a nostra disposizione siano molteplici. In linea di principio dovrebbero essere completamente compatibili basandosi sul medesimo standard. In realtà lo sono nelle funzionalità di base, mentre non si può dire altrettanto per caratteristiche particolari come la cifratura della trasmissione o il trasferimento di file. Le più note versioni sono:
- Real VNC
- Ultra VNC
- Tight VNC
È impossibile consigliare in generale quale programma adottare: ognuno presenta pregi e difetti. La scelta inoltre può essere influenzata dal budget a disposizione, dai sistemi operativi in gioco, dall'infrastruttura di connessione adottata, oltre poi alle personali simpatie. Tanto per fare qualche esempio RealVNC, nella versione gratuita, non implementa la cifratura dei dati trasmessi. Ciò porterebbe a scartarlo se ci si collega tramite Internet, salvo adottare particolari accorgimenti come la creazione di una VPN. UltraVNC, gratuito, consente di utilizzare plugin di terze parti per cifrare la connessione. Purtroppo esiste solo la versione per Windows. Infine Tight VNC cerca di essere il più aderente agli standard possibile e introduce una buona compressione dei dati per connessioni lente, ma la sua interfaccia lascia un po' a desiderare.
Data la premessa queste pagine illustreranno solo una possibile soluzione rispetto al problema di controllare da remoto un server mediante interfaccia grafica. In prima battuta ci prefiggeremo di agire su una macchina con Fedora 9 e Gnome, sia da client Linux che Windows. Come di consueto lascio a voi l'onere di adattare le indicazioni fornite alla vostra distribuzione e desktop manger preferiti.
Installazione del server VNC su Linux
L'installazione di seguito descritta ci consentirà di ottenere un desktop persistente. In altri termini ogni volta che ci collegheremo, fornendo le opportune credenziali di accesso, ritroveremo il nostro desktop esattamente come l'avevamo lasciato dopo l'ultimo accesso al server. Il pacchetto precompilato disponibile si basa su Xvnc Free Edition di RealVNC Ltd.. Al momento della stesura dell'articolo viene distribuita la versione 4.1.2 che corrisponde al pacchetto 4.1.2-32.fc9.
Iniziamo posizionandoci sul server che supponiamo abbia indirizzo IP 11.22.33.44 e hostname mioserver.indirizzo.it. Procediamo come di consueto con YUM, per praticità installeremo sia la parte client che server. Apriamo una console, assumiamo i privilegi di root e digitiamo:
[root]# yum install vnc vnc-server
A questo punto lasciamo la condizione di root e ritorniamo utenti comuni. Al prompt digitiamo:
[ermanno]$ vncserver
Il programma richiede di scegliere e confermare una password. Tale chiave ci servirà poi per accedere al nostro desktop da remoto, cerchiamo di sceglierla con un minimo di criterio. Al termine dell'inserimento otterremo in risposta un messaggio di questo tipo:
xauth: creating new authority file /home/ermanno/.Xauthority New 'mioserver.indirizzo.it:1 (ermanno)' desktop is mioserver.indirizzo.it:1 Creating default startup script /home/ermanno/.vnc/xstartup Starting applications specified in /home/ermanno/.vnc/xstartup Log file is /home/ermanno/.vnc/mioserver.indirizzo.it:1.log
Vediamo i principali effetti ottenuti: innanzitutto ci è stato assegnato il desktop individuato dal numero 1. Per collegarci ad esso dovremo digitare mioserver.indirizzo.it:1 o, in alternativa, l'indirizzo IP sempre seguito da :1. Alla prima esecuzione in un particolare profilo utente vncserver crea la directory .vnc all'interno della home. Se apriamo /home/ermanno/.vnc troveremo una serie di file tra i quali:
- mioserver.indirizzo.it:1.log dove vengono registrati i messaggi relativi all'attività del server, utile per il debug;
- xstartup che servirà a configurare la nostra connessione;
- passwd utilizzato per memorizzare la password in forma cifrata.
Se vogliamo cambiare la nostra password digitiamo il comando:
[ermanno]$ vncpasswd
Per eseguire la medesima operazione su un utente qualunque basta far seguire al comando il suo nome, ovviamente dovremo avere i privilegi necessari.
Passiamo ora alla modifica del file xstartup, prima di farlo fermiamo il server:
[ermanno]$ vncserver -kill :1
Il contenuto del file dovrebbe essere simile a questo:
#!/bin/sh
vncconfig -iconic &
#Uncomment the following two lines for normal desktop:
#unset SESSION_MANAGER
#exec /etc/X11/xinit/xinitrc
[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
xsetroot -solid grey
xterm -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &
twm &
Per ottenere un desktop "normale" seguiamo il consiglio presente nel file e decommentiamo le due righe:
unset SESSION_MANAGER exec /etc/X11/xinit/xinitrc
Commentiamo l'ultima riga con l'istruzione twm & e, andando a capo, aggiungiamo:
gnome-session &
Riavviamo VNC con il comando vncserver ed ancora una volta riceveremo la notifica che il desktop assegnatoci è il numero 1. Per capire meglio cosa significhi eseguiamo:
[ermanno]$ netstat -tanp | grep 590
In risposta dovremmo trovare una riga simile a questa:
tcp 0 0 0.0.0.0:5901 0.0.0.0:* LISTEN 12334/Xvnc
Il demone Xvnc aspetta dunque la nostra connessione sulla porta 5901. Se ripetessimo la procedura sopra descritta con un altro utente questi riceverebbe il desktop 2 ed il server si metterebbe in ascolto anche sulla 5902. Il nostro ipotetico utente per collegarsi dovrebbe digitare mioserver.indirizzo.it:2. Analogo discorso varrebbe per un terzo utente e così via: tenetelo ben presente se dovete configurare eventuali software o apparecchiature di protezione.
Colleghiamoci da un client
Per provare la configurazione posizioniamoci ora su un client Linux, su cui installiamo almeno la parte viewer di VNC. Apriamo una console e digitiamo:
[ermanno]$ vncviewer 11.22.33.44:1
Se il server è raggiungibile mediante il proprio nome possiamo usare anche mioserver.indirizzo.it:1. Si aprirà una finestra che richiede l'inserimento della password, digitiamola e, se tutto funziona correttamente, l'immagine del desktop del server apparirà sul nostro monitor. Proviamo ora ad agire su quel desktop con il nostro mouse e la nostra tastiera, aprendo documenti o lanciando programmi.
Figura 1: La finestra di login di RealVNC su Linux
Per modificare le opzioni di connessione, rinfrescare la schermata o passare alla modalità schermo intero premiamo il tasto funzione F8 che ci mostrerà un apposito menù. Se adottiamo la visualizzazione full screen possiamo sfruttare anche le combinazioni di tasti normalmente intercettate dal window manager. Ad esempio Alt+Tab ci permetterà di passare da una finestra all'altra del server anzichè della nostra macchina.
Per i test da un client Windows possiamo utilizzare UltraVNC, ribadisco che la scelta del programma è sempre molto personale. Almeno per il momento evitiamo d'installare tutto il software e limitiamoci a prelevare i binari, indicati come WIN32 UltraVNC 1.0.5 Binaries archive, dall'area download del sito.
Dal file .zip estraiamo solo l'eseguibile vncviewer.exe. Un doppio click e si aprirà la finestra di connessione: notiamo subito che l'interfaccia risulta un po' più gradevole e immediata rispetto a quella spartana di RealVNC per Linux. Nel campo VNC Server digitiamo l'indirizzo del server seguito da :1, un comodo menù a discesa memorizza gli indirizzi via via digitati permettendo di richiamarli rapidamente.
Figura 2: La finestra di connessione di UltraVNC
Selezioniamo il pulsante Connect, digitiamo la password richiesta e, a questo punto, potremo tranquillamente gestire il nostro server a colpi di click. La comoda barra superiore della finestra di UltraVNC consente di disporre di alcune comuni funzioni come il refresh della schermata, il passaggio alla modalità full screen e viceversa o la chiusura della connessione.
Configuriamo VNC come servizio
Siamo arrivati fin qui e tutto funziona bene, ma se riavviamo il server ci troveremo nell'impossibilità di connetterci al nostro desktop. Vogliamo che VNC sia sempre pronto a ricevere connessioni anche in caso di imprevisto riavvio. Per attivare vncserver al boot dobbiamo impostarlo ad "on" nel/i runlevel d'interesse, ad esempio se il nostro server si avvia in modalità grafica, come root digitiamo:
[root]# chkconfig --level 5 vncserver on
Da questo momento potremo anche agire sul servizio con: service vncserver start/stop/restart.
Occupiamoci ora del file di configurazione /etc/sysconfig/vncservers e modifichiamolo nel seguente modo:
VNCSERVERS="1:ermanno" VNCSERVERARGS[1]="-geometry 1024x768 -nolisten tcp -nohttpd"
Con la prima riga abilitiamo in avvio il display 1 per l'utente ermanno, poi con la seconda riga impostiamo alcune modalità di connessione. È importante evitare l'opzione -localhost se non ci colleghiamo con un canale sicuro perché il server negherebbe l'accesso. Con -nohttpd specifichiamo che non consentiamo la connessione dai client via browser (esistono infatti alcuni client web-based).
E se volessimo permettere a più utenti di connettersi al server con questa modalità? Niente di più semplice:
VNCSERVERS="1:ermanno 2:francesco" VNCSERVERARGS[1]="-geometry 1024x768 -nolisten tcp -nohttpd" VNCSERVERARGS[2]="-geometry 800x600 -nolisten tcp -nohttpd"
In questo caso abbiamo aggiunto l'utente francesco con le proprie impostazioni di connessione.
Per terminare avviamo il servizio vncserver ed avremo finalmente un server Linux gestibile da remoto tramite interfaccia grafica.
Per ora ci fermiamo qui, ma rimangono ancora alcuni aspetti interessanti da affrontare come la protezione della comunicazione client-server o il controllo di un server Windows "windowizzando" il client Linux. Se quanto descritto in queste pagine ha destato il vostro interesse, vi do appuntamento a breve per proseguire la trattazione.
Nelle pagine precedenti abbiamo visto come sia possibile amministrare da remoto un server Linux (Fedora 9) sia da client Linux che Windows. Passiamo ora ad un server Windows che, analogamente, gestiremo da client con entrambi i sistemi operativi. La scelta cadrà in questo caso su UltraVNC, software gratuito specifico per piattaforme Microsoft. Ribadisco che la scelta di quale software VNC adottare dipende dalla situazione contingente e dalle personali inclinazioni e che, per lo meno nelle funzioni di base, le varie implementazioni risultano compatibili.
Le caratteristiche peculiari di UltraVNC sono varie, tra queste citiamo:
- Il cosiddetto mirror driver, installabile come opzione, che rende più veloce l'aggiornamento dello schermo e impegna meno il processore
- Due ulteriori metodi di autenticazione MS-Logon I e MS-Logon II che permettono l'integrazione con gli account definiti sulla macchina o sul dominio Windows
- Un sistema chiamato DSM, Data Stream Modification, che consente a chiunque, tramite lo sviluppo di appositi plugin, di operare una qualsiasi trasformazione sui dati in transito, tra cui la cifratura
- Un sistema di trasferimento file tra computer locale e computer remoto, dotato di compressione dei dati e meccanismo di resume in caso d'interruzione
- Alcuni strumenti che facilitano la connessione quando vengono coinvolti firewall, router o proxy
Installiamo VNC su server Windows
Considereremo d'installare il programma per la prima volta sul nostro server seguendo una procedura molto standard, lascio a voi sperimentare le numerose opzioni avanzate disponibili. Tra parentesi il computer da controllare potrebbe anche essere una normale stazione Windows XP o Vista. Dall'area download del sito preleviamo il file d'installazione selezionando il link Win32 UltraVNC 1.0.5 Setup. È l'ultima versione stabile dopo la 1.0.2, infatti la 1.0.4 non è mai stata promossa tale. Da dicembre è inoltre disponibile l'update 1.0.5.3 che sarà bene scaricare.
Terminato il download lanciamo il setup e seguiamo le istruzioni del wizard. Le prime schermate richiedono semplicemente di accettare la licenza e definire il percorso d'installazione. Procedendo ci viene richiesto che componenti desideriamo installare. Selezionando Full Installation avremo modo di esplorare tutte le funzionalità del software. Se utilizziamo Windows Vista le successive schermate ci consentono di scaricare le integrazioni per tale sistema operativo. Più oltre ci verrà proposto il download del Mirror Driver, sopra menzionato, e qui dobbiamo decidere se provare a migliorare le prestazioni del programma a fronte di un eventuale (basso) rischio di malfunzionamento. Infine negli Additional tasks selezioniamo almeno la registrazione di UltraVNC come servizio ed il suo avvio in automatico.
A questo punto una strana schermata, un po' terroristica, ci inviterà a scegliere una password (aprendo automaticamente l'apposita finestra di configurazione) ed un utente per eseguire il programma....in caso di dubbio la scelta cadrà sull'administrator. Per quanto non richiesto consiglio, se possibile, un riavvio del computer.
Terminiamo installando l'update 1.0.5.3, il che non dovrebbe presentare problemi, l'unica accortezza è rispondere si quanto l'installer ci chiederà di rimuovere il servizio. Il programma di setup si occuperà di riattivarlo una volta effettuato l'aggiornamento.
Il caratteristico occhio di UltraVNC farà ora bella mostra di sé nella System Tray. Un click con il tasto destro su tale icona ci aprirà il menu contestuale. La voce più importante è Admin Properties, consente infatti di modificare le principali opzioni di configurazione del programma. Nel nostro caso possiamo mantenere i valori di default, magari deselezionando Enable JavaViewer come avevamo fatto su Linux. L'impostazione dei parametri relativi alle connessioni su Auto garantisce che il server sarà in ascolto sulla porta 5900 ed il display sarà il numero 0. Caso mai volessimo modificare la password scelta in fase d'installazione, possiamo utilizzare il campo VNC Password. A questo punto non ci resta che testare il programma.
Colleghiamoci da un client
Posizioniamoci su una macchina Windows ed installiamo almeno la componente viewer del software. Potremmo semplicemente limitarci ad utilizzare l'eseguibile vncviewer.exe estratto dall'archivio compresso dei binari (WIN32 UltraVNC 1.0.5 Binaries archive), come visto in precedenza.
Nel campo VNC Server digitiamo l'indirizzo o il nome del server. Selezioniamo il pulsante Connect e, se tutto funziona correttamente, ci verrà richiesto d'inserire la password d'accesso. Facciamolo ed il desktop del server sarà a nostra completa disposizione, potremo installare o rimuovere programmi, effettuare aggiornamenti, configurare servizi e così via.
Per provare la connessione da un client Linux possiamo semplicemente digitare:
[ermanno]$ vncviewer 11.22.33.44
Ricordo che 11.22.33.44 rappresenta nei nostri esempi il numero IP del server, mentre l'indicazione del display :0 risulta superflua. Il nostro client Linux utilizza Xvnc Free Edition e quindi potrebbero verificarsi delle incompatibilità rispetto al server UltraVNC. Dovremmo sicuramente rinunciare ad alcune caratteristiche peculiari del programma, che talora possono risultare utili. Come vedremo nel prossimo paragrafo è però possibile, almeno in parte, ovviare a tale inconveniente.
Vi segnalo da alcuni esperimenti con la versione 1.0.5 che spesso la modifica dei parametri di configurazione richiede il riavvio manuale del servizio. Operazione che magari ci si aspetterebbe in automatico dal programma. Inoltre mi è capitato che le opzioni non venissero salvate se, quando richiesto, non specificavo esplicitamente l'utente da utilizzare per eseguire il programma.
Trasformiamo Linux in Windows con Wine
Wine è un progetto iniziato nel 1993 con lo scopo di eseguire programmi Windows su una macchina Linux. Non è un emulatore vero e proprio, ma esegue i programmi in forma nativa fornendo le funzionalità di Windows attraverso Linux. Per approfondire l'argomento, rimandiamo all'apposito approfondimento pubblicato su HTML.it. Pur essendo un magnifico progetto, non è perfetto, tutt'altro. Esiste comunque sul sito un database delle applicazioni, denominato AppDb, che elenca i programmi suddividendoli a seconda del livello di compatibilità.
Nel caso di UltraVNC viewer i risultati ottenuti possono considerarsi soddisfacenti, anche se variano da versione a versione. Per installare Wine digitiamo:
[root]$ yum install wine
Il pacchetto proposto da YUM, al momento della stesura dell'articolo, è 1.1.9-2.fc9. Una volta installato il programma estraiamo l'eseguibile vncviewer.exe dal file .zip dei binari, come più volte visto. Un doppio clic dovrebbe essere sufficiente ad eseguirlo tramite Wine, consentendoci di sfruttare al meglio la compatibilità tra viewer e server anche dalla nostra Linux box.
Personalmente ho lavorato con sufficiente stabilità con le versioni 1.0.2 e 1.0.4 di UltraVNC, mentre non ho ancora sperimentato a fondo la nuova versione 1.0.5. Per quanto riguarda il trasferimento file, ho riscontrato qualche problema nell'eseguire l'operazione da server a client e non viceversa. Malgrado il fastidioso crash dell'applicazione che costringe a riconnettersi, la copia viene comunque portata a termine correttamente.
Figura 3: UltraVNC Viewer eseguito su Fedora
VNC e la sicurezza
Uno degli aspetti cruciali dell'utilizzo di VNC attraverso Internet è la sicurezza delle informazioni scambiate tra server e client. Con Xvnc Free Edition, che abbiamo installato e configurato su Fedora 9, ci viene garantita la riservatezza nello scambio delle credenziali ma, una volta stabilita la connessione, il traffico viaggerà in chiaro. Stiamo ovviamente parlando della versione gratuita del software di RealVNC Ltd., la versione commerciale presenta ben altre caratteristiche. Nel caso di UltraVNC si può adottare uno dei plug-in reperibili al seguente link, ciò ovviamente implica l'adozione della medesima implementazione di VNC per server e viewer.
Una soluzione più generale consiste nel creare un tunnel cifrato e poi instradarvi il traffico generato da VNC. Di seguito vedremo due possibili esempi.
Utilizzare una VPN
Su queste pagine, nell'articolo OpenVPN: un server VPN open source, è stata presentata una VPN open source, gratuita e multipiattaforma. Questa soluzione consentirebbe l'adozione di diversi sistemi operativi, lato server e lato client, che poi è una delle caratteristiche che ci hanno portato a scegliere VNC.
Per i dettagli relativi all'installazione e configurazione di OpenVPN vi rimando all'articolo citato.
Una volta instaurata la connessione protetta, supponendo che il server OpenVPN abbia indirizzo virtuale 10.8.0.1, basterà riferirsi a questo numero IP proprio come se fossimo su una LAN. Ad esempio per connetterci dal client Linux al server Linux digiteremo:
[ermanno]$ vncviewer 10.8.0.1:1
Adottando questa soluzione sarà il protocollo SSL/TLS a garantire la sicurezza delle informazioni scambiate, permettendoci di utilizzare versioni di VNC gratuite in tutta tranquillità.
Utilizzare SSH
In questo caso la soluzione si adatta solo ad un server *nix mentre il client potrebbe anche essere un pc Windows. L'idea è sfruttare il protocollo Secure Shell, SSH, comunemente utilizzato per gestire in sicurezza un server Linux, ma via console. La flessibilità di SSH ci consente di adottarlo anche nel caso preferissimo un'interfaccia grafica. I dettagli relativi ad installazione e configurazione di OpenSSH esulano dagli scopi di quest'articolo, daremo per scontato che il software funzioni correttamente sul nostro server Linux. Immagineremo inoltre, per praticità, che l'autenticazione sia consentita tramite semplice password, mentre risulta in genere più sicura l'adozione di chiavi asimmetriche.
Supponendo, al solito, che il numero IP della macchina da controllare sia 11.22.33.44, dal client Linux lanciamo il comando:
[ermanno]$ ssh -L 5902:127.0.0.1:5901 -l ermanno 11.22.33.44
La parte fondamentale del comando è -L 5902:127.0.0.1:5901. Con questa stringa richiediamo che le connessioni effettuate sulla porta 5902 della macchina locale (127.0.0.1) vengano ridirette attraverso il tunnel ssh alla macchina remota sulla porta 5901. Una volta instaurata la connessione cifrata per utilizzare VNC digitiamo:
[ermanno]$ vncviewer 127.0.0.1:2
Possiamo anche modificare il file di configurazione del server, /etc/sysconfig/vncservers, per abilitare solo connessioni su tunnel protetto. Riprendendo l'esempio precedentemente analizzato aggiungiamo l'opzione -localhost.
VNCSERVERS="1:ermanno" VNCSERVERARGS[1]="-geometry 1024x768 -localhost -nolisten tcp -nohttpd"
Se il computer da cui ci colleghiamo si basa su Windows possiamo ricorrere a Putty, il client SSH gratuito. Infatti in Connection / SSH / Tunnels è possibile configurare il rindirizzamento delle porte in modo del tutto analogo a quanto fatto da riga di comando. Come Source port indicheremo la 5902 mentre in Destination inseriremo 11.22.33.44:5901.
Figura 4: Putty port forwarding
Conclusioni
In queste pagine abbiamo trovato una possibile soluzione al problema di gestire da remoto un server attraverso interfaccia grafica. In particolare l'attenzione è stata puntata su un ambiente operativo multipiattaforma il che rende VNC peculiare rispetto ad altri strumenti come Terminal Services (o Remote Desktop Services) in ambiente Microsoft. Le versioni gratuite del software, che non richiedono l'acquisto di licenze client, adottando le opportune cautele rispetto al problema della sicurezza, consentono di operare in modo più che soddisfacente anche in ambito professionale. Da ultimo vi faccio notare come questa tipologia di programma possa trovare applicazioni anche in altri scenari come helpdesk, o gestione di un'aula didattica.