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, под рутом заводим нового пользователя:
usermod -G sudo ubuntu
Прописываем ему наш ~/.ssh/id_rsa.pub:
vim ~ / .ssh / authorized_keys
chmod 0600 ~ / .ssh / authorized_keys
У себя на компьютере в ~/.ssh/config дописываем:
Hostname 123.45.67.89
User ubuntu
LocalForward 5901 localhost:5901
В VNC не шифруется трафик, поэтому мы будем ходить в него, используя прокидывание портов по SSH. Если вы также собираетесь использовать технику проброса звука, описанную в заметке Осилил запуск GUI-приложений в Docker , добавьте строчку:
Заходим на vnc-server под пользователем ubuntu, говорим:
sudo apt-get install xubuntu-desktop tightvncserver xfonts-base
xfonts-75dpi xfonts-100dpi
Как вы могли заметить, в качестве конкретной реализации сервера был выбран TightVNC. Я имел опыт работы с ним несколько лет назад. Уже не помню точно, чем именно TightVNC тогда выделялся на фоне остальных VNC-серверов. Помню, что он был прост в установке и настройке, совместим со всеми клиентами и просто работал.
Правим файл ~/.vnc/xstartup, содержание должно стать примерно таким:
xrdb $HOME / .Xresources
xsetroot -solid grey
startxfce4 &
( sleep 3 && xfce4-panel ) &
Запустить сервер:
Здесь аргумент :1
— это номер дисплея. Можно запускать несколько десктопов, работающих одновременно. Флаг -localhost
означает принимать соединения только с этой же машины. Параметр -nolisten tcp
нужен для того, чтобы порт 6001 не торчал наружу. При первом запуске сервера понадобится ввести пароль для доступа к десктопу. Обратите внимание, что пароль обрезается до восьми символов. Также вас спросят про отдельный пароль для view-only соединения:
Сменить пароль можно командой:
Остановить сервер:
Чтобы подключиться к работающему серверу, нужен какой-нибудь VNC-клиент. В Ubuntu по умолчанию идет Remmina. В маках, как мне рассказывали, VNC клиент находится в Finder → Connect to Server. В качестве адреса сервера указываем localhost:5901, оттуда соединение будет переброшено по SSH на порт 5901 VNC-сервера. В общем случае номер порта вычисляется, как 5900 + номер дисплея.
Дополнение: А во FreeBSD я делаю так:
vncviewer -bgr233 localhost: 5901
Если все было сделано правильно, вы увидите среду рабочего стола Xfce. Ее также следует немного донастроить. В Applications Menu → Settings → Session and Startup во вкладке Advanced ставим галочку Launch GNOME services on startup. Во вкладке Application Autostart отключаем разные лишние сервисы типа Bluetooth Applet. Иначе некоторые приложения, в частности, Skype, могут ронять вообще все иксы с очень странными ошибками в логах. Я лично оставил только следующие галочки:
Теперь прописываем VNC на автозапуск. В /etc/init.d/vncserver пишем:
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 update-rc.d vncserver defaults
sudo service vncserver start
Если все работает, остается только убедиться, что сервер будет автоматически запущен после перезагрузки:
Здесь мы настраивали VNC на примере виртуального облачного сервера, но понятно, что в Vagrant или Docker все будет работать точно так же.
А используете ли вы VNC и если да, то для каких задач, если не секрет?