Hlavní navigace

VNC a Linux: vzdálená plocha

Adam Štrauch 2. 1. 2009

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ě.

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

Našli jste v článku chybu?

5. 1. 2009 14:27

Lael Ophir (neregistrovaný)
Problém je v tom, že X11 protokol vyžaduje spoustu zbytečných round tripů, kdežto RDP je nepotřebuje. Při stejné latency sítě má tedy RDP výrazně lepší odezvu. Navíc RDP používá cache fontů a bitmap na straně terminálu, plus kompresi streamu. Obraz se skládá s grafických primitiv cílového zařízení (stejně jako u lokálního zobrazování ve Windows ta primitiva záleží od schopnosti zařízení), ale pokud je výhodnější poslat místo grafických primitiv výslednou bitmapu, tak se pošle ta bitmapa. Přibliž…

4. 1. 2009 22:46

Lael Ophir (neregistrovaný)
X11 pravěk, který používá network stack a naprosto příšerný protokol i pro zobrazení na lokálním stroji. X11 pravěk, který se stará jen o zobrazení na obrazovce, a to ještě mizerně. X11 pravěk, který se po odpojení session neumí k ní znovu připojit. Pravěk, který má proti RDP neskutečně veliké požadavky na propustnost a latency sítě. Upřímně doufám, že MS nikdy ničeho podobně hrozného nedosáhne ;)
Podnikatel.cz: Babiše přesvědčila 89letá podnikatelka?!

Babiše přesvědčila 89letá podnikatelka?!

Podnikatel.cz: Přehledná titulka, průvodci, responzivita

Přehledná titulka, průvodci, responzivita

DigiZone.cz: Recenze Westworld: zavraždit a...

Recenze Westworld: zavraždit a...

Vitalia.cz: To není kašel! Správná diagnóza zachrání život

To není kašel! Správná diagnóza zachrání život

Vitalia.cz: Pečete cukroví a zbyl vám bílek?

Pečete cukroví a zbyl vám bílek?

Lupa.cz: Seznam mění vedení. Pavel Zima v čele končí

Seznam mění vedení. Pavel Zima v čele končí

Měšec.cz: Jak vymáhat výživné zadarmo?

Jak vymáhat výživné zadarmo?

Lupa.cz: Insolvenční řízení kvůli cookies? Vítejte v ČR

Insolvenční řízení kvůli cookies? Vítejte v ČR

Podnikatel.cz: Podnikatelům dorazí varování od BSA

Podnikatelům dorazí varování od BSA

Podnikatel.cz: Babiš: E-shopy z EET možná vyjmeme

Babiš: E-shopy z EET možná vyjmeme

Měšec.cz: U levneELEKTRO.cz už reklamaci nevyřídíte

U levneELEKTRO.cz už reklamaci nevyřídíte

Podnikatel.cz: Víme první výsledky doby odezvy #EET

Víme první výsledky doby odezvy #EET

Lupa.cz: Google měl výpadek, nejel Gmail ani YouTube

Google měl výpadek, nejel Gmail ani YouTube

120na80.cz: Boreliózu nelze žádným testem prokázat

Boreliózu nelze žádným testem prokázat

Lupa.cz: Teletext je „internetem hipsterů“

Teletext je „internetem hipsterů“

Vitalia.cz: Paštiky plné masa ho zatím neuživí

Paštiky plné masa ho zatím neuživí

Lupa.cz: Proč firmy málo chrání data? Chovají se logicky

Proč firmy málo chrání data? Chovají se logicky

Podnikatel.cz: EET: Totálně nezvládli metodologii projektu

EET: Totálně nezvládli metodologii projektu

Vitalia.cz: Mondelez stahuje rizikovou čokoládu Milka

Mondelez stahuje rizikovou čokoládu Milka

DigiZone.cz: ČT má dalšího zástupce v EBU

ČT má dalšího zástupce v EBU