VPS на Linux с графическим интерфейсом: запускаем сервер VNC на Ubuntu 18.04 +32




Некоторые пользователи арендуют относительно недорогие VPS с Windows для запуска сервиса удаленных рабочих столов. То же самое можно сделать и на Linux без размещения в датацентре собственного железа или аренды выделенного сервера. Кому-то нужна привычная графическая среда для тестов и разработки или удаленный десктоп с широким каналом для работы с мобильных устройств. Есть масса вариантов применения основанной на протоколе Remote FrameBuffer (RFB) системы Virtual Network Computing (VNC). В небольшой статье мы расскажем, как настроить ее на виртуальной машине с любым гипервизором..

Оглавление:


Выбор сервера VNC
Установка и настройка
Запуск службы через systemd
Подключение к рабочему столу

Выбор сервера VNC


Сервис VNC может быть встроен в систему виртуализации, при этом гипервизор свяжет его с эмулируемыми устройствами и никакой дополнительной настройки не потребуется. Этот вариант предполагает значительные накладные расходы и поддерживается далеко не всеми провайдерами — даже в менее ресурсоемкой реализации, когда вместо эмуляции реального графического устройства виртуальной машине передается упрощенная абстракция (фреймбуфер). Иногда VNC-сервер привязывается к работающему X-серверу, но этот способ больше подходит для доступа к физической машине, а на виртуальной он создает ряд технических сложностей. Проще всего установить VNC-сервер со встроенным X-сервером. Он не требует наличия физических устройств (видеоадаптера, клавиатуры и мыши) или их эмуляции с помощью гипервизора, а потому подходит для VPS любого типа.

Установка и настройка


Нам потребуется виртуальная машина с Ubuntu Server 18.04 LTS в конфигурации по умолчанию. В стандартных репозиториях этого дистрибутива есть несколько серверов VNC: TightVNC, TigerVNC, x11vnc и прочие. Мы остановились на TigerVNC — актуальном форке не поддерживаемого разработчиком TightVNC. Настройка других серверов выполняется сходным образом. Также нужно выбрать окружение рабочего стола: оптимальным, на наш взгляд, вариантом будет XFCE из-за относительно невысоких требований к вычислительным ресурсам. Желающие могут установить другой DE или WM: тут все зависит от личных предпочтений, однако выбор ПО напрямую влияет на потребность в оперативной памяти и вычислительных ядрах.

image


Установка окружения рабочего стола со всеми зависимостями выполняется следующей командой:

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/vncserver@.service

Символ @ в имени позволяет передавать аргумент для настройки службы. В нашем случае он задает порт дисплея 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 vncserver@1.service

Цифра 1 в имени задает номер экрана.

Останавливаем сервер VNC, запускаем его как службу и проверяем статус:

# от имени пользователя 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 задает login для удаленного входа в систему.

После настройки туннеля на локальном компьютере необходимо запустить клиент VNC и установить соединение с хостом 127.0.0.1:5901 (localhost:5901), использовав для доступа к серверу VNC заданный ранее пароль. Теперь мы можем безопасно взаимодействовать через шифрованный туннель с графическим окружением рабочего стола XFCE на VPS. На скриншоте в эмуляторе терминала запущена утилита top, чтобы показать незначительное потребление виртуальной машиной вычислительных ресурсов. Дальше все будет зависеть от пользовательских приложений.


Установить и настроить сервер VNC в Linux можно практически на любом VPS. Для этого не нужны дорогостоящие и ресурсоемкие конфигурации с эмуляцией видеоадаптера или покупка коммерческих лицензий на программное обеспечение. Помимо рассмотренного нами варианта системной службы есть и другие: запуск в режиме демона (через /etc/rc.local) при загрузке системы или по требованию через inetd. Последний интересен для создания многопользовательских конфигураций. Интернет-суперсервер запустит сервер VNC и свяжет с ним клиента, а VNC-сервер создаст новый экран и начнет сессию. Для аутентификации внутри нее можно использовать графический дисплейный менеджер (например, LightDM), а после отключения клиента сессия будет закрыта и все работающие с экраном программы завершены.

Теги:




Комментарии (30):

  1. suffix_ixbt
    /#21844606 / +1

    ИМХО — неудобно так подключаться — расширили бы статью включив установку и настройку ещё и tomcat+guacamole (который кстати кроме vnc ещё и rdp поддерживает).

    • polearnik
      /#21844650

      зачем если есть remmina?

      • suffix_ixbt
        /#21844664 / +1

        remmina клиент который нужно устанавливать что не всегда возможно, а tomcat+guacamole позволяет подключать откуда угодно просто из браузера.

        • oldadmin
          /#21844750

          К консоли наших VPS из браузера можно подключаться из личного кабинета без дополнительных настроек. По умолчанию на Ubuntu Server есть только текстовый интерфейс, но при необходимости устанавливается пакет (x | k)ubuntu-desktop и после этого будет доступно полноценное графическое окружение. К сожалению подключение из браузера неудобно для длительной работы, обычно оно используется, если заказчик теряет доступ по ssh из-за некорректных настроек. Вариант с сервером VNC пригоден для полноценной работы (примерно как в RDP в Windows). Настройке сервера RDP в Ubuntu будет посвящена следующая статья.

          • suffix_ixbt
            /#21844792

            К сожалению подключение из браузера неудобно для длительной работы

            Больше года работаю — полёт нормальный (учитывая что кроме vnc и rdp связка tomcat+guacamole ещё и ssh доступ предоставляет).


            Серьёзно — попробуйте — вдруг понравится и в статью следующую про rdp добавите.

            • oldadmin
              /#21844812

              Существует более одного пути к той же цели. Если вам нравится эта связка — используйте ее. Мы просто предлагаем другую :-)

  2. polearnik
    /#21844654 / +1

    если vnc трафик все равно заворачивается в ssh туннель зачем тогда пароль на vnc?

    • oldadmin
      /#21844770

      Уязвимостями тоже нельзя пренебрегать, даже если сервер VNC слушает только localhost и не доступен из сетей общего пользования. В исследовании «Лаборатории Касперского» сказано, что создание сложного пароля затрудняет взлом сервера.

    • zirf
      /#21845150

      Не так все весело при инициализации
      $ vncserver -SecurityTypes=none
      не создаст файл .vnc/passwd, но клиенты не все это понимают.
      Зато они позволяют сохранят пароль или брать его из файла.

  3. unwrecker
    /#21844732

    Почему не x2go? Там сразу через SSH

    • oldadmin
      /#21844790

      Потому что конвейер лучше комбайна — это unixway. X2Go использует модифицированный протокол NX 3, что приводит к ограничениям на клиентское ПО. Насколько нам известно, там есть и проблемы совместимости с некоторыми графическими средами рабочего стола под Linux. Наш вариант более универсальный. Он позволяет использовать любой клиент VNC и не имеет особых ограничений в части гипервизора, а также развёрнутого на сервере ПО с графическим интерфейсом.

  4. zirf
    /#21844934

    Интересно зачем ssh туннель, если tigervnc поддерживает крючок -SecurityTypes? Там даже не один метод. Потом ставится он проще: sudo apt install -y tigervnc-standalone-server, common автоматом ставится, это зависимость. SSH туннель не очень удобен на андроиде, port forwarding зачастую платная фишка. Termux требует дополнительного телодвижения.

  5. vlad49
    /#21845250 / +1

    Интересно, как получить на убунту некий аналог виндового терминального сервера? Чтобы при коннекте через vnc (или rdp) получали бы гномовское окно авторизации, логинились в нем и работали. Самое главное — чтобы это было мультисессионным решением — чтобы можно было коннектиться нескольким людям одновременно под разными аккаунтами к одному серверу под одним портом. Сходу не гуглится, одни костыли предлагают.

    • identw
      /#21845618

      Да, такое можно сделать. Даже можно такое провернуть и для rdp, помню делал это c помощью xrdp.

    • zirf
      /#21848492

      xrdp работает следующим образом. Пасет порт 3389. Далее коннектится к локальному серверу xorg, vnc и так далее, это задается в конфиге, он .ini а-ля Windows. Там уже спрашиваетя пароль системы для xorg, адрес и пароль для vnc и так далее. Внешне это аыглядит так клиет выдает получает графическое окошко где сверху выбор целевой системы а далее специфичные для нее параметры. В общем, xrdp своего рода прокси.

      • mihmig
        /#21848620

        И получаем вот такой привет из 90-х:
        image

        Не вздумайте показывать этот xrdp заказчику/руководителю

  6. litos
    /#21845422

    В X-сервере есть модуль который отдает видео через VNC
    Можно его использовать
    Примерно так http://blog.ispsystem.info/2018/11/linux-vnc.html


    Ну и оболочка подходит любая которая не требует 3d видеоускорения, то есть пойдёт xfce/mate/lxd итп, но никаких gnome3/cinnamon (

    • 13werwolf13
      /#21847302

      Спасибо за ссылку, очень вовремя наткнулся на неё.

  7. mihmig
    /#21845820

    Не подскажете — как добавить русскую расклаку клавиатуры на Ubuntu 16.04 изначально без русской локали?
    В настройках кнопка добавить почему-то недоступна:
    image
    Остальные выпадающие списки тоже пустые…

    • Tihon_V
      /#21846982

      Вероятно, не настроены локали
      Попробуйте это:


      dpkg-reconfigure locales

      • mihmig
        /#21847484

        Нет, не помогло, кнопка Add по прежнему неактивна.
        Гугл выдаёт либо советы править xorg.conf (которого давно нет в системах) либо такие же вопросы без ответа…

        • Oxyd
          /#21862170

          Того чего нет, всегда можно добавить. Никто не мешает его добавить и он, как ни странно, будет работать. А то и вовсе можно дать в консоли какую-нибудь такую команду.

          setxkbmap -layout us,ru -option grp:alt_space_toggle compose:ralt 
          И раскладки, волшебным образом, начнут переключаться по Alt-Space, а на правом альте появится волшебная кнопочка Compose, позволяющая, при своём зажатии, рисовать всякие интересные символы из нескольких ( ? > < ? например)

  8. Tangeman
    /#21846100 / +4

    Основное отличие любого VNC от любого RDP — это потребляемые ресурсы. Первые очень прожорливы и требуют широкого канала для комфортной работы, всё что меньше 100 Mbit будет неприятно ощутимо. При включении компресии и прочих фишек для оптимизации ощутимо повышается нагрузка со стороны сервера (если это "недорогой" VPS).


    Если на сервере только текстовые окна, терминалы там и прочее — то всё ещё более-менее, но про графику и тем более видео без сжатия (и соответственно ощутимой потери качества) можно забыть если у вас меньше чем 1Gbit канал.


    VNC это что-то вроде стриминга, в то время как RDP это более высокуровневая штука — нечто вроде X11, когда клиент получает команды на отрисовку а не картинку, соответственно, он менее требователен к ресурсам со стороны сервера и канала.


    Ради эксперимента — запустите видео через VNC и попробуйте что-то сделать в других окнах, если у вас нет хотя бы 100Mbit то получится с трудом. В то же время RDP вполне себе живёт даже на 10 Mbit, не затрудняя работы. И нет, проблема не только с видео — нагруженное IDE (типа JetBrains) тоже весьма хорошую нагрузку создает (особенно во время скроллинга), простое и банальное перемещение окон ощутимо тормознуто, в то время как по RDP это практически не ощутимо даже на слабых каналах.


    Дальше — редко какие VNC позволяют делать нормальный copy&paste (под нормальным я имею в виду не только текст, но также картинки и вообще файлы), не говоря уже про другие ресурсы (расшаренные диски etc), но даже если и умеют то всё равно без бубна и танцев не обойтись.


    Если же завернуть VNC в VPN и/или SSH, да ещё по низкоскоростному (со стороны клиента) каналу и до сравнительно слабого VPS то работать так можно только от безысходности.


    В общем, VNC вне широкополосных каналов и мощного желела имеет довольно узкую область применения, а если ограничиваться "тонкими" окошками с текстами (которые редко меняются и не скроллятся часто), то нужен ли он вообще?

    • r0mik
      /#21847082

      очень странно, что кто-то еще «мнет» этот тормозной VNC, который годен разве что для установки/восстановления ОС, когда как есть более нормальное и правильное решение — QXL/SPICE.

    • apple01
      /#21847130

      Полностью согласен про прожорливость VNC. Используем в основном в LAN для поддержки пользователей, только из-за того что экран не закрывается для пользователся как в случае с RDP, ну и на Mаках, у них VNC нативно присутствует в Mac OS.

  9. kharlashkin
    /#21846604

    Эм… Почему не Spice?

  10. mihmig
    /#21847488

    Буфер обмена не работает…