Деякі користувачі орендують відносно недорогі VPS із Windows для запуску сервісу віддалених робочих столів. Те саме можна зробити і на Linux без розміщення в датацентрі власного заліза або оренди виділеного сервера. Комусь потрібне звичне графічне середовище для тестів та розробки або віддалений десктоп із широким каналом для роботи з мобільних пристроїв. Є безліч варіантів застосування заснованої на протоколі Remote FrameBuffer (RFB) системи Virtual Network Computing (VNC). У невеликій статті ми розповімо, як налаштувати її на віртуальній машині з будь-яким гіпервізором.
Зміст:
Вибір сервера VNC
Сервіс VNC може бути вбудований у систему віртуалізації, при цьому гіпервізор зв'яже його з емульованими пристроями і ніякого додаткового налаштування не потрібно. Цей варіант передбачає значні накладні витрати і підтримується далеко не всіма провайдерами — навіть менш ресурсомісткою реалізації, коли замість емуляції реального графічного пристрою віртуальній машині передається спрощена абстракція (фреймбуфер). Іноді VNC-сервер прив'язується до працюючого X-сервера, але цей спосіб більше підходить для доступу до фізичної машини, а на віртуальній він створює низку технічних складнощів. Найпростіше встановити VNC-сервер із вбудованим X-сервером. Він не вимагає наявності фізичних пристроїв (відеоадаптера, клавіатури та миші) або їх емуляції за допомогою гіпервізора, тому підходить для VPS будь-якого типу.
Встановлення та налаштування
Нам потрібна віртуальна машина з Ubuntu Server 18.04 LTS у конфігурації за промовчанням. У стандартних репозиторіях цього дистрибутива є кілька серверів VNC:
Встановлення оточення робочого столу з усіма залежностями виконується наступною командою:
sudo apt-get install xfce4 xfce4-goodies xorg dbus-x11 x11-xserver-utils
Далі необхідно інсталювати сервер VNC:
sudo apt-get install tigervnc-standalone-server tigervnc-common
Запускати його з правами суперкористувача – погана ідея. Створюємо користувача та групу:
sudo adduser vnc
Додамо користувача до групи sudo, щоб він міг вирішувати пов'язані з адмініструванням завдання. Якщо такої потреби немає, цей крок можна пропустити:
sudo gpasswd -a vnc sudo
На наступному кроці потрібно запустити сервер VNC із привілеями користувача vnc, щоб створити безпечний пароль та конфігураційні файли в каталозі ~/.vnc/. Довжина пароля може бути від 6 до 8 символів (зайві обрізаються). За потреби також задається пароль лише перегляду, тобто. без доступу до клавіатури та миші. Наступні команди виконуються від імені користувача vnc:
su - vnc
vncserver -localhost no
За замовчуванням протокол RFB використовує діапазон TCP-портів від 5900 до 5906 це т.зв. порти дисплея, кожен із яких відповідає екрану X-сервера. При цьому порти асоційовані з екранами від :0 до :6. Запущений екземпляр сервера VNC слухає порт 5901 (екран :1). Інші екземпляри можуть працювати на інших портах з екранами :2, :3 і т. д. Перед подальшим налаштуванням потрібно зупинити сервер:
vncserver -kill :1
Команда повинна вивести приблизно таке повідомлення: Killing Xtigervnc process ID 18105 ... success!
При запуску TigerVNC виконує сценарій ~/.vnc/xstartup для налаштування параметрів конфігурації. Створимо власний скрипт, попередньо зберігши резервну копію існуючого, якщо він існує:
mv ~/.vnc/xstartup ~/.vnc/xstartup.b
nano ~/.vnc/xstartup
Сеанс оточення робочого столу XFCE запускається наступним скриптом xstartup:
#!/bin/bash
unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS
xrdb $HOME/.Xresources
exec /usr/bin/startxfce4 &
Команда xrdb потрібна, щоб система VNC прочитала файл .Xresources у домашньому каталозі. Там користувач може визначити різні параметри графічного робочого столу: рендеринг шрифтів, кольори терміналу, курсорні теми і т.д. Сценарій необхідно зробити таким, що виконується:
chmod 755 ~/.vnc/xstartup
На цьому налаштування сервера VNC завершено. Якщо запустити його командою vncserver -localhost no (від імені користувача vnc), можна буде підключитися із заданим паролем і побачити таку картину:
Запуск служби через systemd
Ручний запуск сервера VNC погано підходить для бойового застосування, тому ми настроїмо системну службу. Команди виконуються від імені root (використовуємо sudo). Для початку створюємо новий юніт-файл для нашого сервера:
sudo nano /etc/systemd/system/[email protected]
Символ @ в імені дозволяє передавати аргумент для налаштування служби. У нашому випадку він задає порт VNC-дисплея. Юніт-файл складається з кількох розділів:
[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.target
Потім потрібно повідомити systemd про появу нового файлу та активувати його:
sudo systemctl daemon-reload
sudo systemctl enable [email protected]
Цифра 1 вказує номер екрана.
Зупиняємо сервер VNC, запускаємо його як службу та перевіряємо статус:
# от имени пользователя vnc
vncserver -kill :1
# с привилегиями суперпользователя
sudo systemctl start vncserver@1
sudo systemctl status vncserver@1
Якщо служба працює, ми маємо отримати приблизно такий результат.
Підключення до робочого столу
Наша конфігурація не використовує шифрування, тому мережні пакети можуть бути перехоплені зловмисниками. До того ж у VNC-серверах досить часто
sudo netstat -ap |more
У Linux, FreeBSD, OS X та інших UNIX-подібних ОС тунель з клієнтського комп'ютера робиться за допомогою утиліти ssh (на сервері VNC має бути запущений sshd):
ssh -L 5901:127.0.0.1:5901 -C -N -l vnc vnc_server_ip
Опція -L прив'язує порт 5901 віддаленого підключення до порту 5901 localhost. Опція -C включає стиснення, а -N вказує на утиліту ssh на відсутність необхідності виконувати віддалену команду. Опція -l визначає login для віддаленого входу в систему.
Після налаштування тунелю на локальному комп'ютері необхідно запустити клієнт VNC та встановити з'єднання з хостом 127.0.0.1:5901 (localhost:5901), використовуючи для доступу до сервера VNC заданий пароль. Тепер ми можемо безпечно взаємодіяти через шифрований тунель із графічним оточенням робочого столу XFCE на VPS. На скріншоті в емуляторі терміналу запущено утиліту top, щоб показати незначне споживання віртуальною машиною обчислювальних ресурсів. Далі все буде залежати від додатків користувача.
Встановити та налаштувати сервер VNC у Linux можна практично на будь-якому VPS. Для цього не потрібні дорогі та ресурсомісткі конфігурації з емуляцією відеоадаптера або придбання комерційних ліцензій на програмне забезпечення. Крім розглянутого нами варіанта системної служби, є й інші: запуск у режимі демона (через /etc/rc.local) при завантаженні системи або на вимогу через inetd. Останній цікавий для створення розрахованих на багато користувачів конфігурацій. Інтернет-суперсервер запустить сервер VNC та зв'яже з ним клієнта, а VNC-сервер створить новий екран та розпочне сесію. Для автентифікації в ній можна використовувати графічний дисплейний менеджер (наприклад,
Джерело: habr.com