Alcuni utenti affittano VPS Windows a buon mercato per avviare un servizio di desktop remoto. Lo stesso può essere fatto su Linux senza dover ospitare dell'hardware presso il data center o affittare un server dedicato. Alcuni necessitano di un'interfaccia grafica familiare per test e sviluppo o di un desktop remoto con una larghezza di banda consistente per lavorare su dispositivi mobili. Ci sono molte applicazioni per i sistemi basati sul protocollo Remote FrameBuffer (RFB) della Virtual Network Computing (VNC). In un breve articolo, spiegheremo come configurarlo su una macchina virtuale con qualsiasi hypervisor.
Indice:
Scelta del server VNC
Il servizio VNC può essere integrato nel sistema di virtualizzazione, con l'hypervisor che lo collega ai dispositivi emulati, senza necessità di configurazione aggiuntiva. Questa opzione prevede costi significativi e non è supportata da tutti i provider — anche in una realizzazione meno impegnativa, quando invece di emulare una vera scheda grafica si trasmette un'astrazione semplificata (framebuffer) alla macchina virtuale. A volte il server VNC viene collegato a un server X in esecuzione, ma questo metodo è più adatto per l'accesso a una macchina fisica e crea alcune complessità tecniche su una virtuale. È più semplice installare un server VNC insieme a un server X integrato. Non richiede la presenza di dispositivi fisici (scheda video, tastiera e mouse) o la loro emulazione tramite hypervisor, rendendolo adatto per VPS di qualsiasi tipo.
Installazione e configurazione
Avremo bisogno di una macchina virtuale con Ubuntu Server 18.04 LTS nella configurazione di default. Nei repository standard di questa distribuzione ci sono diversi server VNC: , , e altri. Ci siamo fermati su TigerVNC — un fork attivo di TightVNC non più supportato dallo sviluppatore. La configurazione di altri server avviene in modo simile. Bisogna anche scegliere un ambiente desktop: a nostro avviso, l'opzione ottimale è XFCE per via delle relativamente basse esigenze di risorse computazionali. Chi lo desidera può installare altri DE o WM: dipende dalle preferenze personali, ma la scelta del software influisce direttamente sulla necessità di memoria RAM e di core computazionali.

L'installazione dell'ambiente desktop con tutte le dipendenze si esegue con il seguente comando:
sudo apt-get install xfce4 xfce4-goodies xorg dbus-x11 x11-xserver-utilsSuccessivamente, è necessario installare il server VNC:
sudo apt-get install tigervnc-standalone-server tigervnc-commonEseguirlo con diritti di superutente non è una buona idea. Creiamo un utente e un gruppo:
sudo adduser vnc 
Aggiungiamo l'utente al gruppo sudo, affinché possa gestire i compiti legati all'amministrazione. Se non è necessaria questa operazione, si può saltare questo passaggio:
sudo gpasswd -a vnc sudoNella fase successiva, bisogna avviare il server VNC con i privilegi dell'utente vnc, per creare una password sicura e file di configurazione nella directory ~/ .vnc/. La lunghezza della password può variare da 6 a 8 caratteri (i caratteri in eccesso vengono troncati). Se necessario, può essere impostata anche una password solo per la visualizzazione, quindi senza accesso a tastiera e mouse. I seguenti comandi vengono eseguiti con il nome dell'utente vnc:
su - vnc
vncserver -localhost no 
Per impostazione predefinita, il protocollo RFB utilizza un intervallo di porte TCP da 5900 a 5906 — queste sono le cosiddette porte di visualizzazione, ognuna delle quali corrisponde a uno schermo del server X. A questo proposito, le porte sono associate agli schermi da :0 a :6. L'istanza del server VNC che abbiamo avviato ascolta sulla porta 5901 (schermo :1). Altre istanze possono funzionare su altre porte con schermi :2, :3, ecc. Prima di procedere alla configurazione, è necessario fermare il server:
vncserver -kill :1Il comando dovrebbe restituire un messaggio simile: «Killing Xtigervnc process ID 18105… success!».
Quando TigerVNC viene avviato, esegue lo script ~/ .vnc/ xstartup per impostare i parametri di configurazione. Creiamo il nostro script, salvando prima un backup di quello esistente, se presente:
mv ~/ .vnc/ xstartup ~/ .vnc/ xstartup.b
nano ~/ .vnc/ xstartupLa sessione dell'ambiente desktop XFCE si avvia con il seguente script xstartup:
#!/bin/bash
unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS
xrdb $HOME/.Xresources
exec /usr/bin/startxfce4 &Il comando xrdb è necessario affinché il sistema VNC legga il file .Xresources nella home directory. Lì l'utente può definire vari parametri del desktop grafico: rendering dei caratteri, colori del terminale, temi del cursore, ecc. Lo script deve essere reso eseguibile:
chmod 755 ~/ .vnc/ xstartupA questo punto la configurazione del server VNC è completata. Se viene avviato con il comando vncserver -localhost no (con l'utente vnc), si può connettere con la password precedentemente impostata e visualizzare la seguente schermata:

Avvio del servizio tramite systemd
L'avvio manuale del server VNC non è adatto per applicazioni in produzione, quindi configureremo un servizio di sistema. I comandi vengono eseguiti con i privilegi di root (usiamo sudo). Iniziamo creando un nuovo file di unità per il nostro server:
sudo nano /etc/systemd/system/vncserver@.serviceIl simbolo @ nel nome permette di passare un argomento per la configurazione del servizio. Nel nostro caso, specifica la porta di visualizzazione del VNC. Il file di unità è composto da diverse sezioni:
[Unit]
Description=Server TigerVNC
After=syslog.target network.target
[Service]
Type=simple
User=vnc
Group=vnc
WorkingDirectory=/home/vnc
PIDFile=/home/vnc/.vnc/%H:%i.pid
ExecStartPre=-/usr/bin/vncserver -kill :%i > /dev/null 2>&1
ExecStart=/usr/bin/vncserver -depth 24 -geometry 1280x960 :%i
ExecStop=/usr/bin/vncserver -kill :%i
[Install]
WantedBy=multi-user.targetPoi è necessario notificare a systemd della creazione di un nuovo file e attivarlo:
sudo systemctl daemon-reload
sudo systemctl enable vncserver@1.serviceIl numero 1 nel nome definisce il numero dello schermo.
Fermiamo il server VNC, lo avviamo come servizio e controlliamo lo stato:
# от имени пользователя vnc
vncserver -kill :1# с привилегиями суперпользователя
sudo systemctl start vncserver@1
sudo systemctl status vncserver@1Se il servizio è attivo, dovremmo ricevere un risultato simile.

Collegamento al desktop
La nostra configurazione non utilizza la crittografia, quindi i pacchetti di rete possono essere intercettati da malintenzionati. Inoltre, nei server VNC vengono frequentemente , quindi non conviene lasciarli aperti per l'accesso da internet. Per una connessione sicura da un computer locale, bisogna incapsulare il traffico in un tunnel SSH e poi configurare il client VNC. Su Windows, si può usare un client grafico SSH (ad esempio, PuTTY). Per garantire la sicurezza, TigerVNC sul server è configurato per ascoltare solo localhost e non è accessibile direttamente dalle reti pubbliche:
sudo netstat -ap |more 
Su Linux, FreeBSD, OS X e altri sistemi operativi simili a UNIX, il tunnel dal computer client si crea utilizzando il comando ssh (il servizio sshd deve essere attivo sul server VNC):
ssh -L 5901:127.0.0.1:5901 -C -N -l vnc vnc_server_ipL'opzione -L collega la porta 5901 della connessione remota alla porta 5901 di localhost. L'opzione -C attiva la compressione, mentre -N indica a ssh di non eseguire comandi remoti. L'opzione -l specifica il login per l'accesso remoto.
Dopo aver impostato il tunnel sul computer locale, è necessario avviare il client VNC e stabilire una connessione con l'host 127.0.0.1:5901 (localhost:5901), utilizzando la password precedentemente impostata per l'accesso al server VNC. Ora possiamo interagire in modo sicuro tramite un tunnel crittografato con l'ambiente desktop XFCE su VPS. Nello screenshot nell'emulatore di terminale è stata avviata l'utilità top per mostrare un consumo ridotto di risorse della macchina virtuale. Da qui in avanti, tutto dipenderà dalle applicazioni utente.

Instalare e configurare un server VNC su Linux è possibile su quasi tutti i VPS. Non sono necessarie configurazioni costose e ad alta intensità di risorse con l'emulazione della scheda video o l'acquisto di licenze commerciali per il software. Oltre all'opzione di servizio di sistema che abbiamo esaminato, ci sono altre possibilità: l'avvio in modalità demone (attraverso /etc/rc.local) all'avvio del sistema o su richiesta tramite inetd. Quest'ultima è interessante per creare configurazioni multiutente. L'Internet superserver avvierà il server VNC e collegherà il client a esso, e il server VNC creerà un nuovo schermo e inizierà una sessione. Per l'autenticazione all'interno di essa è possibile utilizzare un gestore di display grafico (ad esempio, ), e dopo la disconnessione del client, la sessione verrà chiusa e tutti i programmi in esecuzione sullo schermo verranno terminati.
Fonte: habr.com
