Някои потребители наемат относително евтини VPS с Windows за стартиране на услуга за отдалечен работен плот. Същото може да се направи и на Linux без да се хоства собствено оборудване в датацентър или да се наема выделен сървър. Някому е необходим познат графичен интерфейс за тестове и разработка или отдалечен десктоп с широк канал за работа с мобилни устройства. Има много приложения на системата Virtual Network Computing (VNC), базирана на протокола Remote FrameBuffer (RFB). В кратка статия ще разкажем как да я настроите на виртуална машина с какъвто и да е хипервизор.
Съдържание:
Избор на VNC сървър
VNC услугата може да бъде интегрирана в системата за виртуализация, като хипервизорът я свързва с емулираните устройства и не е нужна допълнителна настройка. Тази опция предполага значителни разходи и не се поддържа от всички доставчици — дори в по-малко ресурсоемка реализация, когато на виртуалната машина вместо емулация на реално графично устройство се предава опростена абстракция (фреймбуфер). Понякога VNC сървърът е свързан с работещ X сървър, но този метод е повече подходящ за достъп до физическа машина, а на виртуалната създава редица технически сложности. Най-лесно е да инсталирате VNC сървър с вграден X сървър. Той не изисква наличието на физически устройства (видеокарта, клавиатура и мишка) или тяхната емулация чрез хипервизор, поради което е подходящ за VPS от всякакъв тип.
Инсталиране и настройка
Нуждаем се от виртуална машина с Ubuntu Server 18.04 LTS в конфигурация по подразбиране. В стандартните репозитории на този дистрибутив има няколко VNC сървъра: , , и други. Ние избрахме TigerVNC — актуален форк на неподдържания от разработчика TightVNC. Настройката на другите сървъри се извършва по сходен начин. Също така е необходимо да се избере работна среда: оптималният вариант, в нашето мнение, е XFCE поради относително ниските изисквания към изчислителните ресурси. Желаещите могат да инсталират друга DE или WM: тук всичко зависи от личните предпочитания, но изборът на софтуер директно влияе на нуждите от оперативна памет и изчислителни ядра.

Инсталирането на работната среда с всички зависимости се извършва със следната команда:
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Командата трябва да върне приблизително следното съобщение: «Убийство на процеса Xtigervnc ID 18105… успешно!».
При стартиране 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). Първо създаваме нов unit файл за нашия сървър:
sudo nano /etc/systemd/system/vncserver@.serviceСимволът @ в името позволява предаване на аргумент за настройка на услугата. В нашия случай той задава порта на VNC дисплея. Unit файлът се състои от няколко раздела:
[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 vncserver@1.serviceЦифрата 1 в името задава номера на екрана.
Спираме VNC сървера, стартираме го като услуга и проверяваме статусa:
# от имени пользователя vnc
vncserver -kill :1# с привилегиями суперпользователя
sudo systemctl start vncserver@1
sudo systemctl status vncserver@1Ако услугата работи, трябва да получим приблизително такъв резултат.

Свързване към работния плот
Нашата конфигурация не използва криптиране, поради което мрежовите пакети могат да бъдат прихванати от злонамерени лица. Освен това в VNC сървъри често , така че не е разумно да ги отваряте за достъп от интернет. За безопасно свързване на локалния компютър, трафикът трябва да бъде опакован в SSH тунел, след което да се настрои VNC клиента. Под Windows може да се използва графичен SSH клиент (например, PuTTY). За безопасност TigerVNC на сървъра слуша само localhost и не е достъпен директно от публични мрежи:
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 задава логин за отдалечен достъп до системата.
След настройката на тунела на локалния компютър, е необходимо да стартирате VNC клиента и да установите връзка с хоста 127.0.0.1:5901 (localhost:5901), използвайки зададения по-рано парола за достъп до VNC сървъра. Сега можем безопасно да взаимодействаме през криптиран тунел с графичното работно обкръжение XFCE на VPS. На скрийншота в терминалния емулятор е стартирана утилитата top, за да покаже незначителното потребление на ресурси от виртуалната машина. Оттук нататък всичко зависи от потребителските приложения.

Инсталирането и настройването на VNC сървър в Linux може да се извърши практически на всякакъв VPS. За това не са необходими скъпи и ресурсно натоварващи конфигурации с емулация на видео адаптер или закупуване на търговски лиценз за софтуер. Освен разглеждания вариант на системна услуга, има и други: стартиране в режим на демон (чрез /etc/rc.local) при стартиране на системата или по искане чрез inetd. Последният е интересен за създаване на многопотребителски конфигурации. Интернет суперсървърът ще стартира VNC сървър и ще свърже клиента, а VNC сървърът ще създаде нов екран и ще започне сесия. За удостоверяване в нея може да се използва графичен дисплейен мениджър (например, ), а след като клиентът се отключи, сесията ще бъде затворена и всички програми, работещи на екрана, ще бъдат приключени.
Източник: habr.com
