company_banner

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


    Некоторые пользователи арендуют относительно недорогие 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), а после отключения клиента сессия будет закрыта и все работающие с экраном программы завершены.

    RUVDS.com
    VDS/VPS-хостинг. Скидка 10% по коду HABR

    Комментарии 37

      +1

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

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

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

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

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


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

                0
                Существует более одного пути к той же цели. Если вам нравится эта связка — используйте ее. Мы просто предлагаем другую :-)
        +1
        если vnc трафик все равно заворачивается в ssh туннель зачем тогда пароль на vnc?
          0
          Уязвимостями тоже нельзя пренебрегать, даже если сервер VNC слушает только localhost и не доступен из сетей общего пользования. В исследовании «Лаборатории Касперского» сказано, что создание сложного пароля затрудняет взлом сервера.
            0

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

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

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

                +1

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

                  0
                  Ну X2GO собственно.
                    0

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

                      0

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

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

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

                          Варианты кастомизации для любителей эстетики
                          https://c-nergy.be/blog/?p=12453

                            0

                            Там вроде можно сразу пускать в логин системы, и будет обычное окно логина рабочего окружения (gnome, kde, xfce и т.д.).

                          0
                          Достаточно использовать правильный display manager.
                            0

                            Скоро станет возможным совместное подключение к общим терминальным сеансам с оконным текстовым пользовательским интерфейсом. Проект по ссылке внизу претендует стать заменой текстовых терминальных сессий и быть "рабочим столом" для операционных систем без графического интерфейса. Чтобы посмотреть как это работает, можно открыть несколько одновременных подключений к демо-серверу через любой терминал с поддержкой отслеживания мыши (например WindowsTerminal, kitty, Gnome Terminal):


                            ssh vtm@netxs.online


                            https://github.com/netxs-group/VTM

                            0

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


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

                              0

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

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

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


                                dpkg-reconfigure locales
                                  0
                                  Нет, не помогло, кнопка Add по прежнему неактивна.
                                  Гугл выдаёт либо советы править xorg.conf (которого давно нет в системах) либо такие же вопросы без ответа…
                                    0
                                    Того чего нет, всегда можно добавить. Никто не мешает его добавить и он, как ни странно, будет работать. А то и вовсе можно дать в консоли какую-нибудь такую команду.
                                    setxkbmap -layout us,ru -option grp:alt_space_toggle compose:ralt 
                                    И раскладки, волшебным образом, начнут переключаться по Alt-Space, а на правом альте появится волшебная кнопочка Compose, позволяющая, при своём зажатии, рисовать всякие интересные символы из нескольких ( ₽ → ← ≥ например)
                                +5

                                Основное отличие любого 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 вне широкополосных каналов и мощного желела имеет довольно узкую область применения, а если ограничиваться "тонкими" окошками с текстами (которые редко меняются и не скроллятся часто), то нужен ли он вообще?

                                  0
                                  очень странно, что кто-то еще «мнет» этот тормозной VNC, который годен разве что для установки/восстановления ОС, когда как есть более нормальное и правильное решение — QXL/SPICE.
                                    0
                                    Полностью согласен про прожорливость VNC. Используем в основном в LAN для поддержки пользователей, только из-за того что экран не закрывается для пользователся как в случае с RDP, ну и на Mаках, у них VNC нативно присутствует в Mac OS.
                                      0
                                      Спасибо, информативно!
                                      0

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

                                        0
                                        я лет пять назад пробовал запилить удалённый рабочий стол на spice — не вышло, плюс скорость от VNC отличалась не очень.
                                          0
                                          Я когда-то экспериментировал, мне Spice понравился намного больше.

                                          Я даже потом на функционале LTSP + Spice поднял что-то типа VDI. Старичок на Cel 1,4 512 Ram позволял работать в интернете (web-серфинг), с документами (doc, xls) и в 1С.
                                            0
                                            спасибо, выглядит интересно, надо снова попробовать.
                                        0
                                        Буфер обмена не работает…
                                          0
                                          а ничего, что в той же бунте есть remote desktop, зачем ещё что-то ставить и городить огород?

                                          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                          Самое читаемое