ubuntuusers.de

Hinweis: Dies ist ein statischer Snapshot unseres Wikis vom 25. März 2013 und kann daher nicht bearbeitet werden. Der aktuelle Artikel ist unter wiki.ubuntuusers.de zu finden.
WikiVNC

VNC

Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:

Dieser Artikel ist größtenteils für alle Ubuntu-Versionen gültig.

Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:

Virtual Network Computing (kurz VNC) ist eine Software, die den Bildschirminhalt eines entfernten Rechners (auf dem ein VNC-Server läuft) auf einem lokalen Rechner (auf dem ein VNC-Viewer läuft) anzeigt und im Gegenzug Tastatur- und Mausbewegungen des lokalen Rechners an den entfernten Rechner sendet. Damit kann man auf einem entfernten Rechner arbeiten, als säße man direkt davor. Unter Windows ist diese Funktion als Remotedesktop bekannt und ist besonders hilfreich, um einem Bekannten bei seinen Rechnerproblemen zu helfen, ohne vor Ort sein zu müssen. Es werden auch z.B. viele Dienstleistungen im IT-Bereich über das VNC-Protokoll ausgeführt.

Die großen Desktopumgebungen KDE und GNOME bringen komfortable Werkzeuge mit, um den eigenen Desktop über VNC freizugeben oder auf einen anderen Rechner zuzugreifen. Diese lassen sich einfach über eine grafische Benutzeroberfläche bedienen. Alternativ kann man aber auch einen eigenen VNC-Server installieren oder von der Konsole einen VNC-Viewer starten.

Alternativen sind das kommerzielle NX und FreeNX.

Achtung!

In puncto Sicherheit ist zu beachten, dass VNC vor allem für den Einsatz in einem internen Netzwerk konzipiert ist: Von Haus aus wird die Verbindung zwischen Server und Client nicht verschlüsselt. Spätestens wenn über VNC auch administrative Tätigkeiten durchgeführt werden, ist eine ungesicherte VNC-Verbindung über das Internet ein großes Risiko: Ein Angreifer könnte beispielsweise an das unverschlüsselt übertragene Administratorpasswort gelangen. Deswegen soll in diesem Artikel auch die Möglichkeit einer verschlüsselten Verbindung angesprochen werden.

Der Server

Dies ist der Rechner, auf dessen Desktop zugegriffen werden soll.

Hinweis:

Der VNC-Server lauscht auf TCP-Port 590x - wobei x für die Nummer des Displays steht. Dies ist in der Regel 0. Falls der Server-Rechner hinter einer Firewall (z.B. ein Hardware-Router) steht, muss der entsprechende TCP-Port (also z.B. 5900) weitergeleitet werden.

GNOME

./vnc_vino-preferences.png

GNOME bringt einen eigenen VNC-Server namens Vino mit. Dieser ist bei der Installation von Ubuntu/GNOME schon dabei, kann aber auch über das Paket

  • vino

Wiki/Vorlagen/Installbutton/button.png mit apturl

Paketliste zum Kopieren:

sudo apt-get install vino 

sudo aptitude install vino 

nachinstalliert [1] werden. Die Konfiguration und das Starten des Servers erfolgt durch das Programm vino-preferences über

  • "System -> Einstellungen -> Entfernter Bildschirm"

in Ubuntu 11.10 findet man die Einstellungen über:

  • "Dash -> Freigabe der Arbeitsfläche"

Wenn unter

  • "System -> Einstellungen -> Startprogramme"

"Entfernter Desktop" nicht aktiviert ist, wird der Vino-Server nicht gestartet. Den Server kann man auch manuell über das Terminal mit

/usr/lib/vino/vino-server 

starten.

Beim Xfce kann man den Vino-Server über

  • "Einstellungen -> Einstellungen -> Sitzung und Startverhalten -> Automatisch gestartete Anwendungen -> hinzufügen"

zu den Startprogrammen hinzufügen.

Unter dem Punkt "Sicherheit" sollte mindestens eine der beiden Sicherheits-Optionen aktiviert sein.

Von Ubuntu "Hardy Heron" 8.04 bis "Lucid Lynx" gibt es den Reiter "Fortgeschritten". Hier lassen sich weitere Einstellungen vornehmen. So kann man beispielsweise den Port, an dem der VNC-Server lauschen soll, ändern.

Ab Ubuntu "Lucid Lynx" 10.04 steht die Funktion "[ ] Netzwerkeinstellungen so ändern, dass Verbindungen akzeptiert werden" zur Verfügung. Falls man eine vertrauensvolle Person gebeten hat, einem per VNC (Remotedesktop) bei einem PC-Problem zu helfen, so kann man hiermit Ubuntu anweisen, automatisch die für VNC benötigte Portweiterleitung per UPNP im Router einzurichten.

Bei einigen Grafikkartentreibern, z.B. proprietäre von Nvidia und ATI, treten im Zusammenhang mit Vino und eingeschalteten 3D-Effekten Probleme auf. Meist bekommt der VNC-Client dann nur beim Verbindungsaufbau ein Bildschirmfoto des Servers übertragen, dieses verändert sich aber bei Aktionen nicht mehr (Maus- und Tastatureingaben werden also "blind" vom Client zum Server übertragen). Als Abhilfe können im Konfigurationseditor die 3D-Effekte abgeschaltet werden, siehe diese Anleitung {en}. Alternativ kann für private Zwecke TeamViewer eingesetzt werden.

KDE

./krfb.png

Auch KDE bringt einen solchen Server in der Standardinstallation mit. Alternativ kann er über das Paket

  • krfb

Wiki/Vorlagen/Installbutton/button.png mit apturl

Paketliste zum Kopieren:

sudo apt-get install krfb  

sudo aptitude install krfb  

nachinstalliert [1] werden. Nach der Installation ist er unter

  • "K-Menü -> Internet -> Krfb - Arbeitsfläche freigeben"

zu finden. Um den Server zu starten, muss eine Einladung ausgesprochen werden. Im nächsten Schritt erhält man die IP, auf der der Server läuft und ein Passwort. Beides wird von einem Client benötigt, der sich verbinden möchte.

Bei diesem Server wird keine neue Session eröffnet, sondern die bestehende genutzt. Dadurch ist es möglich, in den laufenden Betrieb eines anderen Rechners "einzugreifen", obwohl ein Benutzer angemeldet ist.

Manuelle Einrichtung

Experten-Info:

Auf Systemen mit Fenstermanager, die keinen eigenen VNC-Server mitbringen, kann ein solcher zusätzlich installiert werden. Auch wenn die hauseigenen VNC-Server für bestimmte Anforderungen nicht ausreichen, kann dieser Weg gewählt werden. Dieser Abschnitt richtet sich vor allem an fortgeschrittene Benutzer. Einsteiger sollten der Einfachheit halber auf die oben genannten Möglichkeiten zurückgreifen.

Installation

Es gibt einige Implementierungen von VNC Servern. Eine der folgenden kann gewählt werden:

RealVNC

Die in den Paketquellen enthaltene letzte freie Version 4.x von RealVNC ist von Anfang 2006. Folgende Pakete müssen installiert [1] werden:

  • vnc4server (universe [2]))

  • vnc-java (multiverse, optional für Java-Clienten )

Wiki/Vorlagen/Installbutton/button.png mit apturl

Paketliste zum Kopieren:

sudo apt-get install vnc4server vnc-java 

sudo aptitude install vnc4server vnc-java 

TightVNC

Alternativ kann man auch TightVNC {en} nutzen. TightVNC versucht VNC zu optimieren und neue Funktionen, Verbesserungen und Optimierungen gegenüber dem original VNC zu bieten. So eignet sich TightVNC besser, wenn der VNC-Server über DSL am Internet angebunden ist. Die neue Version von TightVNC gibt es nur für Windows. Die in den Paketquellen vorhandene alte Version bereitet teilweise Probleme (bspw. Abstürze wenn vom Vollbildmodus zurückgeschalten wird). TightVNC 1.x kann man aus den Paketquellen installieren.

  • tightvncserver (universe [2] )

  • xtightvncviewer (universe )

  • tightvnc-java (universe, optional für Java-Clienten )

Wiki/Vorlagen/Installbutton/button.png mit apturl

Paketliste zum Kopieren:

sudo apt-get install tightvncserver xtightvncviewer tightvnc-java 

sudo aptitude install tightvncserver xtightvncviewer tightvnc-java 

TigerVNC

TigerVNC {en} ist ein Fork von TightVNC und wird aktuell (2012) gepflegt.

Hinweis!

Zusätzliche Fremdquellen können das System gefährden.


Anmerkung: TigerVNC ist noch nicht in den offiziellen Paketquellen enthalten und muss daher von Fremquellen installiert werden. Dazu muss eine zusätzliche Software Paketquelle eingebunden werden:

sudo sh -c "wget -O - http://winswitch.org/gpg.asc | apt-key add -"
sudo sh -c "echo deb http://winswitch.org/ `lsb_release -cs` main > /etc/apt/sources.list.d/winswitch.list"
sudo apt-get update 

Danach können die Pakete installiert werden.

  • tigervnc-server

  • tigervnc-viewer

Wiki/Vorlagen/Installbutton/button.png mit apturl

Paketliste zum Kopieren:

sudo apt-get install tigervnc-server tigervnc-viewer 

sudo aptitude install tigervnc-server tigervnc-viewer 

Anpassungen für Ubuntu-Server

Falls der VNC-Server auf einem Ubuntu-Server installiert werden soll, muss zusätzlich folgendes Paket installiert werden.

  • xfonts-base

Wiki/Vorlagen/Installbutton/button.png mit apturl

Paketliste zum Kopieren:

sudo apt-get install xfonts-base 

sudo aptitude install xfonts-base 

VNC, TightVNC sowie TigerVNC teilen sich die selben Konfigurationsdateien.

Konfiguration

Damit eine Verbindung hergestellt werden kann, muss noch im Terminal [3] ein Passwort eingestellt werden. Es ist darauf zu achten, einen lokalen Benutzer zu verwenden.

vncpasswd 
Desktopumgebung

Möchte man, dass die komplette Desktopumgebung - also GNOME oder KDE - des Benutzers, der VNC startet, geladen wird, so kann man dies in der Konfigurationsdatei /etc/vnc.conf des VNC-Dienstes für alle Benutzer des Systems definieren. Ist die Datei /etc/vnc.conf nicht vorhanden, muss sie mit root-Rechten aus /usr/share/doc/tightvncserver/examples/vnc.conf.gz bzw. /usr/share/doc/vnc4server/examples/vnc.conf.gz nach /etc/vnc.conf extrahiert werden.

sudo cp /usr/share/doc/vnc4server/examples/vnc.conf.gz /etc/
sudo gunzip -d /etc/vnc.conf.gz 

Anschließend muss die Zeile

# $vncStartup points to a script that will be started at the very beginning.
$vncStartup = "/etc/X11/Xsession";

einkommentiert werden. Von da an startet automatisch die Desktopumgebung, wenn ein Benutzer einen VNC-Server startet. Alternativ kann dies auch jeder Benutzer für sich selbst festlegen. Dazu muss man in der ~/.vnc/xstartup im Homeverzeichnis Folgendes eintragen

1
2
3
#!/bin/sh
unset SESSION_MANAGER
exec /etc/X11/Xsession

Fenstermanager

Oftmals soll nicht eine komplette Desktopumgebung geladen werden; dies würde recht viel Last erzeugen, nur damit eine Desktopumgebung bereit steht, deren Möglichkeiten kaum genutzt werden. Um dem VNC-Server einen bestimmten Fenstermanager zuzuweisen, muss die Datei ~/.vnc/xstartup editiert werden [4]. Im Original sieht die Datei so aus:

1
2
3
4
5
6
#!/bin/sh
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
xsetroot -solid grey
vncconfig -iconic &
x-terminal-emulator -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &
x-window-manager &

Um einen bestimmten Fenstermanager zu starten, ersetzt man einfach x-window-manager. Natürlich muss der Fenstermanager installiert sein. Man kann dort zum Beispiel gdm oder fluxbox eintragen. Mit "&" kann man weitere Programme hinzufügen, die automatisch mit gestartet werden sollen. Das Ganze sieht danach zum Beispiel so aus:

1
2
3
x-terminal-emulator -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &
fluxbox &
firefox &

Hier werden der Fenstermanager Fluxbox und der Webbrowser Firefox gestartet.

Im Beispiel unten wird eine LXDE-Sitzung mit speziellen Optionen für vncconfig gestartet:

1
2
3
vncconfig -sendPrimary=0 -nowin &
x-terminal-emulator -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &
startlubuntu

Der bisher undokumentierte Schalter -sendPrimary=0 schaltet die Option "Send primary selection to viewers" von vncconfig aus (die "primary selection" ist der von der Maus markierte Text), der Parameter -nowin versteckt das Fenster. Mit dem Befehl startlubuntu wird schlussendlich LXDE gestartet.

Starten und Stoppen

Um den VNC-Server zu starten, wird einfach folgender Befehl im Terminal [3] eingegeben (man sollte sich die angezeigte Displaynummer merken!):

# Für VNC und TigerVNC
vncserver
# Für tightvncserver
tightvncserver 

Der VNC-Server sollte nicht mit kill beendet werden. Unter Angabe der Displaynummer bietet der VNC-Server eine eigene Kill-Routine:

# Für VNC und TigerVNC
vncserver -kill :<Displaynummer>
# Für tightvncserver
tightvncserver -kill :<Displaynummer> 

VNC-Server bei jedem Bootvorgang starten

Um den VNC-Server bei jedem Booten des Rechners mitzustarten, empfiehlt sich die Erstellung eines Skripts, das in /etc/init.d/ gespeichert wird. Dazu mit Root-Rechten einen Editor [4] öffnen und dieses Skript, eine abgewandelte Version von linuxnetmag.org {de} , unter /etc/init.d/vncserver abspeichern.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#! /bin/sh
# Original: http://www.linuxnetmag.org/2011-03-17-eine-netzwerkinstallation-unter-suse-8-0
# Author: Guenther Zander <g.zander@hamburg.de>
#
# /etc/init.d/vncserver         this Script
# /usr/bin/vncserver                    Program
#

# Check for missing binaries
FOO_BIN=/usr/bin/vncserver
test -x $FOO_BIN || exit 5

# User, unter dem der VNC-Server ausgefuehrt wird
VNC_USER="<User>"
export VNC_USER

# Set HOME of User
HOME="<Home-Verzeichnis des verwendeten Users>"
export HOME

# Set ID for Connections
FOO_ID=1

case "$1" in
    start)
        echo -n "Starting Vnc-Server with Terminal-ID $FOO_ID "

        # Delete old PIDs
        rm -f $HOME/.vnc/$HOSTNAME:$FOO_ID.pid

        if [ -e $HOME/.vnc/$HOSTNAME:$FOO_ID.log ]; then
           cat $HOME/.vnc/$HOSTNAME:$FOO_ID.log >> /var/log/vncserver.log 2>&1
           rm -f $HOME/.vnc/$HOSTNAME:$FOO_ID.log
        fi

        sudo -u $VNC_USER -H $FOO_BIN :$FOO_ID 2>&1
        ;;
#
     stop)
        echo -n "Shutting down Vnc-Server "
        $FOO_BIN -kill :$FOO_ID 2>&1

        cat $HOME/.vnc/$HOSTNAME:$FOO_ID.log >> /var/log/vncserver.log 2>&1
        rm -f $HOME/.vnc/$HOSTNAME:$FOO_ID.log

        ;;
#
     restart)
        $0 stop
        $0 start
        ;;
#
    *)
        echo "Usage: $0 {start|stop|restart}"
        exit 1
        ;;
esac

Die Variable VNC_USER bestimmt den auszuführenden User, HOME bestimmt, unter welchem Verzeichnis die Konfiguration und Logs des VNC-Servers gespeichert werden und FOO_ID bestimmt die Terminal-ID des VNC-Servers. Diese Variablen müssen den eigenen Wünschen entsprechend noch angepasst werden.

Das Skript benötigt, bevor es genutzt werden kann, noch die richtigen Rechte:

sudo chown root:root /etc/init.d/vncserver
sudo chmod 0755 /etc/init.d/vncserver 

Damit der VNC-Server auch wirklich bei jedem Systemstart geladen und bei jedem Abschalten ordentlich heruntergefahren wird, muss das Skript mit

sudo update-rc.d vncserver defaults 

den Runlevels zugewiesen werden.

VNC per xinetd starten

Eine komfortable und ressourcensparende Variante, eine VNC-Session zu starten ermöglicht die Verwendung von xinetd (für Informationen zur Installation und Einrichtung siehe xinetd). Hierfür wird das Starten des VNC-Servers von xinetd übernommen.

Diese Methode benötigt kein "init-script" für den VNC-Server. Sollte bereits eines vorhanden sein, nimmt man den Server dazu einfach mit

sudo update-rc.d -f vncserver remove  

aus den Runlevels.

GDM konfigurieren

Um sich am System anzumelden, kann gdm (fast) genauso verwendet werden wie bei einer lokalen Authentifizierung. Damit dieser jedoch auch in einer Session mit Xvnc als X-Server startet, müssen noch ein paar Änderungen durchgeführt werden.

Dazu öffnet man mit einem beliebigen Texteditor mit Root-Rechten die Datei /etc/gdm/gdm.conf (bzw. /etc/gdm/gdm.conf-custom) und kommentiert folgende Zeile ein:

RemoteGreeter=/usr/lib/gdm/gdmlogin

Schließlich aktiviert man noch XDMCP, hierfür sucht man sich den Eintrag [xdmcp].

Hinweis:

XDMCP ist unter Ubuntu 10.04 nicht möglich - siehe GDM.

Einzelnes Fenster freigeben

Manchmal kann es sinnvoll sein nicht den gesamten Desktop sondern nur ein Fenster freizugeben. Dazu ist folgendes Vorgehen notwendig (s. auch Blogeintrag {en}). Dazu muss man zunächst die Fenster-ID des freizugebenden Fensters feststellen. Man startet das Programm

 xwininfo 

dabei ändert sich der Mausanzeiger. Nun klickt man auf das entsprechende Fenster und u.a. die Fenster ID wird ausgegeben. Anschließend kann nur das Fenster und nicht der gesamte Desktop freigegeben werde:

 x11vnc -id MyWindowId 

wobei MyWindowId durch den Hex-Code von xwininfo zu ersetzen ist. Wählt man als Fenster ID pick dann wird im Hintergrund automatisch xwininfo gestartet und man kann das zu exportierende Fenster durch einfache Auswahl anklicken:

 x11vnc -id pick 

Zusätzliche Optionen (bspw. -xkb -usepw -capslock -nodpms) für x11vnc können wie bei der Desktopvariante mit angegeben werden. Der Zugriff auf das Einzelfenster erfolgt wie zum Desktop mit Hilfe eines Clients. Falls eine Applikation exportiert werden soll, welche mehrere aus mehreren Einzelfenstern besteht (bspw. Gimp) empfiehlt sich die Option -appshare. Eine ausführlichere Anleitung findet sich in den man-pages von x11vnc.

 x11vnc -appshare -help 

Der Client

Der Client ist der Rechner, der auf den entfernten Desktop zugreift. Dies geschieht mittels eines VNC-Viewers.

GNOME

Remmina

Ab Ubuntu 11.10 wird Remmina empfohlen. Es ist standardmäßig installiert und lässt sich in Unity mit dem Begriff „Zugriff auf entfernte Arbeitsflächen“ starten.

Vinagre

./vinagre.png

Vinagre ist ein VNC-Client, der erstmals in Ubuntu Hardy Heron 8.04 integriert ist. Man findet das Programm im Menü unter

  • "Anwendungen -> Internet -> Betrachter für entfernte Desktops"

Vinagre kann dank einer Bedienoberfläche mit Tabs - ähnlich wie bei Webbrowsern - gleichzeitig mehrere Verbindungen mit verschiedenen VNC-kompatiblen Servern aufbauen. Diese können auch als Lesezeichen abgespeichert werden. Sollte der Zugang zu einem VNC-Server ein Passwort benötigen, so wird dieses im GNOME_Schlüsselbund gespeichert. Des weiteren kann Vinagre dank Avahi im lokalen Netzwerk nach verfügbaren VNC-Servern suchen. (siehe Vinagre)

Terminal Server Client

./vnc_tsclient.png

Für Verbindungen zu entfernten Rechnern bringt Ubuntu/GNOME das Programm tsclient mit, welches über das gleichnamige Paket

Wiki/Vorlagen/Installbutton/button.png mit apturl

Paketliste zum Kopieren:

sudo apt-get install tsclient 

sudo aptitude install tsclient 

installiert [1] werden kann und unter

  • "Anwendungen -> Internet -> Terminal Server Client"

zu finden ist. Dieses Programm erlaubt neben VNC auch Verbindungen über das "Remote Desktop Protocol" zu Windows-Servern.

Um eine Verbindung zu einem VNC-Server herzustellen, muss im Reiter "Allgemein" als Protokoll "VNC" ausgewählt werden. Der Rechnername ist die IP-Adresse bzw. der Hostname des Servers. Die anderen Felder können in der Regel freigelassen werden. Ein gegebenenfalls erforderliches Passwort wird nach dem Verbindungsaufbau abgefragt.

Falls das Protokoll "VNC" nicht auswählbar ist, muss das Paket

  • xvnc4viewer

Wiki/Vorlagen/Installbutton/button.png mit apturl

Paketliste zum Kopieren:

sudo apt-get install xvnc4viewer 

sudo aptitude install xvnc4viewer 

nach installiert werden [1].

FreeRDP

Eine weitere Alternative zum "Terminal Server Client" kann unter Umständen auch FreeRDP {en} sein. Das dazugehörige Paket heißt freerdp-x11 und ist bereits ab Ubuntu 10.10 in den offiziellen Paketquellen enthalten.

KDE

Um sich zu einem System zu verbinden, auf dem ein VNC-Server läuft, ist in der Standardinstallation von KDE bis Ubuntu 11.10 das Programm krdc enthalten.

./krdc.png Um es manuell zu installieren, wird das Paket

  • krdc

Wiki/Vorlagen/Installbutton/button.png mit apturl

Paketliste zum Kopieren:

sudo apt-get install krdc 

sudo aptitude install krdc 

benötigt [1]. Nach der Installation ist es unter

  • "K-Menü -> Internet -> Krdc - Verbindung zu Fremdrechner"

zu finden.

Neben VNC unterstützt es auch RDP (Remote Desktop Protocol) Verbindungen, wie sie beispielsweise bei Windows für die Desktopfreigabe benutzt werden.

Um eine Verbindung herzustellen muss in das Eingabefeld des Programms die IP-Adresse des Systems eingetragen werden, zu dem man sich verbinden möchte. Ist dieses ein VNC-Server, muss vor der IP vnc:/ eingetragen werden, handelt es sich um eine RDP-Freigabe, so ist es rdp:/ (Beispiel siehe Screenshot). Nach Klicken auf "Verbinden" wird versucht, das andere System zu erreichen; wurde ein Passwort vergeben, so muss es in das erscheinende Dialogfeld eingetragen und bestätigt werden.

Xfce

Benutzer von Xfce können Remmina als Client verwenden.

LXDE

Auch hier ist Remmina der Client der Wahl.

Konsole

Auf der Konsole steht der Befehl vncviewer aus dem Paket xvncviewer [1] zur Verfügung. Dieses ist bei einer Standardinstallation von Ubuntu bereits installiert. Die Verbindung zu einem VNC-Server kann mit dem Befehl

# Für VNC und TigerVNC
vncviewer host:display
# Für TightVNC
xtightvncviewer host:display {Optionen} 

hergestellt werden. host ist dabei der Hostname oder die IP-Adresse des Servers, display die Nummer des angesprochenen Displays - in der Regel 0. Ist ein Passwort erforderlich, wird es nach der Verbindungsherstellung abgefragt. Falls der vncviewer nicht aus einer Konsole heraus gestartet wird (sondern beispielsweise aus einem Skript), wird das Passwort in einem kleinen Eingabefenster eingegeben. Damit nicht mehrere Benutzer gleichzeitig auf den VNC-Server zugreifen können, kann im TightVNC Viewer die Option -noshare gesetzt werden

VNC über SSH

Die Verbindung zwischen VNC-Server und -Client ist standardmäßig nicht verschlüsselt und somit nicht für eine Übertragung über das Internet zu empfehlen. Um dennoch eine sichere Verbindung zu ermöglichen, kann man einen SSH-Tunnel für die Verschlüsselung benutzen. Voraussetzung hierfür ist, dass eine SSH-Verbindung zwischen Server und Client hergestellt werden kann.

Automatisch durch den VNC-Viewer

Der VNC-Viewer kann selbst einen SSH-Tunnel herstellen. Anschließend stellt er die Verbindung nicht zum Server her, sondern zu localhost, also dem eigenen Rechner:

vncviewer -via user@host localhost:0 

host steht dabei für die IP-Adresse oder den Hostname des Servers, user für den Benutzernamen, mit dem die Anmeldung auf dem Server erfolgen soll.

Manuell über SSH

Tunnel aufbauen

Alternativ kann man den Tunnel auch selbst auf dem Client-Rechner herstellen:

ssh -N -L 5900:localhost:5900 user@host 

VNC-Verbindung aufbauen

Anschließend kann man sich wie gewohnt verbinden; zu beachten ist aber, dass man nicht den Rechnernamen oder die IP des anderen Rechners, sondern localhost angibt, da SSH die Daten an den anderen Rechner weiterleitet.

vncviewer localhost:0 

Nun besteht eine gesicherte Verbindung zum VNC-Server.

Authentifizierung über Public-Keys

Damit oben genannte Methoden funktionieren, ist ein Benutzerkonto auf dem Rechner notwendig auf dem der VNC Server läuft. Eine Alternative besteht in der Benutzung von public-keys. Dazu ist ein ssh Schlüsselpaar notwenig, falls noch keins vorhanden ist, muss dieses wie im Artikel SSH beschrieben angelegt werden. Ob das Schlüsselpaar mit einer Passphrase geschützt wird, bleibt jedem selbst überlassen. Der sogenannte public-key wird standardmäßig in der Datei id_rsa.pub gespeichert. Der public-key muss auf dem Rechner auf dem der VNC-Server läuft in der Datei /home/user/.ssh/authorized_keys abgespeichert werden. Damit der Besitzer des public-key auch wirklich nur auf den VNC-Server Zugriff bekommt, müssen dessen Rechte in der Datei /home/user/.ssh/authorized_keys noch beschränkt werden (s.a. hier VNC {en}):

command="/bin/sleep 4294967295",no-agent-forwarding,no-pty,no-user-rc,no-X11-forwarding,permitopen="localhost:5900" <public key>

Danach hat der Besitzer des public-key durch eine der beiden oberen Methoden automatisch oder manuell Zugriff auf den VNC Server. Die Anmeldung muss dabei auch als Benutzer user erfolgen, da sonst nicht auf die Datei /home/user/.ssh/authorized_keys zugegriffen werden kann, in welche der public-key gespeichert wurde. Die Standardeinstellungen des ssh-Servers in /etc/ssh/sshd_config unter ubuntu unterstützen sowohl einen Login durch Passwort als auch durch public-keys, dadurch sind dort prinzipiell keine Änderungen notwendig.

VNC-Server auf lokale Verbindungen beschränken

Wenn die Verbindung zum VNC-Server über den SSH-Tunnel klappt, kann man noch einen Schritt weitergehen und den VNC-Server auf lokale Verbindungen beschränken. Damit wird die Benutzung des SSH-Tunnels erzwungen und Angreifer können sich nicht mehr direkt mit dem VNC-Server verbinden. TightVNC startet man dazu mit dem zusätzlichen Schalter -localhost:

tightvncserver -localhost 

Für Vino kann man die Einstellung wie folgt setzen (Information übernommen von vino):

Für Ubuntu 9.04 bis einschließlich 11.04:

gconftool -s /desktop/gnome/remote_access/network_interface lo --type string 

Für Ubuntu 11.10 und neuer:

gsettings set org.gnome.Vino network-interface lo 

VNC reverse connection

Diese Art der Verbindung ist hilfreich, wenn der Hilfesuchende keinerlei Netzwerkkenntnisse besitzt und zudem hinter einem Router sitzt. Die Einrichtung ist sehr einfach, da der Hilfesuchende nichts einzurichten hat außer einer Paketinstallation.

Hier werden nur drei mögliche Wege zu einer VNC reverse connection beschrieben - es gibt noch einige mehr.

Weg 1 - Gitso

Der einfachste Weg läuft über Gitso. Hier muss man am wenigsten einstellen und man hat einen fast automatisierten Weg bis auf die Einstellungen bei einem eventuell vorhandenen Router des Helfenden.

Gitso ist leider noch nicht in den Paketquellen enthalten und muss per Hand installiert werden. Wenn man Gitso ausprobieren will, kann man Weg 2 & 3 vernachlässigen.

Weg 2 - DynDNS

Der Helfende sollte sich vorab mit dem dem Thema DynDNS-Clients bzw. generell mit dem Thema DynDNS beschäftigt haben.

Man muss einen kostenlosen Account bei DynDNS {en} oder einem anderen Anbieter einrichten und darüberhinaus eine DynDNS besitzen. Zudem sollte der Helfende wissen, wie man sich, wenn man hinter einem Router sitzt, eine korrekte Portweiterleitung oder Portfreischaltung einrichtet. Meistens muss man - je nach Routermodell - Einstellungen für die DynDNS am Router vornehmen. Zu diesem Zwecke sollte man das Handbuch des Routers konsultieren. Wenn man diesen Weg beschreiten will, bitte unten weiterlesen unter "Weitere Schritte Weg 2 & 3"

Weg 3 - IP-Adress

Hier muss man keine DynDNS-Adresse einrichten, dafür hat man den Nachteil, dass man vor jeder Verbindung die IP des Helfenden (ggf. die seines Routers!) herausfinden muss - z.B. bei wieistmeineip.de {de}. Der Helfende muss dann jedesmal dem Hilfesuchenden mitteilen, wie die IP lautet. Dieser Umstand wird durch die DynDNS in Weg 2 umgangen. Der Helfer muss sich auch hier mit Portweiterleitung oder Portfreischaltung auseinandergesetzt haben, wenn er hinter einem Router sitzt, eine eventuelle DynDNS-Einrichtung am Router entfällt hier natürlich.

Weitere Schritte Weg 2 und 3

Folgende Pakete müssen installiert sein [1]:

beim Helfenden das Paket

  • xvnc4viewer

Wiki/Vorlagen/Installbutton/button.png mit apturl

Paketliste zum Kopieren:

sudo apt-get install xvnc4viewer 

sudo aptitude install xvnc4viewer 

beim Hilfesuchenden das Paket

  • x11vnc

Wiki/Vorlagen/Installbutton/button.png mit apturl

Paketliste zum Kopieren:

sudo apt-get install x11vnc 

sudo aptitude install x11vnc 

Nach der Installation und für jede weitere Verbindung muss der Helfende immer vor dem Hilfesuchenden, da sonst die Verbindung nicht aufgebaut werden kann, in seiner Konsole folgenden Befehl eingeben:

xvnc4viewer -listen 5500 

Der Helfer hört kontinuierlich auf Port 5500, der im Router freigeschaltet sein muss, ob jemand bei ihm anklopft. Der Hilfesuchende sollte dann anklopfen mit dem Befehl in seiner Konsole:

Für Weg 2

x11vnc -connect name.dyndns.org 

Für Weg 3

Zunächst muss der Helfer dem Hilfesuchenden seine aktuelle IP mitteilen. Diese kann er z.B. unter wieistmeineip.de {de} ermitteln. Dort wird gegebenenfalls die IP des Routers angezeigt; dies ist dann die richtige. Dann folgenden Befehl eingeben:

x11vnc -connect 88.77.145.104 

Die IP 88.77.145.104 ist nur eine Beispiel-IP und muss durch diejenige ersetzt werden, die der Helfer bei sich herausgefunden hat.

Nun sollte sich ein Fenster öffnen, auf dem der Helfer den Desktop des Hilfesuchenden sehen und steuern kann.

Weitere Tipps und Optionen

Anlegen eines Starters

Wenn die erste Verbindung steht, ist es meist praktisch, dem Hilfesuchenden einen Starter auf den Desktop zu legen, der den Befehl im Terminal für ihn ausführt. Oftmals werden Befehle im Terminal seitens des Hilfesuchenden vergessen, mit Tippfehlern eingegeben oder es besteht eine Hemmschwelle in der Benutzung des Terminals. Außerdem ist dieser Weg am wenigsten störanfällig.

Verkleinerte Darstellung ohne Rollbalken

Es ist zu empfehlen, sich den Desktop etwas verkleinert darstellen zu lassen, da der Desktop des Hilfesuchenden meistens nicht ganz auf den Bildschirm des Helfers passt. Das kann zwar zu minimalen Verzerrungen in der Darstellung führen, ist beim Arbeiten jedoch meist praktischer. Dazu sollte der Hilfesuchende zum Anklopfen folgenden Befehl mit der zusätzlichen Option -scale X/Y eingeben:

x11vnc -connect name.dyndns.org -scale 9/10 

beziehungsweise

x11vnc -connect 88.77.145.104 -scale 9/10 

Dadurch wird der Bildschirm des Hilfesuchenden vor der Übertragung auf 9/10 verkleinert. Statt 9/10 kann man jeden anderen Wert eingeben, z.B. 2/3, wenn der Desktop auf 2/3 verkleinert dargestellt werden soll.

Volle Farbdarstellung

Die aufgebaute Verbindung hat meist nur eine sehr geringe Farbdarstellung, damit der VNC möglichst wenige Daten übermitteln muss. Dies macht Sinn, weil die Verbindung meistens relativ langsam ist.

Will man sich alle Farben beim Hilfesuchenden anzeigen lassen, muss man die Option -FullColor beim Helfenden setzen. Entsprechend Weg 2 & 3 sieht der Befehl dann so aus:

xvnc4viewer -FullColor -listen 5500 

Nun wird der Bildschirmaufbau langsam, jedoch mit allen Farben erfolgen.

Noch mehr Optionen, Beispiele und Erklärungen findet man auf den manpages von x11vnc und xvnc4viewer.

Reverse VNC über SSH Verbindung

Auch diese Methode verfolgt das Ziel, den Konfigurationsaufwand für den Hilfesuchenden so gering wie möglich zu halten. Deshalb baut der Hilfesuchende hier mit dem schon vorinstallierten SSH Client eine normale SSH-Verbindung zum Helfer auf. Durch diese wird dann eine umgekehrte VNC-Verbindung getunnelt. Folgende Schritte sind dabei bei Hilfesuchenden und Helfer vorzunehmen:

Vorbereitungen auf der Seite des Helfers

  1. Sofern der Helfer hinter einem Router sitzt, ist dort eine Portweiterleitung für die SSH-Verbindung einzurichten. Läuft eine Firewall auf dem System des Helfers, so muss auch diese so konfiguriert werden, dass sie die SSH-Anfrage des Hilfesuchenden durchlässt.

  2. Installation des SSH-Servers.

  3. Installation des vncviewers:

    • xvnc4viewer

    Wiki/Vorlagen/Installbutton/button.png mit apturl

    Paketliste zum Kopieren:

    sudo apt-get install xvnc4viewer 

    sudo aptitude install xvnc4viewer 

  4. Anlegen eines Benutzers, mit dem sich der Hilfesuchende dann per SSH auf dem Rechner des Helfers anmelden kann.

  5. Ermittlung der eigenen IP oder alternative Einrichtung von DynDNS.

Vorbereitungen auf der Seite des Hilfesuchenden

Installation des VNC-Servers.

  • x11vnc

Wiki/Vorlagen/Installbutton/button.png mit apturl

Paketliste zum Kopieren:

sudo apt-get install x11vnc 

sudo aptitude install x11vnc 

Aufbau der Verbindung

  1. Helfer: Start des SSH Server:

    sudo /etc/init.d/ssh restart 
  2. Helfer: Start des VNC-Viewers im Listen-Modus:

    vncviewer -listen 
  3. Hilfesuchender: Start der SSH-Verbindung mittels SSH-Client und Verbindung zum lauschenden VNC-Viewer:

    ssh -f -L 5500:localhost:5500 hilflos@IP-des-Helfersystems sleep 10; x11vnc -connect_or_exit localhost:5500 

Der letzte Befehl startet vom System des Hilfesuchenden eine SSH-Verbindung zum System des Helfers. Diese SSH-Verbindung läuft im Hintergrund (-f-Option). Durch diese hindurch verbindet sich der Hilfesuchende nun mit seinem VNC-Server auf den lauschenden VNC-Viewer des Helfers. Das elegante an dieser Lösung ist, dass mit dem schließen des VNC-Viewers auf der Helferseite sogleich der VNC-Server und die SSH-Verbindung auf Seiten des Hilfesuchenden sauber geschlossen werden.

Server-Informationen ermitteln

Wenn der Hilfe-Suchende über das Internet von einem Helfer unterstützt werden soll, benötigt der Helfer (Client) Informationen über den Server (Hilfe-Suchende); diese muss ihm der Hilfe-Suchende mitteilen. Notwendig sind - sofern DynDNS nicht verwendet wird - IP-Adresse und Display-Nummer. Letztere kann von 0 abweichen, wenn auf dem Server-Rechner z. B. mehrere User angemeldet sind. Um es dem Hilfe-Suchenden möglichst einfach zu machen, kann für diesen (im Voraus) ein Starter im Menü oder Panel angelegt werden, der die Informationen ermittelt und ausgibt. Der Starter muss folgendes ausführbares Skript aufrufen:

1
2
3
4
5
6
#!/bin/bash

DISPLAY_NUMBER=`echo $DISPLAY | cut -c 2`
IP_ADDRESS=`wget http://checkip.dyndns.com/ -O - 2>/dev/null | grep "Current IP Address" | cut -d ":" -f 2- | sed 's#</body></html>##g' | sed 's/ //'`

zenity --info --text "IP-Adresse: $IP_ADDRESS\nDisplay-Nummer: $DISPLAY_NUMBER" --title "VNC-Info"

Das Paket zenity muss dazu installiert sein.

Problembehandlung

Tastaturproblem

Unter Xfce (Xubuntu) wird in der Standard-Einstellung das Tastatur-Layout nicht korrekt übertragen. Das Problem wird behoben, indem man im Hauptmenü "Einstellungen -> Einstellungen -> Tastatur -> Tastaturbelegung" (ab Xubuntu 12.10 nur noch "Einstellungen -> Tastatur -> Tastaturbelegung") aufruft, dort die Option "Systemweite Einstellungen benutzen" deaktiviert und bei "Tastaturbelegung" die gewünschte Sprache einstellt. Nach einem Neustart des VNC-Servers sollte das Tastaturproblem behoben sein.

Drag&Drop funktioniert nicht (10.04)

Drag&Drop funktioniert in der in Ubuntu Lucid Lynx 10.04 verwendeten Programmversion nicht, siehe 587856 und diesen Blogeintrag {en}. Als provisorische Lösung kann in einem Editor [4] mit Root-Rechten in der Datei /etc/apt/preferences.d/pinGnomeForRemoteAccess (erweitert durch libgtk2.0-dev) die Verwendung funktionsfähiger älterer Pakete erzwungen werden:

Package: libgtk2.0-0
Pin: version 2.20.0-0ubuntu4
Pin-Priority: 1001

Package: libgtk2.0-bin
Pin: version 2.20.0-0ubuntu4
Pin-Priority: 1001

Package: libgtk2.0-dev
Pin: version 2.20.0-0ubuntu4
Pin-Priority: 1001

Package: libgail18
Pin: version 2.20.0-0ubuntu4
Pin-Priority: 1001

Package: libgail-common
Pin: version 2.20.0-0ubuntu4
Pin-Priority: 1001

Package: gtk2-engines-pixbuf
Pin: version 2.20.0-0ubuntu4
Pin-Priority: 1001

Spezielle Anwendungsfälle

Freigeben einer einzelnen Anwendung

Um ein einzelnes Programm auf einem Rechner (meist an einen Beamer angeschlossen) z.B. Schülern freizugeben, damit diese mit dem eigenen Endgerät demonstrieren und nachvollziehen können, nutze ich folgendes Skript:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/bin/bash

passwortdatei=$(mktemp)

# Passwort erstellen
date +%N | grep -o ^.... > $passwortdatei;

hinweise="Passwort: $(cat $passwortdatei) $(/sbin/ifconfig | grep -o inet\ Adresse:[0-9\.]*)"
programm="$*"

# Unterfenster erzeugen
Xnest -geometry 1024x720 :4 &

# VNC draufschalten
x11vnc -shared -forever -zeroconf -noshm -passwdfile $passwortdatei -display :4 &

lxterm -fs 40 -display :4 -e "ratpoison & $programm; rm $passwortdatei" &

sleep 5; ratpoison --display :4 -c "echo $hinweise"
sleep 5; ratpoison --display :4 -c "echo $hinweise"
sleep 5; ratpoison --display :4 -c "echo $hinweise"
sleep 5; ratpoison --display :4 -c "echo $hinweise"

Das Skript kann ausführbar im Suchpfad liegen, z.B. mit dem Dateinamen "start-vnc". Ein Programm lässt sich dann mit "start-vnc <Programm> <Parameter>" starten.

Das Skript setzt die Pakete xnest und ratpoison voraus.

ubuntuusers.local › WikiVNC