Unii utilizatori închiriază VPS-uri cu Windows relativ ieftine pentru a rula servicii de desktop la distanță. Aceleași lucruri se pot face și pe Linux fără a plasa hardware-ul propriu în centru de date sau a închiria un server dedicat. Cineva are nevoie de un mediu grafic familiar pentru teste și dezvoltare sau de un desktop la distanță cu lățime de bandă mare pentru a lucra de pe dispozitive mobile. Există multe opțiuni pentru aplicația sistemului Virtual Network Computing (VNC) bazat pe protocolul Remote FrameBuffer (RFB). În acest articol scurt, vom vorbi despre cum să-l configurăm pe o mașină virtuală cu orice hipervizor.
Cuprins:
Alegerea serverului VNC
Serviciul VNC poate fi integrat în sistemul de virtualizare, iar hipervizorul îl va conecta la dispozitivele emulate, fără a necesita configurări suplimentare. Această opțiune implică costuri indirecte semnificative și nu este susținută de toți furnizorii — chiar și în implementarea mai puțin consumatoare de resurse, când, în loc de emularea unui dispozitiv grafic real, mașinii virtuale i se transferă o abstractizare simplificată (framebuffer). Uneori, serverul VNC este legat la un server X activ, dar această metodă este mai potrivită pentru accesul la o mașină fizică, întrucât pe o mașină virtuală creează o serie de dificultăți tehnice. Cel mai simplu este să instalați un server VNC cu un server X încorporat. Nu necesită prezența dispozitivelor fizice (carte video, tastatură și mouse) sau emularea acestora prin hipervizor, așa că se potrivește pentru orice tip de VPS.
Instalare și configurare
Vrem o mașină virtuală cu Ubuntu Server 18.04 LTS în configurația implicită. În repositoarele standard ale acestui distribuție există câteva servere VNC: , , și altele. Ne-am oprit la TigerVNC — un fork actual al TightVNC, care nu mai este în suport de către dezvoltator. Configurarea altor servere se face într-un mod similar. De asemenea, trebuie să alegeți un mediu de birou: din punctul nostru de vedere, opțiunea optimă este XFCE datorită cerințelor relativ scăzute de resurse de calcul. Cei dornici pot instala alt DE sau WM: aici totul depinde de preferințele personale, însă alegerea software-ului influențează direct necesitatea de memorie RAM și nucleele de calcul.

Instalarea mediului de birou cu toate dependențele se efectuează cu următoarea comandă:
sudo apt-get install xfce4 xfce4-goodies xorg dbus-x11 x11-xserver-utilsApoi, trebuie să instalăm serverul VNC:
sudo apt-get install tigervnc-standalone-server tigervnc-commonSă-l rulăm cu privilegii de superutilizator nu este o idee bună. Creăm un utilizator și un grup:
sudo adduser vnc 
Să adăugăm utilizatorul în grupul sudo, astfel încât să poată rezolva sarcinile de administrare. Dacă nu este nevoie, acest pas poate fi sărit:
sudo gpasswd -a vnc sudoÎn pasul următor, trebuie să pornim serverul VNC cu privilegii de utilizator vnc pentru a crea o parolă sigură și fișiere de configurare în directorul ~/.vnc/. Lungimea parolei poate fi între 6 și 8 caractere (excesul va fi tăiat). De asemenea, se poate seta o parolă doar pentru vizionare, adică fără acces la tastatură și mouse. Următoarele comenzi se execută în numele utilizatorului vnc:
su - vnc
vncserver -localhost no 
În mod implicit, protocolul RFB folosește o gamă de porturi TCP de la 5900 la 5906 — acestea sunt porturile de afișare, fiecare corespunzând unui ecran de server X. Porturile sunt asociate cu ecranele de la :0 la :6. Exemplar server VNC pe care l-am lansat ascultă pe portul 5901 (ecranul :1). Alte instanțe pot funcționa pe alte porturi cu ecranele :2, :3 și așa mai departe. Înainte de a continua configurarea, trebuie să oprim serverul:
vncserver -kill :1Comanda ar trebui să returneze un mesaj asemănător cu: „Killing Xtigervnc process ID 18105… success!”.
Când TigerVNC este pornit, acesta rulează scriptul ~/.vnc/xstartup pentru a configura setările. Vom crea propriul nostru script, salvând mai întâi o copie de rezervă a celui existent, dacă acesta există:
mv ~/.vnc/xstartup ~/.vnc/xstartup.b
nano ~/.vnc/xstartupȘedința de mediu desktop XFCE este lansată de următorul script xstartup:
#!/bin/bash
unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS
xrdb $HOME/.Xresources
exec /usr/bin/startxfce4 &Comanda xrdb este necesară pentru ca sistemul VNC să citească fișierul .Xresources din directorul personal. Acolo, utilizatorul poate defini diverse setări pentru desktop: redarea fonturilor, culorile terminalului, temele cursorului etc. Scriptul trebuie să fie executabil:
chmod 755 ~/.vnc/xstartupLa aceasta, configurarea serverului VNC este completă. Dacă îl lansăm cu comanda vncserver -localhost no (în numele utilizatorului vnc), ne putem conecta cu parola setată anterior și vom vedea următoarea imagine:

Pornirea serviciului prin systemd
Pornirea manuală a serverului VNC nu este potrivită pentru utilizare în producție, așa că vom configura un serviciu de sistem. Comenzile se execută în numele root (folosim sudo). Mai întâi, creăm un nou fișier unitate pentru serverul nostru:
sudo nano /etc/systemd/system/vncserver@.serviceSimbolul @ în nume permite transmiterea unui argument pentru configurarea serviciului. În cazul nostru, acesta specifică portul de afișare VNC. Fișierul unității constă din mai multe secțiuni:
[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.targetApoi, trebuie să notificăm systemd despre apariția noului fișier și să-l activăm:
sudo systemctl daemon-reload
sudo systemctl enable vncserver@1.serviceNumărul 1 din nume stabilește numărul ecranului.
Oprim serverul VNC, îl pornim ca serviciu și verificăm starea:
# от имени пользователя vnc
vncserver -kill :1# с привилегиями суперпользователя
sudo systemctl start vncserver@1
sudo systemctl status vncserver@1Dacă serviciul funcționează, ar trebui să obținem un rezultat similar.

Conectarea la birou
Configurarea noastră nu folosește criptarea, așadar pachetele de rețea pot fi interceptate de intruși. De asemenea, în serverele VNC se găsesc destul de frecvent , așa că nu este recomandat să le expunem la accesul din Internet. Pentru o conectare sigură pe computerul local, trebuie să împachetăm traficul într-un tunel SSH, iar apoi să configurăm clientul VNC. Pe Windows, se poate folosi un client SSH grafic (de exemplu, PuTTY). Pentru securitate, TigerVNC pe server ascultă doar localhost și nu este accesibil direct din rețelele publice:
sudo netstat -ap |more 
În Linux, FreeBSD, OS X și alte sisteme de operare de tip UNIX, tunelul de pe computerul client se face cu ajutorul utilitarului ssh (pe serverul VNC trebuie să fie pornit sshd):
ssh -L 5901:127.0.0.1:5901 -C -N -l vnc vnc_server_ipOpțiunea -L leagă portul 5901 al conexiunii de la distanță de portul 5901 de pe localhost. Opțiunea -C activează compresia, iar -N îi indică utilitarului ssh că nu este necesar să execute o comandă la distanță. Opțiunea -l specifică loginul pentru conectarea la sistemul de la distanță.
După configurarea tunelului pe computerul local, trebuie să porniți clientul VNC și să stabiliți conexiunea cu gazda 127.0.0.1:5901 (localhost:5901), folosind parola specificată anterior pentru accesul la serverul VNC. Acum putem interacționa în siguranță printr-un tunel criptat cu mediul de birou XFCE pe VPS. În captură de ecran, în emulatorul de terminal, este pornit utilitarul top pentru a arăta consumul minim de resurse computaționale de către mașina virtuală. Totul depinde acum de aplicațiile utilizatorului.

Instalarea și configurarea serverului VNC în Linux se poate face practic pe orice VPS. Nu sunt necesare configurații scumpe și consumatoare de resurse cu emularea adapterului video sau achiziționarea de licențe comerciale pentru software. Pe lângă varianta de serviciu de sistem pe care am discutat-o, există și alte opțiuni: pornire în modul demonic (prin /etc/rc.local) la încărcarea sistemului sau la cerere prin inetd. Ultima variantă este interesantă pentru crearea de configurații multi-utilizator. Superserverul de internet va porni serverul VNC și va conecta clientul, iar serverul VNC va crea un nou ecran și va începe o sesiune. Pentru autentificare, se poate utiliza un manager grafic de afisare (de exemplu, ), iar după deconectarea clientului, sesiunea va fi închisă, iar toate programele care lucrau cu ecranul vor fi încheiate.
Sursa: habr.com
