Někteří uživatelé si pronajímají relativně levné VPS s Windows pro spuštění služby vzdálených pracovních ploch. Totéž lze udělat na Linuxu bez potřeby umístění vlastní hardwarové infrastruktury v datovém centru nebo pronájmu dedikovaného serveru. Někdo potřebuje známé grafické rozhraní pro testování a vývoj nebo vzdálenou plochu s vysokou šířkou pásma pro práci z mobilních zařízení. Existuje spousta možností použití systému Virtual Network Computing (VNC) založeného na protokolu Remote FrameBuffer (RFB). V tomto krátkém článku vám ukážeme, jak jej nastavit na virtuálním stroji s jakýmkoli hypervisorem.
Obsah:
Výběr VNC serveru
Služba VNC může být integrována do virtualizačního systému, přičemž hypervisor ji propojí s emulovanými zařízeními a žádné další nastavení nebude potřeba. Tato možnost předpokládá značné režijní náklady a je podporována jen několika poskytovateli — i v méně náročné implementaci, kdy je místo emulace skutečného grafického zařízení virtuální stroji předávána zjednodušená abstrakce (framebuffer). Někdy se VNC-server váže na běžící X-server, ale tento způsob se více hodí pro přístup k fyzickému stroji, zatímco na virtuálním vytváří řadu technických problémů. Nejjednodušší je nainstalovat VNC-server se zabudovaným X-serverem. Nevyžaduje fyzické zařízení (grafickou kartu, klávesnici a myš) ani jejich emulaci pomocí hypervisoru, a proto je vhodný pro jakýkoli typ VPS.
Instalace a konfigurace
Potřebujeme virtuální stroj s Ubuntu Server 18.04 LTS v základní konfiguraci. V oficiálních repozitářích tohoto distribuce je k dispozici několik VNC serverů: , , a další. Rozhodli jsme se pro TigerVNC — aktuální fork developerem nepodporovaného TightVNC. Nastavení ostatních serverů se provádí podobným způsobem. Je také nutné vybrat prostředí pracovní plochy: optimální variantou je podle našeho názoru XFCE kvůli relativně nízkým nárokům na výpočetní zdroje. Ti, kteří chtějí, mohou nainstalovat jiný DE nebo WM: to závisí na osobních preferencích, nicméně výběr softwaru přímo ovlivňuje potřebu operační paměti a výpočetních jader.

Instalace pracovního prostředí se všemi závislostmi se provádí následujícím příkazem:
sudo apt-get install xfce4 xfce4-goodies xorg dbus-x11 x11-xserver-utilsDále je nutné nainstalovat server VNC:
sudo apt-get install tigervnc-standalone-server tigervnc-commonSpouštět jej s právy superuživatele — špatný nápad. Vytvoříme uživatele a skupinu:
sudo adduser vnc 
Přidáme uživatele do skupiny sudo, aby mohl vyřešit administrativní úkoly. Pokud to není nutné, tento krok lze přeskočit:
sudo gpasswd -a vnc sudoV dalším kroku je třeba spustit server VNC s privilegii uživatele vnc, aby se vytvořilo bezpečné heslo a konfigurační soubory v adresáři ~/.vnc/. Délka hesla může být od 6 do 8 znaků (přebytečné budou oříznuty). Pokud je to nutné, lze také nastavit heslo pouze pro prohlížení, tedy bez přístupu k klávesnici a myši. Následující příkazy se provádějí jménem uživatele vnc:
su - vnc
vncserver -localhost no 
Ve výchozím nastavení protokol RFB používá rozsah TCP portů od 5900 do 5906 — to jsou tzv. porty obrazovky, z nichž každý odpovídá obrazovce X serveru. Tyto porty jsou přiřazeny obrazovkám od :0 do :6. Náš spuštěný instance serveru VNC naslouchá portu 5901 (obrazovka :1). Další instance mohou běžet na jiných portech s obrazovkami :2, :3 atd. Před dalším nastavením je třeba server zastavit:
vncserver -kill :1Příkaz by měl vypsat přibližně tuto zprávu: „Usmrcení Xtigervnc proces ID 18105… úspěch!‘.
Při spuštění TigerVNC vykonává skript ~/.vnc/xstartup pro nastavení konfiguračních parametrů. Vytvoříme si vlastní skript a předtím uložíme zálohu toho stávajícího, pokud existuje:
mv ~/.vnc/xstartup ~/.vnc/xstartup.b
nano ~/.vnc/xstartupSezení pracovního prostředí XFCE je spuštěno následujícím skriptem xstartup:
#!/bin/bash
unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS
xrdb $HOME/.Xresources
exec /usr/bin/startxfce4 &Příkaz xrdb je nutný, aby systém VNC přečetl soubor .Xresources v domovském adresáři. Tam může uživatel definovat různé parametry grafického desktopu: rendering písma, barvy terminálu, motivy kurzoru atd. Skript je třeba učinit spustitelným:
chmod 755 ~/.vnc/xstartupTímto je nastavení serveru VNC dokončeno. Pokud ho spustíte příkazem vncserver -localhost no (jménem uživatele vnc), můžete se připojit se zadaným heslem a uvidíte tuto scénu:

Spuštění služby prostřednictvím systemd
Manuální spuštění VNC serveru není příliš vhodné pro provoz, proto nastavíme systémovou službu. Příkazy se vykonávají pod uživatelským jménem root (používáme sudo). Nejdříve vytvoříme nový jednotkový soubor pro náš server:
sudo nano /etc/systemd/system/vncserver@.serviceSymbol @ v názvu umožňuje předávat argument pro konfiguraci služby. V našem případě určuje port displeje VNC. Jednotkový soubor se skládá z několika sekcí:
[Unit]
Description=TigerVNC server
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.targetPoté je potřeba upozornit systemd na nově vytvořený soubor a aktivovat ho:
sudo systemctl daemon-reload
sudo systemctl enable vncserver@1.serviceČíslo 1 v názvu určuje číslo obrazovky.
Zastavíme VNC server, spustíme ho jako službu a zkontrolujeme stav:
# от имени пользователя vnc
vncserver -kill :1# с привилегиями суперпользователя
sudo systemctl start vncserver@1
sudo systemctl status vncserver@1Pokud služba běží, měli bychom obdržet přibližně takový výstup.

Připojení k pracovní ploše
Naše konfigurace nepoužívá šifrování, takže síťové pakety mohou být zachyceny útočníky. Navíc se na VNC serverech poměrně často , takže je není dobré otevírat pro přístup z internetu. Pro bezpečné připojení z místního počítače je třeba zabalit provoz do SSH tunelu a poté nastavit VNC klienta. Na Windows lze použít grafický SSH klient (například PuTTY). Pro zajištění bezpečnosti TigerVNC na serveru naslouchá pouze localhostu a není přímo dostupný z veřejných sítí:
sudo netstat -ap |more 
Na Linuxu, FreeBSD, OS X a dalších UNIX-podobných OS se tunel z klientského počítače provádí pomocí utilitky ssh (na VNC serveru musí běžet sshd):
ssh -L 5901:127.0.0.1:5901 -C -N -l vnc vnc_server_ipVolba -L přiřazuje port 5901 vzdáleného připojení k portu 5901 na localhostu. Volba -C povoluje kompresi, a -N oznámí utilitě ssh, že není třeba vykonávat vzdálený příkaz. Volba -l určuje přihlášení pro vzdálený přístup.
Po nastavení tunelu na místním počítači je třeba spustit klienta VNC a navázat spojení s hostitelem 127.0.0.1:5901 (localhost:5901) pomocí dříve zadaného hesla pro přístup k serveru VNC. Nyní můžeme bezpečně komunikovat přes šifrovaný tunel s grafickým prostředím pracovního stolu XFCE na VPS. Na snímku obrazovky v emulátoru terminálu je spuštěn nástroj top, který ukazuje zanedbatelnou spotřebu výpočetních zdrojů virtuálním strojem. Dále už vše záleží na uživatelských aplikacích.

Server VNC v Linuxu lze nainstalovat a nastavit téměř na jakémkoli VPS. K tomu nejsou potřeba nákladné a výpočetně náročné konfigurace s emulací video adaptéru nebo nákup komerčních licencí na software. Kromě námi zvažované varianty systémové služby existují i další: spuštění v režimu démona (přes /etc/rc.local) při startu systému nebo na požádání přes inetd. Druhá varianta je zajímavá pro vytváření vícero uživatelských konfigurací. Internetový superserver spustí server VNC a naváže spojení s klientem, přičemž VNC server vytvoří novou obrazovku a zahájí relaci. Pro autentizaci uvnitř ní lze použít grafický display manager (například, ), a po odpojení klienta bude relace ukončena a všechny běžící programy na obrazovce budou uzavřeny.
Zdroj: habr.com
