W Omówiliśmy uruchamianie serwera VNC na wirtualnej maszynie dowolnego typu. Ta opcja ma wiele wad, z których główną są wysokie wymagania dotyczące przepustowości kanałów przesyłowych. Dziś spróbujemy połączyć się z graficznym pulpitem w systemie Linux za pomocą RDP (Remote Desktop Protocol). System VNC oparty jest na przesyłaniu tablic pikseli przez protokół RFB (Remote Framebuffer), a RDP umożliwia przesyłanie bardziej złożonych prymitywów graficznych i wysokopoziomowych poleceń. Zwykle jest używany do świadczenia usług zdalnych pulpitów w systemie Windows, ale serwery dla systemu Linux są również dostępne.
Spis treści:
Instalacja środowiska graficznego
Weźmiemy wirtualną maszynę z Ubuntu Server 18.04 LTS z dwoma rdzeniami CPU, czterema gigabajtami pamięci RAM i dyskiem twardym (HDD) o pojemności dwudziestu gigabajtów. Słabsza konfiguracja źle nadaje się do pulpitów graficznych, choć to zależy od wykonywanych zadań. Pamiętaj, aby użyć kodu promocyjnego Habrahabr10, aby uzyskać 10% zniżki przy zamówieniu.

Instalacja środowiska pulpitu ze wszystkimi zależnościami odbywa się za pomocą następującego polecenia:
sudo apt-get install xfce4 xfce4-goodies xorg dbus-x11 x11-xserver-utilsPodobnie jak w poprzednim przypadku, wybraliśmy XFCE z powodu względnie niskich wymagań dotyczących zasobów obliczeniowych.
Lokalizacja serwera i instalacja oprogramowania
Często wirtualne maszyny są uruchamiane tylko z angielską lokalizacją. Na pulpicie może być wymagana lokalizacja rosyjska, którą łatwo skonfigurować. Najpierw zainstalujemy tłumaczenia dla programów systemowych:
sudo apt-get install language-pack-plSkonfigurujemy lokalizację:
sudo update-locale LANG=pl_PL.UTF-8Ten sam efekt można osiągnąć, edytując ręcznie plik /etc/default/locale.
Do lokalizacji GNOME i KDE w repozytorium są pakiety language-pack-gnome-pl i language-pack-kde-pl — będą potrzebne, jeśli zamierzasz używać programów z tych środowisk pulpitu. W XFCE tłumaczenia są instalowane razem z aplikacjami. Następnie można zainstalować słowniki:
# Словари для проверки орфографии
sudo apt-get install hunspell hunspell-ru
# Тезаурус для LibreOffice
sudo apt-get install mythes-ru
# Англо-русский словарь в формате DICT
sudo apt-get install mueller7-dictPonadto instalacja tłumaczeń może być wymagana dla niektórych programów aplikacyjnych:
# Браузер Firefox
sudo apt-get install firefox firefox-locale-ru
# Почтовый клиент Thunderbird
sudo apt-get install thunderbird thunderbird-locale-ru
# Офисный пакет LibreOffice
sudo apt-get install libreoffice libreoffice-l10n-ru libreoffice-help-ruNa tym przygotowanie środowiska pulpitu zostało zakończone, pozostało skonfigurować serwer RDP.
Instalacja i konfiguracja serwera RDP
W repozytoriach Ubuntu znajduje się darmowy serwer Xrdp, którego zamierzamy użyć:
sudo apt-get install xrdpJeśli wszystko poszło dobrze, serwer powinien uruchomić się automatycznie:
sudo systemctl status xrdp 
Serwer Xrdp uruchamia się z uprawnieniami użytkownika xrdp i domyślnie korzysta z certyfikatu /etc/ssl/private/ssl-cert-snakeoil.key, który można zastąpić własnym. Aby uzyskać dostęp do pliku, należy dodać użytkownika do grupy ssl-cert:
sudo adduser xrdp ssl-certDomyślne ustawienia można znaleźć w pliku /etc/default/xrdp, a wszystkie inne pliki konfiguracyjne serwera znajdują się w katalogu /etc/xrdp. Główne opcje są w pliku xrdp.ini, którego można nie zmieniać. Konfiguracja jest dobrze udokumentowana, oprócz tego w zestawie znajdują się odpowiednie manpages:
man xrdp.ini
man xrdpTeraz wystarczy edytować skrypt /etc/xrdp/startwm.sh, który jest wykonywany podczas inicjalizacji sesji użytkownika. Najpierw zróbmy kopię zapasową skryptu z dystrybucji:
sudo mv /etc/xrdp/startwm.sh /etc/xrdp/startwm.b
sudo nano /etc/xrdp/startwm.shAby uruchomić środowisko pulpitu XFCE, potrzebny będzie skrypt o takiej treści:
#!/bin/sh
if [ -r /etc/default/locale ]; then
. /etc/default/locale
export LANG LANGUAGE
fi
exec /usr/bin/startxfce4Zauważ, że w skryptach lepiej jest podawać pełną ścieżkę do plików wykonywalnych — to dobra praktyka. Uczyńmy skrypt wykonywalnym, a tym samym konfiguracja serwera Xrdp będzie zakończona:
sudo chmod 755 /etc/xrdp/startwm.shRestartujemy serwer:
sudo systemctl restart xrdp
Konfiguracja zapory sieciowej
Domyślnie Xrdp nasłuchuje na porcie TCP 3389 na wszystkich interfejsach. W zależności od konfiguracji serwera wirtualnego może być konieczne skonfigurowanie zapory sieciowej Netfilter. W systemie Linux zazwyczaj robi się to za pomocą narzędzia iptables, ale w Ubuntu lepiej jest używać ufw. Jeśli znany jest adres IP klienta, konfiguracja realizowana jest następującą linią:
sudo ufw allow from IP_Address to any port 3389Aby zezwolić na połączenia z dowolnego IP, można to zrobić tak:
sudo ufw allow 3389Protokół RDP wspiera szyfrowanie, jednak otwieranie dostępu do serwera Xrdp z sieci publicznych to zły pomysł. Jeśli klient nie ma stałego IP, aby zwiększyć poziom bezpieczeństwa, serwer powinien nasłuchiwać tylko localhost. Lepszym rozwiązaniem jest skonfigurowanie dostępu przez tunel SSH, który bezpiecznie przekieruje ruch z komputera klienta. Podobne podejście dla serwera VNC.
Połączenie z serwerem RDP
Aby pracować z środowiskiem pulpitu, lepiej stworzyć oddzielnego użytkownika bez uprawnień administracyjnych:
sudo adduser rdpuser 
Dodajemy użytkownika do grupy sudo, aby mógł rozwiązywać zadania związane z administracją. Jeśli nie ma takiej potrzeby, ten krok można pominąć:
sudo gpasswd -a rdpuser sudoMożna połączyć się z serwerem za pomocą dowolnego klienta RDP, w tym wbudowanego klienta usługi zdalnych pulpitów Windows. Jeśli Xrdp nasłuchuje na zewnętrznym interfejsie, nie będą potrzebne żadne dodatkowe działania. Wystarczy podać w ustawieniach połączenia adres IP VPS, nazwę użytkownika i hasło. Po połączeniu zobaczymy mniej więcej taki widok:

Po wstępnej konfiguracji środowiska pulpitu uzyskamy pełnoprawny pulpit. Jak widać, zużywa on niewiele zasobów, choć potem wszystko będzie zależało od używanych aplikacji.

Jeśli serwer Xrdp nasłuchuje tylko na localhost, na komputerze klienckim ruch należy przesłać przez tunel SSH (na VPS musi być uruchomiony sshd). W systemie Windows można użyć graficznego klienta SSH (na przykład PuTTY), a w systemach UNIX potrzebne jest narzędzie ssh:
ssh -L 3389:127.0.0.1:3389 -C -N -l rdpuser RDP_server_ipPo zainicjowaniu tunelu klient RDP łączy się już nie z zdalnym serwerem, ale z lokalnym hostem.
Z urządzeniami mobilnymi jest trudniej: trzeba kupić klientów SSH, którzy potrafią utworzyć tunel, a dodatkowo w iOS i iPadOS praca aplikacji w tle jest utrudniona przez zbyt dobrą optymalizację zużycia energii. Na iPhone'ie i iPadzie nie można utworzyć tunelu w osobnej aplikacji — potrzebna jest aplikacja-kombajn, która umie sama nawiązywać połączenie RDP przez SSH. Taką na przykład, jak .
Menadżer sesji i sesje użytkowników
Możliwość pracy wieloosobowej jest zrealizowana bezpośrednio w serwerze Xrdp i nie wymaga dodatkowej konfiguracji. Po uruchomieniu usługi przez systemd jeden proces działa w trybie demona, nasłuchuje na porcie 3389 i komunikuje się przez localhost z menedżerem sesji.
ps aux |grep xrdp 
sudo netstat -ap |grep xrdp 
Menedżer sesji nie jest zazwyczaj widoczny dla użytkowników, ponieważ ustalone w ustawieniach klienta login i hasło są mu przekazywane automatycznie. Jeśli to się nie zdarzy lub wystąpił błąd autoryzacji, zamiast pulpitu pojawi się interaktywne okno logowania.

Automatyczne uruchamianie menedżera sesji jest zapisane w pliku /etc/default/xrdp, a konfiguracja jest przechowywana w /etc/xrdp/sesman.ini. Domyślnie wygląda to mniej więcej tak:
[Globals]
ListenAddress=127.0.0.1
ListenPort=3350
EnableUserWindowManager=true
UserWindowManager=startwm.sh
DefaultWindowManager=startwm.sh
[Security]
AllowRootLogin=true
MaxLoginRetry=4
TerminalServerUsers=tsusers
TerminalServerAdmins=tsadmins
; Gdy AlwaysGroupCheck=false, dostęp będzie dozwolony
; jeśli grupa TerminalServerUsers nie jest zdefiniowana.
AlwaysGroupCheck=false
[Sessions]Tutaj nic nie trzeba zmieniać, należy tylko zakazać logowania z uprawnieniami root (AllowRootLogin=false). Dla każdego użytkownika autoryzowanego w systemie uruchamiany jest osobny proces xrdp: jeśli sesja zostanie odłączona, użytkownicy mogą w dalszym ciągu korzystać z procesów, a do sesji można się ponownie podłączyć. Ustawienia można zmienić w pliku /etc/xrdp/sesman.ini (sekcja [Sessions]).
Zmiana układów klawiatury
Z dwustronnym schowkiem nie ma zazwyczaj problemów, ale z rosyjskim układem klawiatury trzeba będzie trochę pokombinować (rosyjska lokalizacja powinna być już ). Edytujemy ustawienia klawiatury serwera Xrdp:
sudo nano /etc/xrdp/xrdp_keyboard.iniNa końcu pliku konfiguracyjnego należy dodać następujące linijki:
[rdp_keyboard_ru]
keyboard_type=4
keyboard_type=7
keyboard_subtype=1
model=pc105
options=grp:alt_shift_toggle
rdp_layouts=default_rdp_layouts
layouts_map=layouts_map_ru
[layouts_map_ru]
rdp_layout_us=us,ru
rdp_layout_ru=us,ruZostaje zapisać plik i zrestartować Xrdp:
sudo systemctl restart xrdpJak widać, uruchomienie serwera RDP na linuksowym VPS nie jest trudne, a w już przeanalizowaliśmy konfigurację VNC. Oprócz tych technologii istnieje jeszcze jedna ciekawa opcja: system X2Go, który wykorzystuje zmodyfikowany protokół NX 3. Zajmiemy się nim w następnej publikacji.
Źródło: habr.com
