Как поднять свой VNC-сервер в Ubuntu Linux

31 августа 2015

Virtual Network Computing (VNC) — система для удаленного доступа к рабочему столу. Если вы представляете себе Remote Desktop или RAdmin, то VNC решает аналогичную задачу, только VNC-сервера распространяются бесплатно и с открытым исходным кодом. Важно отметить, что VNC не является протоколом. Используемый протокол называется Remote FrameBuffer (RFB). Этот протокол полностью описан в этом PDF.

Зачем кому-то поднимать VNC:

  • Если пробрасывание UI по SSH слишком тормозит;
  • Сервер используется как виртуалка, только с совместным доступом;
  • Торрентокачалка с белым IP, просто ставим Transmission и вперед;
  • Своего рода альтернатива проксям и VPN;
  • И прочее, на что фантазии хватит;

Приступим. Все описанные ниже шаги проверялись на Ubuntu Linux 14.04 LTS, но также должны без особых изменений работать на других версиях Ubuntu, а также других системах. Для эксперимента нам понадобится ненужная машина, возможно, виртуалка в каком-нибудь DigitalOcean, имеющая по крайней мере 512 Мб памяти. Если вы планируете запускать тяжелые GUI-программы вроде Google Chrome, то сразу выделяйте 1 Гб, а лучше и того больше. Если выделить только 512 Мб, вы сможете открыть только одну вкладу с GMail, после чего память закончится, я проверял. Меня лично очень печалит, что браузеры стали такими прожорливыми, но это, пожалуй, тема для отдельного поста.

На машине, где будем поднимать VNC, под рутом заводим нового пользователя:

adduser ubuntu
usermod -G sudo ubuntu

Прописываем ему наш ~/.ssh/id_rsa.pub:

su ubuntu
vim ~/.ssh/authorized_keys
chmod 0600 ~/.ssh/authorized_keys

У себя на компьютере в ~/.ssh/config дописываем:

Host vnc-server
  Hostname 123.45.67.89
  User ubuntu
  LocalForward 5901 localhost:5901

В VNC не шифруется трафик, поэтому мы будем ходить в него, используя прокидывание портов по SSH. Если вы также собираетесь использовать технику проброса звука, описанную в заметке Осилил запуск GUI-приложений в Docker, добавьте строчку:

  RemoteForward 3333 localhost:4713

Заходим на vnc-server под пользователем ubuntu, говорим:

sudo apt-get update
sudo apt-get install xubuntu-desktop tightvncserver xfonts-base \
  xfonts-75dpi xfonts-100dpi

Как вы могли заметить, в качестве конкретной реализации сервера был выбран TightVNC. Я имел опыт работы с ним несколько лет назад. Уже не помню точно, чем именно TightVNC тогда выделялся на фоне остальных VNC-серверов. Помню, что он был прост в установке и настройке, совместим со всеми клиентами и просто работал.

Правим файл ~/.vnc/xstartup, содержание должно стать примерно таким:

#!/bin/sh

xrdb $HOME/.Xresources
xsetroot -solid grey
startxfce4 &
(sleep 3 && xfce4-panel) &

Запустить сервер:

vncserver :1 -localhost -nolisten tcp

Здесь аргумент :1 — это номер дисплея. Можно запускать несколько десктопов, работающих одновременно. Флаг -localhost означает принимать соединения только с этой же машины. Параметр -nolisten tcp нужен для того, чтобы порт 6001 не торчал наружу. При первом запуске сервера понадобится ввести пароль для доступа к десктопу. Обратите внимание, что пароль обрезается до восьми символов. Также вас спросят про отдельный пароль для view-only соединения:

Would you like to enter a view-only password (y/n)? n

Сменить пароль можно командой:

vncpasswd

Остановить сервер:

vncserver -kill :1

Чтобы подключиться к работающему серверу, нужен какой-нибудь VNC-клиент. В Ubuntu по умолчанию идет Remmina. В маках, как мне рассказывали, VNC клиент находится в Finder → Connect to Server. В качестве адреса сервера указываем localhost:5901, оттуда соединение будет переброшено по SSH на порт 5901 VNC-сервера. В общем случае номер порта вычисляется, как 5900 + номер дисплея.

Дополнение: А во FreeBSD я делаю так:

sudo pkg install tightvnc
vncviewer -bgr233 localhost:5901

Если все было сделано правильно, вы увидите среду рабочего стола Xfce. Ее также следует немного донастроить. В Applications Menu → Settings → Session and Startup во вкладке Advanced ставим галочку Launch GNOME services on startup. Во вкладке Application Autostart отключаем разные лишние сервисы типа Bluetooth Applet. Иначе некоторые приложения, в частности, Skype, могут ронять вообще все иксы с очень странными ошибками в логах. Я лично оставил только следующие галочки:

VNC-сервер на Ubuntu Linux

Теперь прописываем VNC на автозапуск. В /etc/init.d/vncserver пишем:

#!/bin/bash

case "$1" in
  start)
    su ubuntu -c '/usr/bin/vncserver :1 -localhost -nolisten tcp'
    ;;

  stop)
    su ubuntu -c '/usr/bin/vncserver -kill :1'
    ;;

  restart)
    $0 stop
    $0 start
    ;;
esac

exit 0

Проверяем:

sudo chmod +x /etc/init.d/vncserver
sudo update-rc.d vncserver defaults
sudo service vncserver start

Если все работает, остается только убедиться, что сервер будет автоматически запущен после перезагрузки:

sudo reboot

Здесь мы настраивали VNC на примере виртуального облачного сервера, но понятно, что в Vagrant или Docker все будет работать точно так же.

А используете ли вы VNC и если да, то для каких задач, если не секрет?

Метки: .


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