Hlavní navigace

VNC a Linux: vzdálená plocha

2. 1. 2009
Doba čtení: 6 minut

Sdílet

Ať už potřebujeme pouze pomoci někomu s problémem nebo nastavit klikátkem nějakou službu na serveru, budeme potřebovat protokol, který nám zobrazí, co se na druhém konci děje a doručí naše požadavky od nás na druhou stranu. K tomu se v Linuxu nejčastěji využívá VNC a dnes se podíváme, jak na něj.

Co to je?

VNC slouží k přístupu na plochu vzdáleného počítače. Může být použito i k vytvoření tenkých klientů, kdy se na terminál přenáší jen obraz a většina práce zůstává na hlavním serveru, kterému je terminál připojen. Mnohem častější využití je ale vzdálené ovládání domácího počítače nebo serveru. VNC využijí méně zkušení uživatelé, kteří si na příkazové řádce tolik nevěří a nebo třeba i zkušení administrátoři, kteří určitou činnost vykonávají raději na ploše nějakého desktopového prostředí. Zkrátka každý uživatel si svoji cestu najde a tento článek má sloužit jako návod, jak se poprat s jednou z nich.

Historie

První kód kolem VNC se objevil v laboratoři Olivetti & Oracle Research Lab, kterou později získalo AT&T a v roce 2002 uzavřelo. Původní nápad dostal Tristan Richardson a pod taktovkou Andyho Hartera se tým osmi lidí pustil do návrhu a implementace. Před uzavřením laboratoře dala část vývojového týmu dohromady program RealVNC a ten pak uvolnili ve freeware i komerční licenci.

VNC používá protokol RFB, který se stal natolik populární v open source světě, že dnes existuje řada možností, jak ho na Linuxu použít. My se dnes podíváme na programy X11vnc a TightVNC.

Princip

U VNC se využívá způsobu připojení klient-server. Server sdílí svůj výstup a klient se k němu připojuje. K jednomu serveru a dokonce i k jednomu virtuálnímu monitoru může být připojeno několik klientů najednou. V úvodní komunikaci se obě strany dohodnou na způsobu kódování komunikace a poté si začnou vyměňovat data. Ten nejjednodušší způsob kódování, který také podporují všichni klienti, je odesílání malých obdélníků se změněnou oblastí.

Jako první pošle server klientovi celkový obraz plochy a následně po každé změně, ať už se jedná o kurzor myši nebo celé nové okno, odešle „postižený“ obdélník. Jedná se o nejjednodušší způsob kódování a při změně velké plochy roste velmi rychle zatížení linky. Proto různé implementace přicházejí s vlastními způsoby kódování pro odstranění podobných neduhů.

Největším z celého protokolu je jeho „nebezpečnost“. Data včetně přístupového hesla, které lze nastavit, cestují nezašifrovaným kanálem a díky tomu lze komunikaci jednoduše odposlechnout. Některé implementace přidávají i šifrování, ale nám bude stačit použití SSH tunelu.

Možnosti v Linuxu

X11vnc

Pokud se rozhodneme použít VNC pro přístup na domácí počítač, bude se nám hodit spíše připojení k aktuálnímu sezení. K tomu použijeme nejlépe program X11vnc, který s minimální péčí udělá to, co od něj očekáváme. Po spuštění se napojí na X server a spustí VNC server, přes který se do sezení dostaneme. Jediné, co je potřeba mít dobře nastavené, je proměnná prostředí DISPLAY na hodnotu našeho displaye. Většinou tato hodnota bývá „:0“.

X11vnc umí šifrovat spojení sám. Obsahuje množství voleb, ale nám budou stačit jen některé. Takto si vytvoří zašifrovaný VNC server napojení na aktuální sezení.

cx@godie ~ $ x11vnc -ssl -unixpw cx -display :0 

Pokud vynecháme všechny parametry, server se nahodí také, ale bez jakéhokoli zabezpečení.

TightVNC

Zajímavější variantou je třeba TightVNC. Ten umí vytvořit na stroji několik samostatných sezení, ke kterým mohou vzdáleně přistupovat různí uživatelé. Nevýhodou je absence autentizace přes PAM, ale pokud si tento nedostatek odmyslíme, bude nám tento VNC server sloužit přesně tak, jak potřebujeme.

U TightVNC nejsou k dispozici žádné init skripty, a tak distribuce řeší konfiguraci svou cestou. Začneme nahozením a shozením VNC serveru:

cx@godie ~ $ vncserver

New 'X' desktop is godie:2

Starting applications specified in /home/cx/.vnc/xstartup
Log file is /home/cx/.vnc/godie:2.log

cx@godie ~ $ vncserver -kill :2
Killing Xvnc process ID 30268 

Spuštěním programu vncserver se nahodí VNC server na nejbližším nevyužitém display. Sezení, na které koukáme je většinou :0, takže náš VNC server bude na :1. Bude se jednat o naprosto separátní plochu.

Než začneme s podobnými pokusy, musíme nastavit VNC heslo.

cx@godie ~ $ vncpasswd
Using password file /home/cx/.vnc/passwd
Password: 

To se uloží do „~/.vnc/passwd“. V tomto adresáři najdeme také řadu dalších souborů, které se hodí.

godie:1.log      log soubor pro sezení na display :1
godie:1.pid      PID se sezením na display :1
godie:2.log      log soubor pro sezení na display :2
godie:2.pid      PID se sezením na display :2
passwd           heslo pro přístup k VNC serveru
xstartup         skript, který se spustí po nahození sezení 

Každý uživatel tak má vlastní VNC server a spouští se pod jeho právy. Stejně tak si ho každý uživatel může vypnout. Některé distribuce řeší nahazování sami, např. Gentoo, na kterém mám VNC server rozchozený. V souboru /etc/conf.d/vnc najdeme kromě komentářů následující řádky:

cx@godie ~ $ cat /etc/conf.d/vnc
DISPLAYS="cx:1"
VNC_OPTS="-geometry 1024x600 -depth 16" 

Na prvním z nich vyplníme jméno uživatele a za dvojtečku číslo displaye, na kterém chceme spustit jeho VNC server. Více uživatelů oddělíme mezerou. O řádek níž doplníme informace k velikosti obrazovky a barevné hloubce, případně jiné parametry VNC serveru.

Než nastartujeme VNC server, ať už přes příkazovou řádku nebo vlastním či distribučním init skriptem, musíme u uživatelů vytvořit startovací skript, který spustí potřebné programy a hlavně správce oken.

Příklad s openboxem může vypadat třeba takto:

cx@godie ~ $ cat .vnc/xstartup
#!/bin/sh

xterm -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &
sh /home/cx/openbox/run.sh
nohup openbox 

Nejdříve spustíme xterm, minimálně se nám bude hodit při ladění našeho sezení. Pak spustíme skript, který spustí další programy. Ten může být stejný, jako používáte teď ve svém správci oken. Nakonec nahodíme nějakého správce oken. V tomto případě je to openbox, ale může se jednat o cokoli jiného.

Pokud máme nastavené heslo a startovací skript, nebrání nám nic v používání VNC serveru.

Šifrování

Zabezpečení přístupu k našemu vzdálenému počítači se dá řešit, jak už bylo řečeno, u samotného VNC serveru nebo např. přes SSH. Vyzkoušíme tedy tu univerzálnější a bezpečnější cestu přes SSH. Princip je takový, že si zpřístupníme port vzdáleného počítače, na kterém máme účet, na lokálním počítači. Toto přesměrování bude šifrované, takže to, co vejde do lokálního portu, se zašifruje a vyleze rozšifrované na původním místě.

root_podpora

cx@godie ~ $ ssh -L 55901:10.1.3.57:5901 10.1.3.57 

Tímto jsme zpřístupnili port 5901 stroje 10.1.3.57 na lokálním stroji na portu 55901. Místo 55901 můžeme použít i 5901, ale pro odlišení jsem vybral tyto. Když je spojení vytvořeno, můžeme se připojit zabezpečeně i s klientem, který zabezpečení nepodporuje. Tato můžeme tunelovat většinu běžných služeb, které používáme.

cx@delorean:~$ vncviewer localhost::5901
Connected to RFB server, using protocol version 3.8
Enabling TightVNC protocol extensions
Performing standard VNC authentication
Password:
Authentication successful
Desktop name "cx's X desktop (godie:1)"
[...] 

Závěr

VNC se dá využít mnoha způsoby. Výuka, kooperace několika lidí, tencí klienti, hlídání dětí atd. Každopádně se ani na rychlých linkách nedá očekávat, že by VNC mělo stejné odezvy, jako když sedíme přes monitorem. Je potřeba si zkusit různé způsoby kódování (volba -encodings u programu vncviewer) a poté se rozhodnout, jestli to má pro vás smysl nebo ne.

Odkazy

Byl pro vás článek přínosný?

Autor článku

Adam Štrauch je redaktorem serveru Root.cz a svobodný software nasazuje jak na desktopech tak i na routerech a serverech. Ve svém volném čase se stará o komunitní síť, ve které je již přes 100 členů.