Einige Benutzer mieten relativ kostengünstige VPS mit Windows, um einen Remote-Desktop-Dienst auszuführen. Dasselbe kann auch unter Linux gemacht werden, ohne eigene Hardware in einem Rechenzentrum zu hosten oder einen dedizierten Server zu mieten. Manche benötigen eine gewohnte grafische Umgebung für Tests und Entwicklung oder einen Remote-Desktop mit einer breiten Bandbreite, um von mobilen Geräten aus zu arbeiten. Es gibt zahlreiche Anwendungsmöglichkeiten für die auf dem Remote FrameBuffer (RFB) Protokoll basierende Virtual Network Computing (VNC) Systeme. In einem kurzen Artikel erklären wir, wie man es auf einer virtuellen Maschine mit jedem Hypervisor einrichtet.
Inhaltsverzeichnis:
VNC-Serverauswahl
Der VNC-Dienst kann in das Virtualisierungssystem integriert werden, wobei der Hypervisor ihn mit den emulierten Geräten verbindet, sodass keine zusätzliche Konfiguration erforderlich ist. Diese Option hat jedoch erhebliche Kosten für die Ressourcennutzung und wird von nicht allen Anbietern unterstützt – selbst in weniger ressourcenintensiven Umsetzungen, in denen anstelle der Emulation eines realen Grafikgerätes der virtuellen Maschine eine vereinfachte Abstraktion (FrameBuffer) übergeben wird. Manchmal wird der VNC-Server an einen laufenden X-Server gebunden, aber diese Methode ist eher für den Zugriff auf physische Maschinen geeignet, während sie auf virtuellen Maschinen mehrere technische Probleme verursacht. Am einfachsten ist es, einen VNC-Server mit integriertem X-Server zu installieren. Dies erfordert keine physischen Geräte (Grafikkarte, Tastatur und Maus) oder deren Emulation durch den Hypervisor, was es für VPS aller Art geeignet macht.
Installation und Konfiguration
Wir benötigen eine virtuelle Maschine mit Ubuntu Server 18.04 LTS in der Standardkonfiguration. In den Standard-Repositorys dieser Distribution sind mehrere VNC-Server verfügbar: , , und andere. Wir haben uns für TigerVNC entschieden – einen aktuellen Fork des nicht mehr unterstützten TightVNC. Die Einrichtung anderer Server erfolgt auf ähnliche Weise. Außerdem muss eine Desktop-Umgebung ausgewählt werden: unserer Meinung nach wäre XFCE aufgrund der vergleichsweise geringen Anforderungen an die Rechenressourcen die optimale Wahl. Wer möchte, kann eine andere DE oder WM installieren: hier hängt alles von den persönlichen Vorlieben ab, jedoch beeinflusst die Softwarewahl direkt den Bedarf an RAM und Rechenkernen.

Die Installation der Desktop-Umgebung mit allen Abhängigkeiten erfolgt mit dem folgenden Befehl:
sudo apt-get install xfce4 xfce4-goodies xorg dbus-x11 x11-xserver-utilsAls Nächstes muss der VNC-Server installiert werden:
sudo apt-get install tigervnc-standalone-server tigervnc-commonEs ist keine gute Idee, ihn mit Administratorrechten zu starten. Erstellen Sie einen Benutzer und eine Gruppe:
sudo adduser vnc 
Fügen wir den Benutzer zur sudo-Gruppe hinzu, damit er administrativen Aufgaben nachkommen kann. Wenn dies nicht nötig ist, kann dieser Schritt übersprungen werden:
sudo gpasswd -a vnc sudoIm nächsten Schritt muss der VNC-Server mit den Rechten des Benutzers vnc gestartet werden, um ein sicheres Passwort und Konfigurationsdateien im Verzeichnis ~/.vnc/ zu erstellen. Die Passwortlänge kann zwischen 6 und 8 Zeichen liegen (Extras werden abgeschnitten). Falls nötig, kann auch ein Passwort nur für den View-Only-Zugriff festgelegt werden, d.h. ohne Zugriff auf die Tastatur und Maus. Die folgenden Befehle werden im Namen des Benutzers vnc ausgeführt:
su - vnc
vncserver -localhost no 
Standardmäßig verwendet das RFB-Protokoll einen Bereich von TCP-Ports von 5900 bis 5906 – dies sind die sogenannten Display-Ports, von denen jeder einem X-Server-Bildschirm entspricht. Dabei sind die Ports den Bildschirmen von :0 bis :6 zugeordnet. Unser gestarteter VNC-Server hört auf Port 5901 (Bildschirm :1). Weitere Instanzen können auf anderen Ports mit den Bildschirmen :2, :3 usw. laufen. Bevor wir mit der weiteren Konfiguration fortfahren, müssen wir den Server stoppen:
vncserver -kill :1Der Befehl sollte eine Nachricht in etwa folgendermaßen ausgeben: „Killing Xtigervnc process ID 18105… success!“.
Beim Start von TigerVNC wird das Skript ~/.vnc/xstartup ausgeführt, um die Konfigurationseinstellungen vorzunehmen. Lassen Sie uns unser eigenes Skript erstellen, nachdem wir eine Sicherungskopie des bestehenden Skripts angefertigt haben, falls es existiert:
mv ~/.vnc/xstartup ~/.vnc/xstartup.b
nano ~/.vnc/xstartupDie Desktop-Umgebungssitzung XFCE wird mit folgendem xstartup-Skript gestartet:
#!/bin/bash
unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS
xrdb $HOME/.Xresources
exec /usr/bin/startxfce4 &Der Befehl xrdb ist notwendig, damit das VNC-System die Datei .Xresources im Home-Verzeichnis liest. Dort kann der Benutzer verschiedene Parameter des grafischen Desktops festlegen: Schriftarten-Rendering, Terminalfarben, Mausthemen usw. Das Skript muss ausführbar gemacht werden:
chmod 755 ~/.vnc/xstartupDamit ist die Konfiguration des VNC-Servers abgeschlossen. Wenn Sie ihn mit dem Befehl vncserver -localhost no (im Namen des Benutzers vnc) starten, können Sie sich mit dem zuvor festgelegten Passwort verbinden und sehen, dass:

Dienst über systemd starten
Das manuelle Starten des VNC-Servers eignet sich schlecht für den produktiven Einsatz, deshalb richten wir einen Systemdienst ein. Die Befehle werden im Namen von root ausgeführt (verwenden Sie sudo). Zunächst erstellen wir eine neue Einheitendatei für unseren Server:
sudo nano /etc/systemd/system/vncserver@.serviceDas @-Zeichen im Namen ermöglicht es, ein Argument zur Konfiguration des Dienstes zu übergeben. In unserem Fall legt es den VNC-Display-Port fest. Die Einheitendatei besteht aus mehreren Abschnitten:
[Unit]
Description=TigerVNC-Server
After=syslog.target network.target
[Service]
Type=simple
User=vnc
Group=vnc
WorkingDirectory=/home/vnc
PIDFile=/home/vnc/.vnc/%H:%i.pid
ExecStartPre=-/usr/bin/vncserver -kill :%i > /dev/null 2>&1
ExecStart=/usr/bin/vncserver -depth 24 -geometry 1280x960 :%i
ExecStop=/usr/bin/vncserver -kill :%i
[Install]
WantedBy=multi-user.targetDann müssen Sie systemd über das neue Dateisystem informieren und es aktivieren:
sudo systemctl daemon-reload
sudo systemctl enable vncserver@1.serviceDie Zahl 1 im Namen gibt die Bildschirmnummer an.
Wir stoppen den VNC-Server, starten ihn als Dienst und überprüfen den Status:
# от имени пользователя vnc
vncserver -kill :1# с привилегиями суперпользователя
sudo systemctl start vncserver@1
sudo systemctl status vncserver@1Wenn der Dienst läuft, sollten wir ein ähnliches Ergebnis erhalten.

Verbindung zum Desktop
Unsere Konfiguration verwendet keine Verschlüsselung, daher können Netzwerkpakete von Angreifern abgefangen werden. Außerdem finden sich bei VNC-Servern häufig , deshalb sollten sie nicht für den Zugriff aus dem Internet geöffnet werden. Für eine sichere Verbindung am lokalen Computer sollte der Datenverkehr in einem SSH-Tunnel verpackt werden, und dann den VNC-Client konfigurieren. Unter Windows kann ein grafischer SSH-Client (z. B. PuTTY) verwendet werden. Zur Sicherheit horcht TigerVNC auf dem Server nur auf localhost und ist nicht direkt aus öffentlichen Netzwerken zugänglich:
sudo netstat -ap |more 
Unter Linux, FreeBSD, OS X und anderen UNIX-ähnlichen Betriebssystemen wird der Tunnel vom Client-Computer mittels des ssh-Tools erstellt (auf dem VNC-Server muss sshd ausgeführt werden):
ssh -L 5901:127.0.0.1:5901 -C -N -l vnc vnc_server_ipDie Option -L bindet den Port 5901 der Remote-Verbindung an den Port 5901 von localhost. Die Option -C aktiviert die Kompression, und -N teilt dem ssh-Tool mit, dass kein Remote-Befehl ausgeführt werden soll. Die Option -l legt den Login für den entfernten Systemzugang fest.
Nach der Konfiguration des Tunnels muss der VNC-Client auf dem lokalen Computer gestartet und eine Verbindung zum Host 127.0.0.1:5901 (localhost:5901) hergestellt werden, wobei das zuvor festgelegte Passwort für den Zugriff auf den VNC-Server verwendet wird. Jetzt können wir sicher über den verschlüsselten Tunnel mit der Desktop-Umgebung XFCE auf dem VPS interagieren. Im Screenshot des Terminalemulators ist das Tool top gestartet, um den geringen Ressourcenverbrauch der virtuellen Maschine zu zeigen. Von hier an hängt alles von den Benutzeranwendungen ab.

Einen VNC-Server unter Linux auf nahezu jedem VPS einzurichten und zu konfigurieren, ist problemlos möglich. Dazu sind keine kostspieligen und ressourcenintensiven Konfigurationen mit Video-Adapter-Emulation oder der Erwerb kommerzieller Software-Lizenzen erforderlich. Neben der bereits behandelten Option des Systemdienstes gibt es auch andere: den Start im Daemon-Modus (über /etc/rc.local) beim Booten des Systems oder auf Abruf über inetd. Letzteres ist interessant für die Erstellung von Mehrbenutzerkonfigurationen. Der Internet-Superserver startet den VNC-Server und verbindet ihn mit dem Client, während der VNC-Server einen neuen Bildschirm erstellt und eine Sitzung beginnt. Für die Authentifizierung innerhalb dieser Sitzung kann ein grafischer Anmelde-Manager verwendet werden (zum Beispiel, ), und nach der Trennung des Clients wird die Sitzung geschlossen und alle Programme, die mit dem Bildschirm arbeiten, beendet.
Quelle: habr.com
