CentOS: Remote Access und Desktop Sharing mit TigerVNC

Virtual Network Computing (VNC) zeigt den Bildschirminhalt eines Servers plattformunabhängig auf einem Client an und ermöglicht dessen Fernsteuerung per Tastatur- und Mausbewegungen. Da das zugrundeliegende Remote Framebuffer-Protokoll unverschlüsselt arbeitet, sind alle Tastatureingaben des Viewers im Netzwerk einsehbar, weshalb man VNC in der Praxis immer durch SSH tunnelt.

Beim im RHEL-Umfeld bevorzugten TigerVNC werden wenigstens die VNC-Passwörter verschlüsselt übertragen. Zudem lässt sich TigerVNC durch seine Kompressionsmöglichkeiten auch über schmalbandige Verbindungen problemlos nutzen.

VNC ermöglicht normalerweise kein Desktop Sharing, d.h. ein aktuell geöffneter (physischer) Desktop kann nicht übernommen werden. Statt dessen wird ein neuer virtueller Desktop erzeugt, was es ermöglicht, eine beliebige Anzahl Benutzer auf einer Maschine arbeiten zu lassen. Mit TigerVNC geht aber auch das: es bringt dafür einen eigenen Server mit. Mehr dazu weiter unten.

Tipp

Ein alternativer VNC-Server unter GNOME ist "Vino".

TigerVNC Server

Die Maschine, zu der man sich verbinden möchte, muss den tigervnc-Server ausführen, den man wie folgt installiert:

yum -y install tigervnc-server

Nach der Installation folgt die Anpassung der VNC-Konfigurationsdatei: man gibt den Benutzernamen an, für den VNC eine Verbindungsmöglichkeit bieten soll, als auch beispielsweise die gewünschte Auflösung. Im nachfolgenden Beispiel wird VNC für den bereits vorhandenen Linux-Benutzer "linus" konfiguiert.

VNC-Server für den ersten Benutzer einrichten:

cp /lib/systemd/system/vncserver@.service \
   /etc/systemd/system/vncserver@:0.service

In der Konfigurationsdatei müssen nun alle Vorkommen von <USER> durch einen konkreten Benutzernamen ersetzt werden.

%i ist ein Platzhalter, der beim Starten des VNC-Dienstes mit der angegebenen Display-Nummer ersetzt wird (für gewöhnlich setzt man beim ersten Benutzer die Display-Nummer auf "0").

nano /etc/systemd/system/vncserver@:0.service
...
ExecStart=/sbin/runuser -l linus -c "/usr/bin/vncserver %i -geometry 1024x768"
PIDFile=/home/linus/.vnc/%H%i.pid
...

Nachdem man auf dem VNC-Server mittels

su - linus
vncpasswd

dem gewünschten VNC-Benutzer noch ein Passwort spendiert hat, kann sich dieser mit einem VNC-Client wie Remmina oder TigerVNC einloggen. Wichtig: es sollte sich um ein eigenständiges Passwort nur für den VNC-Service handeln. Das Tool speichert es in der Datei $HOME/.vnc/.passwd.

Den Service noch aktivieren:

systemctl daemon-reload
systemctl enable vncserver@:0.service
systemctl start vncserver@:0.service

Ein zweiter Benutzer wird über einen zweiten Service eingerichtet, der dritte Benutzer über einen dritten Service usw.:

cp /lib/systemd/system/vncserver@.service \
   /etc/systemd/system/vncserver@:1.service
...

Firewall:

firewall-cmd --permanent --add-port=5900/tcp
firewall-cmd --reload

Tipp

Der VNC-Server läuft auf Port 5900 plus der Displaynummer, die beim Start des Servers angegeben wurde. Einen mit systemctl start vncserver@:2.service gestarteten Server erreicht man daher auf Port 5902 usw. - dementsprechend sind die Ports in der lokalen Firewall freizugeben.

Desktop Sharing: Display übernehmen

x0vncserver ist ein TigerVNC-Server, der ein X-Display über VNC remote verfügbar macht. Im Gegensatz zu Xvnc erzeugt er kein virtuelles Display, sondern teilt den existierenden X-Server (der in der Regel mit dem physischen Display verbunden ist). Wer sich jetzt wundert: vncserver ist ein Perl-Script, welches den Start des eigentlichen Xvnc TigerVNC-Servers vereinfacht.

Der direkte Aufruf:

x0vncserver -display :0 -PasswordFile /home/linus/.vnc/passwd 

Die Display-Nummer bei x0vncserver entspricht der Nummer des physischen Displays.

Das passende Systemd Unit-File:

nano /etc/systemd/system/x0vncserver.service
[Unit]
Description=Remote desktop sharing service (VNC)
After=syslog.target network.target

[Service]
Type=simple
ExecStart=/usr/bin/x0vncserver -display :0 -PasswordFile /home/linus/.vnc/passwd 

[Install]
WantedBy=multi-user.target
systemctl enable x0vncserver
systemctl start x0vncserver

VNC-Clients

Fehlt ein VNC-Client auf RHEL/CentOS/Fedora, installiert man sich beispielsweise TigerVNC:

dnf/yum -y install tigervnc

Um sich zu verbinden, ruft man den VNC-Viewer mit der gewünschten Ziel-Adresse und dem Display-Port auf:

vncviewer my_server:0

Der Client Remmina hat den Vorteil, Remote Access-Protokolle wie VNC, RDP u.a. unter einen Hut zu bringen.

VNC sicher nutzen

Um unverschlüsselte Verbindungen dauerhaft zu verhindern, ergänzt man auf dem VNC-Server die ExecStart-Zeile:

ExecStart=/sbin/runuser ... -localhost %i ..."

Ein Client kann sich nun nur über folgenden Aufruf verbinden:

vncviewer -via linus@my_server :0

Damit wird zunächst eine SSH-Verbindung aufgebaut, über die dann die VNC-Verbindung getunnelt wird.


Related Posts

Published by

Sandro Lang

Sandro Lang

Just another HTMLy user.