VNC, RDP и прочие прелести удаленных десктопов

Не консолью единой жив линуксоид. Желание поработать на удаленной системе в графике — это на данный момент не роскошь. Пусть злобно и мерзко хихикают труъ-адепты консоли, а мы попробуем сделать краткий обзор средств для организации удаленного десктопа. Можно придумать множество задач и соответствующих условий, в которых для решения требуется графика — от помощи коллеге по сети до организации тонких клиентов в вычислительных сетях. Куда приложить силы?


Великий мозг человека для решения задач удаленного доступа предлагает
как минимум два протокола, то бишь VNC и RDP, первый из которых
преимущественно используется в *nix, а второй активно продвигается в
Windows. Также нужно упомянуть про такую вещь как FreeNX, позволяющую
гонять пакеты графических данных поверх ssh.

Основное отличие
VNC от RDP состоит в следующем. VNC использует TCP и соответственно
потери пакетов невелики. Поэтому в VNC практически не бывает эффекта
«необновленной области», в отличие от RDP, гоняющему свои пакеты
посредством UDP. Однако, по этой же причине RDP является куда более
быстрым протоколом — интерактивность и скорость отрисовки окон с
удаленного сервера при использовании RDP существенно выше.

Поскольку
RDP пришел к нам из Windows и его Terminal Services, у большинства
реализаций RDP архитектура одинакова. В частности, при каждом логине
запускается новый сеанс и приходится заново запускать все свои
программы. *nix-аналогом такого поведения является классический
клиент-серверный X, в котором серверная часть «слушает» порт на
сервере, а клиент подключается напрямую через клиентский Х или при
необходимости через Xnest и получает себе полноценный удаленный рабочий
стол. Нужно отметить, что для реализации тонких клиентов имеющиеся
возможности Х-сервера предпочтительнее, чем VNC или RDP.

В отличие от
RDP и Х-сессий, VNC сохраняет состояние рабочего стола от логина к
логину и все запущенные программы работают и при отсутствии
подключенного пользователя. А что если я хочу получить одновременно
сохранение сессий VNC и быстроту RDP? Да, существует инструментарий для
поддержки RDP под *nix, при этом графические данные могут быть напрямую
получены им из vnc-сервера. Решение называется (кто бы мог подумать!)
xrdp. Авторы предупреждают о возможной небезопасности xrdp, поэтому не
рекомендуют применять его в незащищенной сети. Однако ничто не мешает
использовать xrdp в собственной подсети, доступ к которой извне
осуществляется через роутер с закрытым 3389 портом 🙂

Попробуем осуществить задуманное на практике. В качестве подопытного сервера будет взят tightvnc, к которому мы попробуем прикрутить xrdp. Для начала ставим собственно сервер той командой, которая является родной для вашего дистрибутива:

[root@sakura ~]# pacman -S tightvnc

После нехитрых манипуляций с пакетами в районе /usr/bin должна появиться программка vncserver. Она собственно и дает доступ к серверу. Однако, для ее использования неплохо бы запаролить удаленный десктоп, что делается при помощи утилиты vncpasswd.

[heilage@sakura ~]$ vncpasswd
Using password file /home/heilage/.vnc/passwd
VNC directory /home/heilage/.vnc does not exist, creating.
Password:
Warning: password truncated to the length of 8.
Verify:
Would you like to enter a view-only password (y/n)? n

Что сделали:
Во-первых, создали папку ~/.vnc в которой будут содержаться конфиги и лок-файлы сервера. Заметим, что запуск ведется из-под обычного юзера, а не от рута. Во-вторых, создали файл passwd и ввели пароль, который неожиданно обрезался до 8 символов. Не беда, при входе вводимый пароль тоже обрезается. В-третьих, нам предложили ввести view-only пароль. Это отдельный пароль, который позволяет одновременно подключить к серверу еще одного клиента, который сможет только видеть ваши действия, но не сможет что-либо делать сам. Допустимо подключение и нескольких полноправных клиентов под одним и тем же паролем, однако при этом могут возникнуть непредвиденные ошибки. Такие манипуляции нужно будет проделать с каждым юзером, которому требуется отдельный доступ по vnc.

Можно протестировать сервер, запустив его от имени пользователя.

[heilage@sakura ~]$ vncserver
vncserver: couldn’t find «xauth» on your PATH.

Опаньки. Если не поставлено xauth — нужно его доустановить.

[root@sakura ~]# pacman -Ss xauth
extra/xorg-xauth 1.0.3-1
X.Org authorization settings program
[root@sakura ~]# pacman -S xorg-xauth

Теперь запускаем и…

[heilage@sakura ~]$ vncserver

New ‘X’ desktop is sakura:1

Creating default startup script /home/heilage/.vnc/xstartup
Starting applications specified in /home/heilage/.vnc/xstartup
Log file is /home/heilage/.vnc/sakura:1.log

[heilage@sakura ~]$

Все запустилось. Можно попробовать подключиться и узреть чистый рабочий стол с запущенным twm. А можно и не узреть — если в ~/.vnc/xstartup не задан запуск никакого менеджера рабочего стола (или этот менеджер не установлен), то все, что мы увидим — это крестик курсора. В таком случае отрубаемся:

[heilage@sakura ~]$ vncserver -kill :1
Killing Xvnc process ID 2251

И редактируем ~/.vnc/xstartup, помещая туда что-то вроде

#!/bin/bash
exec fluxbox

После чего заново запускаем vncserver.
Пытаемся коннектиться на порт 5901 (для дисплея :1)… и получаем отлуп. Забыли добавить разрешение на коннект. Открываем рутом /etc/hosts.allow и добавляем строчку

vncserver: ALL

Заново коннектимся и вуаля. Вроде бы удалось %)
helage-flux2.pngVNC подняли, можно потыкать настройки флюксбокса и воткнуть уже наконец xrdp. xrdp нашлось только в AUR, что в общем тоже неплохо.

[heilage@sakura ~]$ yaourt xrdp
1 aur/xrdp 0.4.1-1 (14)
An open source remote desktop protocol(rdp) server

Вообще говоря, при голой установке в окрестностях /usr/local/xrdp образуется скрипт xrdp_control.sh, при помощи коего можно управлять этими граблями. Однако в моем случае этот скрипт вполне логичным образом переехал в /etc/rc.d/, поскольку такое расположение стартовых скриптов характерно для archlinux. Стартуем:

[root@sakura ~]# /etc/rc.d/xrdp start
Starting: xrdp and sesman . . .
[root@sakura ~]#

Кажется все хорошо. Пытаемся присоединиться с другой машины через rdesktop:

rdesktop -a 16 -g 1024×685 sakura

Получаем входное окно xrdp примерно такого вида:

heilage-xrdp.png

Судя по выпадающему списку, возможности по передаче чего бы то ни было over RDP достаточно велики. Нам пригодится пункт vnc-any, выбрав который, нужно будет заполнить поля ip, port и password, после чего по нажатию кнопки ОК откроется VNC-десктоп. ip известен (в нашем случае это localhost), порт — здесь нужно будет вспомнить, какой экран занял vnc-сервер. Если заущен только один vnc, то с большой степенью уверенности можно сказать, что он занял экран :1, поэтому порт у него будет 5901. Соответственно для экрана :2 будет порт 5902 и так далее.

Пытаемся нажать ОК — и вылетаем по security error =( По какой-то неведомой причине наши грабли стучатся на порт 5910 независимо от того, что указано в поле port. Лезем в /etc/xrdp/xrdp.ini и удаляем в нем все, что нам не нужно (по каким-то причинам комментирование не работает должным образом). Оставим секцию [globals], ибо без нее никуда, и секцию у которой name=vnc-any, приведя ее к следующему виду:

[xrdp3]
name=vnc-any
lib=libvnc.so
ip=127.0.0.1
port=5901
username=na
password=здесь_наш_пароль_к_vnc

Формат предельно ясен. Теперь можно подключиться заново, после чего достаточно всего один раз нажать кнопку ОК. Вылезет окошко лога, после чего откроется рабочий стол.

heilage-xrdp2.png

Следует заметить, что работающий xrdp ничуть не мешает подключаться по vnc к тому же столу. Теперь можно открыть какое-нибудь окно и потаскать его быстро туда-сюда. Разница очевидна. Реакция рабочего стола также значительно улучшается по сравнению с обычным vnc.

Подведем некоторые итоги.
Кому это нужно: внезапно, администраторам локальных сетей. Преимущества подхода:

  • Не нужно держать два разных клиента для подключения к различным платформам.
  • Скорость работы удаленного десктопа *nix систем существенно повышается, при этом не теряются никакие преимущества vnc (например сохранение сессий).

Недостатки:

  • Программа xrdp недостаточно проработана и строго говоря довольно сыра. Поэтому страдает функциональность и аспекты безопасности. Рекомендуется использовать фильтр пакетов для защиты от несанкционированного исп
    ользования.

VNC, RDP и прочие прелести удаленных десктопов: 4 комментария

  1. В локальной сети гонять полный десктоп, конечно, можно, но в подавляющем большинстве случаев не нужно.
    ssh remote-host
    export DISPLAY=my-host:0.0
    gui-gluk &
    Когда о закрытости трафика можно не волноваться, этого за глаза. Туннелирование иксового трафика через ssh отдельный разговор.

  2. Во первых. Поздраляю, зрелая интересная статья получилась, было интересно почитать.
    Во вторых. Тут немного поворчу.
    «Также нужно упомянуть про такую вещь как FreeNX, позволяющую гонять пакеты графических данных поверх ssh.»
    Я бы NX по функциональности на первое место поставил, по сравнению даже с rdp реально работает шустрее, стабильнее и трафика мало ест! В клнтексте чисто линуксовых сессий предпочтительнее все таки ее использовать.
    Если будет желание ждемс продолжение по раскрытию особенностей рализных реализаций протоколов доступа к рабочему столу.
    С наилучшими пожеланиями!

  3. Да, я тоже весьма наслышан про FreeNX и ее очевидные плюсы включая передачу аналогично rdp но только еще и со сжатием трафика. Однако по каким-то причинам пока что ее не осилил. Как осилю — будет продолжение х)

  4. Ага, ценное дополнение. Туннелирование Х через ssh это интересная штука, полезна если требуется зайти, поработать и выйти. Быстродействие вне конкуренции, если канал хороший. Почему-то я про него забыл упомянуть, хотя вспомнил про Xnest и иже с ним %) Но рабочую сессию оно опять-таки не сохраняет — да и не для того оно используется. Чтобы сессию постоянно иметь — vnc пригодно х)

Добавить комментарий