VNC

Siehe auch

VNC benötigt firewallseitig „Port-Nummer 5900/tcp plus Display-Nummer“. Um also Display 3 erreichen zu können, muss der Port 5903/tcp freigegeben werden. Wer in firewalld den Service-Name vnc-server verwendet, gibt automatisch die Ports 5900 bis 5903 frei.

VNC ist in seiner ungeschützten Standard-Form ein Klartext-Protokoll, kommt also ohne Sicherheitsmerkmale daher. Um die Kommunikation abzusichern und zu verschlüsseln, wird zum Verbindungsaufbau die -via-Option angegeben, damit der Netzwerkverkehr über SSH getunnelt wird. Alternativ unterstützen moderne Server und Clients TLS-basierte Sicherheitstypen (TLSNone, TLSPlain, X509Vnc etc., siehe unten).

VNC wird pro Benutzer und Display-Nummer konfiguriert (Red Hat empfiehlt, als erste User-Display-Nummer die :2 zu verwenden).

Ab RHEL 8 werden Konfigurationsangaben über /etc/tigervnc/vncserver.users sowie die Template-Unit vncserver@.service gepflegt.

Begriffe

Display-Nummer

VNC-Sessions werden mit einer Display-Nummer adressiert, analog zu X11-Displays. :0 entspricht typisch der physikalischen Konsole, :1 ist für Server-Sessions reserviert (bei Red Hat), :2 und höher für VNC-User. Der TCP-Port ist 5900 + Display-Nummer.

RFB

Remote Framebuffer Protocol - das eigentliche Protokoll, das VNC implementiert (RFC 6143). Aktuelle stabile Version ist 3.8. Im Kern werden Pixel-Updates (nicht Anwendungen) zwischen Server und Client ausgetauscht.

Security Type

VNC kennt mehrere Aushandlungs-Varianten für Authentifizierung und Verschlüsselung, konfiguriert über SecurityTypes:

  • None: keine Auth, kein TLS (für SSH-getunnelte Setups gedacht).

  • VncAuth: klassisches Passwort-Verfahren. Die Key-Ableitung basiert auf DES und beschränkt das Passwort auf 8 Zeichen (längere werden stillschweigend abgeschnitten). Keine Verschlüsselung.

  • TLSNone / TLSVnc / TLSPlain: TLS-verschlüsselter Kanal ohne Zertifikatsprüfung; Authentifizierung über VncAuth oder PAM.

  • X509None / X509Vnc / X509Plain: wie oben, aber mit X.509-Zertifikatsprüfung - die empfohlene Variante für produktive Nutzung.

Xvnc

Der eigentliche VNC-Server-Prozess von TigerVNC: eine X11-Server-Implementierung ohne sichtbaren Bildschirm, die den gerenderten Framebuffer über das RFB-Protokoll ausliefert.

VNC-Server

TigerVNC

TigerVNC erlaubt Desktop Sharing sowie die Fernsteuerung eines Computers, ähnlich wie Anydesk, TeamViewer oder RDP. Ein vncviewer verbindet sich dabei zum vncserver und steuert diesen. Der vncserver-Desktop läuft unter Xvnc und erlaubt separate, parallele Benutzer-Sessions. In der Standard-Konfiguration wird nicht der bestehende Bildschirm geteilt, sondern eine neue VNC-Session.

Achtung

TigerVNC funktioniert nur unter X11. Auf Systemen mit Wayland-Session (RHEL 9+ Default) läuft der per vncserver@:x gestartete Dienst in einer eigenen X11-Session - er teilt nicht den aktiven Wayland-Desktop des Users. Für das Teilen der laufenden Sitzung muss GNOME Remote Desktop (RDP-basiert) verwendet werden.

Installation:

dnf --assumeyes install tigervnc-server

RHEL 8 und neuer

Quelle für RHEL 9 | Quelle für RHEL 8

Konfiguration der Benutzer. Diese werden in der Datei /etc/tigervnc/vncserver.users verwaltet. Im Beispiel für „linus“:

/etc/tigervnc/vncserver.users
:2=linus

Der Benutzer „linus“ benötigt noch ein Passwort für den VNC-Service, welches unter keinen Umständen mit seinem Benutzerpasswort übereinstimmen sollte. Das Passwort wird durch die VNC-Tools im Klartext auf der Server-Maschine abgelegt.

su - linus
vncpasswd
# Password:
# Verify:

Weitere Einstellungen können in folgenden Dateien (mit absteigender Priorität) gemacht werden:

  • /etc/tigervnc/vncserver-config-mandatory

  • $HOME/.config/tigervnc/config (TigerVNC >= 1.14) bzw. $HOME/.vnc/config (TigerVNC < 1.14)

  • /etc/tigervnc/vncserver-config-defaults

So passt man beispielsweise die Auflösung eines Benutzers an:

$HOME/.config/tigervnc/config
geometry=1280x1024

Start des VNC-Servers wieder als root beispielsweise auf Display 2 (Port 5902/tcp auf der Firewall öffnen):

systemctl enable --now vncserver@:2

Die Systemd-Unit anpassen, damit die jeweilige VNC-Session nach einem Logout des Users neu startet:

/usr/lib/systemd/system/vncserver@.service
[Service]
Restart=on-success
RestartSec=10
systemctl daemon-reload

Falls aus Sicherheitsgründen nur Verbindungen über SSH-Tunneling erlaubt werden sollen, unterbindet man den Zugriff auf die VNC-Ports (5900-59xx) und fügt die SSH-Keys des Benutzers hinzu.

Debian und Ubuntu

Debian und Ubuntu liefern tigervnc-standalone-server in den offiziellen Repos. Es gibt jedoch keine fertige Template-Unit wie unter RHEL - der Dienst wird pro User gestartet:

apt-get --yes install tigervnc-standalone-server
# user initial setup
vncpasswd
vncserver :2 -geometry 1280x1024 -localhost yes

Systemd-User-Units (~/.config/systemd/user/vncserver@.service) oder eine eigene, angepasste Systemunit halten den Dienst persistent.

PAM-Authentifizierung

Zur Authentifizierung via PAM (zum Beispiel für LDAP; Quelle) zunächst sicherstellen, dass ein vnc PAM existiert:

test -f /etc/pam.d/vnc || ln -s login /etc/pam.d/vnc

Folgende Zeilen zur jeweiligen VNC-Konfiguration der Benutzer hinzufügen:

$HOME/.vnc/config
SecurityTypes=TLSPlain
PlainUsers=linus

x11vnc

x11vnc unterscheidet sich fundamental von TigerVNC: statt einen eigenen virtuellen X-Server zu starten, exportiert es einen bereits laufenden X11-Display (typischerweise :0). Damit wird der aktuelle physikalische Bildschirm eines angemeldeten Users geteilt - was für Helpdesk-Zwecke passt, aber nicht für unabhängige, gleichzeitige Admin-Sessions.

dnf --assumeyes install x11vnc
x11vnc -ncache 10 -display :0 -geometry 1024x768 -rfbauth /home/user/.vnc/passwd

GNOME Remote Desktop

Unter RHEL 9 und neueren GNOME-Umgebungen empfiehlt Red Hat anstelle von VNC das native GNOME Remote Desktop (Paket gnome-remote-desktop). Es sprich RDP statt RFB, unterstützt Wayland-Sessions nativ und lässt sich via grdctl oder GNOME-Settings konfigurieren. Für das Teilen einer aktiv laufenden Wayland-Session ist das heute der vorgesehene Weg.

VNC-Viewer

TigerVNC

vncviewer lässt sich sowohl per GUI als auch von der Kommandozeile aus verwenden.

Installation:

dnf --assumeyes install tigervnc

Zu einem VNC-Server auf Display 3 verbinden:

vncviewer $VNCSERVER:3

Wie oben, aber über einen SSH-Tunnel verbinden (Auf- und Abbau des SSH-Tunnels passiert automatisch):

vncviewer -via $USER@$VNCSERVER:3

Best Practices

  • Nie ohne Transport-Sicherung exponieren: SecurityTypes=None oder VncAuth nur hinter SSH-Tunnel oder TLS-VPN betreiben. Für direkte Verbindung mindestens X509Vnc mit eigenem Zertifikat.

  • Passwort-Begrenzung von VncAuth beachten: 8 Zeichen sind tatsächlich das harte Limit aus dem Key-Schedule von DES. Kein Grund, trotzdem ein kurzes Wort zu nehmen - aber weit jenseits von „modernen Passwort-Richtlinien“.

  • Display ``:0`` und ``:1`` freilassen: Display :0 (Port 5900) entspricht konventionell der physikalischen Konsole, :1 ist bei Red Hat für System-Dienste reserviert. Admin- und User-Sessions konsequent ab :2 anlegen, damit sich parallel laufende Tools (x11vnc, Xorg-Eigentum, automatische Reservierungen) nicht in die Quere kommen.

  • Sessions nicht hinter unbekanntem Login-Manager lassen: Xvnc-Sessions bleiben stehen, bis sie explizit beendet werden. Ein systemctl stop vncserver@:2 am Feierabend (oder per systemd-Timer) vermeidet endlose, vergessene Sessions.

  • Monitoring: mit Icinga/Nagios ein einfacher TCP-Check auf 590x reicht zur Verfügbarkeitsprüfung. Für die Session selbst ist kein standardmässiger Health-Check vorgesehen.

Unterschiede RHEL / Debian

  • Paketname: RHEL tigervnc-server (inkl. vncserver@.service-Template), Debian/Ubuntu tigervnc-standalone-server (ohne mitgeliefertes Systemd-Template).

  • User-Mapping: RHEL verwaltet User/Display in /etc/tigervnc/vncserver.users; Debian überlässt dies dem Admin.

  • PAM: Beide Seiten haben einen PAM-Stack /etc/pam.d/vnc (bei Debian ist er oft nicht vorinstalliert, Link auf login anlegen).

  • firewalld vs. ufw: firewalld kennt den Service vnc-server (Ports 5900-5903). Unter Ubuntu/Debian mit ufw werden die Ports manuell geöffnet (ufw allow 5902/tcp).