Введение
Система совместного использования графического рабочего стола
Виртуальные сетевые вычисления (VNC) – это система совместного использования графического рабочего стола, использующая протокол Remote Frame Buffer (RFB) для удалённого управления другим компьютером. Она передаёт ввод с клавиатуры и мыши с одного компьютера на другой, транслируя обновления графического экрана по сети. VNC является платформенно-независимой – существуют клиенты и серверы для многих операционных систем с графическим интерфейсом, а также для Java. К серверу VNC может одновременно подключаться несколько клиентов. Эта технология широко используется для удалённой технической поддержки, а также для доступа к файлам на рабочем компьютере с домашнего или наоборот. VNC была первоначально разработана в исследовательской лаборатории Olivetti & Oracle в Кембридже, Великобритания. Исходный код VNC и многие современные производные являются открытым исходным кодом, распространяемым по лицензии GNU General Public License. Существует ряд вариантов VNC, предлагающих собственные функциональные возможности, например, некоторые оптимизированы для Microsoft Windows или обеспечивают передачу файлов (которая не является частью стандартного VNC). Многие из них совместимы (без дополнительных функций) со стандартным VNC, то есть клиент одной версии может подключаться к серверу другой. Другие основаны на коде VNC, но несовместимы со стандартным VNC. VNC и RFB являются зарегистрированными товарными знаками RealVNC Ltd. в США и некоторых других странах.
Этимология
Название Virtual Network Computer/Computing (VNC) появилось в связи с работой ORL над тонким клиентом под названием Videotile, который также использовал протокол RFB. Videotile был оснащен ЖК-дисплеем с вводом пера и быстрым ATM-соединением с сетью. В то время термин "сетевой компьютер" часто использовался как синоним "тонкого клиента"; VNC по сути представляет собой сетевой компьютер, реализованный исключительно программно (то есть виртуальный).
Операция
Сервер VNC — это программа на машине, которая предоставляет доступ к некоторому экрану (и может не быть связан с физическим дисплеем — сервер может быть "headless"), и позволяет клиенту управлять им. Клиент VNC (или просмотрщик) — это программа, которая отображает данные экрана, поступающие с сервера, получает от него обновления и, предположительно, управляет сервером, передавая ему собранные локальные данные ввода. Протокол VNC (протокол RFB) очень прост и основан на передаче одного графического примитива от сервера к клиенту ("Нарисовать прямоугольник пиксельных данных в указанной позиции X,Y") и сообщений о событиях от клиента к серверу. В обычном режиме работы просмотрщик подключается к порту на сервере (порт по умолчанию: 5900). В качестве альтернативы (в зависимости от реализации) браузер может подключиться к серверу (порт по умолчанию: 5800). Сервер также может подключиться к просмотрщику в "режиме прослушивания" на порту 5500. Одним из преимуществ режима прослушивания является то, что стороне сервера не нужно настраивать свой брандмауэр для разрешения доступа на порту 5900 (или 5800); ответственность ложится на просмотрщик, что удобно, если на стороне сервера нет специалистов по компьютерам, а пользователь просмотрщика более компетентен. Сервер отправляет клиенту небольшие прямоугольники буфера кадров. В своей простейшей форме протокол VNC может потреблять много пропускной способности, поэтому были разработаны различные методы для уменьшения накладных расходов на связь. Например, существуют различные методы кодирования (способы определения наиболее эффективного способа передачи этих прямоугольников). Протокол VNC позволяет клиенту и серверу согласовать используемый метод кодирования. Самый простой метод кодирования, поддерживаемый всеми клиентами и серверами, — это необработанное кодирование, которое отправляет пиксельные данные в порядке сканирования слева направо, и после передачи исходного полного экрана передает только изменившиеся прямоугольники. Это кодирование хорошо работает, если от одного кадра к другому меняется лишь небольшая часть экрана (например, при перемещении указателя мыши по рабочему столу или при вводе текста), но требования к пропускной способности становятся очень высокими, если одновременно меняется много пикселей (например, при прокрутке окна или просмотре видео в полноэкранном режиме). По умолчанию VNC использует TCP-порт 5900+N, где N — номер дисплея (обычно :0 для физического дисплея). Некоторые реализации также запускают базовый HTTP-сервер на порту 5800+N для предоставления VNC-просмотрщика в виде Java-апплета, что позволяет легко подключаться через любой веб-браузер с поддержкой Java. Можно использовать различные назначения портов, если клиент и сервер настроены соответствующим образом. Существует также реализация HTML5 VNC-клиента для современных браузеров (не требуются плагины). Хотя это возможно даже при низкой пропускной способности, использование VNC через Интернет облегчается, если у пользователя есть широкополосное соединение с обеих сторон. Однако для подключения может потребоваться расширенная трансляция сетевых адресов (NAT), настройка брандмауэра и маршрутизатора, например, переадресация портов. Пользователи могут устанавливать связь через технологии виртуальной частной сети (VPN), чтобы упростить использование через Интернет, или как подключение к локальной сети, если VPN используется в качестве прокси, или через повторитель VNC (полезно при наличии NAT). Xvnc — это VNC-сервер для Unix, основанный на стандартном X-сервере. Для приложений Xvnc выглядит как X-"сервер" (то есть он отображает окна клиентов), а для удаленных пользователей VNC — как VNC-сервер. Приложения могут отображаться на Xvnc так, как если бы это был обычный X-дисплей, но они будут отображаться на любых подключенных VNC-просмотрщиках, а не на физическом экране. В качестве альтернативы, машина (которая может быть рабочей станцией или сетевым сервером) с экраном, клавиатурой и мышью может быть настроена для загрузки и запуска VNC-сервера как службы или демона, после чего экран, клавиатура и мышь можно удалить, а машину разместить в удобном месте. Кроме того, дисплей, предоставляемый VNC, не обязательно должен быть тем же дисплеем, который видит пользователь на сервере. На компьютерах Unix/Linux, поддерживающих несколько одновременных сеансов X11, VNC можно настроить для обслуживания конкретного существующего сеанса X11 или для запуска собственного. Также можно запускать несколько VNC-сеансов с одного компьютера. На Microsoft Windows обслуживаемый VNC-сеанс всегда является текущим сеансом пользователя. Пользователи часто используют VNC как кроссплатформенную систему удаленного рабочего стола. Например, Apple Remote Desktop для Mac OS X (и некоторое время "Back to My Mac" в версиях 'Leopard' – Mac OS X 10.5 через 'High Sierra' – macOS 10.13) взаимодействует с VNC и подключается к текущему рабочему столу пользователя Unix, если он обслуживается с помощью x11vnc, или к отдельному сеансу X11, если он обслуживается с помощью TightVNC. Из Unix TightVNC подключается к сеансу Mac OS X, обслуживаемому Apple Remote Desktop, если включена опция VNC, или к VNC-серверу, работающему на Microsoft Windows. В июле 2014 года RealVNC опубликовала предварительную версию Wayland для разработчиков.
Безопасность
По умолчанию, RFB не является безопасным протоколом. Хотя пароли не передаются в открытом виде (как в telnet), взлом может оказаться успешным, если злоумышленник перехватит как ключ шифрования, так и закодированный пароль из сети. Поэтому рекомендуется использовать пароль длиной не менее 8 символов. С другой стороны, некоторые версии VNC имеют ограничение в 8 символов; если пароль превышает эту длину, лишние символы отбрасываются, и усеченная строка сравнивается с заданным паролем. UltraVNC поддерживает плагин шифрования с открытым исходным кодом, который шифрует весь сеанс VNC, включая аутентификацию по паролю и передачу данных. Он также позволяет выполнять аутентификацию с использованием учетных записей пользователей NTLM и Active Directory. Однако использование таких плагинов шифрования делает программу несовместимой с другими VNC-клиентами. RealVNC предлагает надежное AES-шифрование в составе своего коммерческого пакета, а также интеграцию с Active Directory. Workspot выпустил патчи AES-шифрования для VNC. По заявлению TightVNC, TightVNC небезопасен, так как данные изображения передаются без шифрования. Чтобы обойти это ограничение, рекомендуется использовать SSH-туннель (см. ниже). VNC можно использовать через SSH- или VPN-соединение, что обеспечит дополнительный уровень безопасности с более надежным шифрованием. SSH-клиенты доступны для большинства платформ; SSH-туннели можно создать из UNIX-клиентов, клиентов Microsoft Windows, Mac-клиентов (включая Mac OS X и System 7 и более поздние версии) и многих других. Существуют также бесплатные приложения для создания мгновенных VPN-туннелей между компьютерами. Важным аспектом безопасности при использовании VNC является проверка того, требует ли используемая версия запроса авторизации у владельца удаленного компьютера перед предоставлением доступа к управлению устройством. Это позволит избежать ситуации, когда владелец компьютера обнаруживает, что кто-то управляет его устройством без предварительного уведомления.