Диспозиция. В конторе много пользователей, но они все удалёнщики и “воины дорог” с NAT-ами и динамикой. Надо иметь доступ к их рабочим столам.
Предыстория. Понятно, что для подключения к рабочим столам пользователей использовался anydesk. Так как чайники безграничны вопросов у пользователей много и соответственно часто подключался, anydesk начал блокировать меня. Лечилось это чисткой папки %APPDATA%\AnyDesk. Но с недавнего времени скорость через anydesk резко замедлилась.
Следующий на рассмотрении rustdesk. Очень медленно. Прям ужас как медленно и через публичный, и через self-host.
Дикое раздражение привело к данной реализации.
Идея. Подключаться к удаленному рабочему столу при помощи решения UltraVNC repeater без каких-либо инсталляций на стороне пользователя. От пользователя исключительный минимум действий. Все должно сводиться к алгоритму:
(звонок по телефону со словами "ничего не делала, оно само ...")
зайдите на сайт, кликните и запустите
скажите ID
...
чё за x...ничего страшного, сейчас все поправимдо свидания, Роза Марковна
Приступаем. Уже имеется линукс с публичным веб сервером и именем, например, corp.example.ru. На нем же запустить UltraVNC repeater в режиме node2 c конфигом:
[general]
viewerport = 5900
serverport = 5500
ownipaddress = 0.0.0.0
maxsessions = 100
runasuser = uvncrep
allowedmodes = 2
logginglevel = 3
[mode2]
requirelistedid = 0
[eventinterface]
useeventinterface = false
eventlistenerhost = localhost
eventlistenerport = 2002
usehttp = false
У линукс сервера снаружи доступны три порта — 443 (веб), 5900 (vnc клиент), 5500 (vnc сервер в reverse режиме).
Скачать portable пакет UltraVNC c официального сайта.
Запустить winvnc для создания конфига ultravnc.ini, задать в нем пароль и шифрование. Все остальные опции не важны, интересуют только эти установки:
UseDSMPlugin=1
DSMPlugin=SecureVNCPlugin64.dsm
passwd=<какой-то мусор>
Выбросить все лишнее из официального portable пакета UltraVNC для минимального размера архива. Подготовить архив UltraVNC.zip с содержимым:
Archive: UltraVNC.zip
Tree
----
UltraVNC/
│ authadmin.dll
│ authSSP.dll
│ ddengine64.dll
│ ldapauth9x.dll
│ ldapauthnt4.dll
│ logging.dll
│ logmessages.dll
│ SecureVNCPlugin64.dsm
│ ultravnc.ini
│ vnchooks.dll
│ winvnc.exe
│ workgrpdomnt4.dll
│
└───UVncVirtualDisplay64
uvncvirtualdisplay.cat
UVncVirtualDisplay.dll
UVncVirtualDisplay.inf
Архив выложить на веб сервер допустим в корень. Туда же выложить скрипт AnyDesk2.cmd:
@echo off
REM *********************
REM Check Running process
REM *********************
for /F "tokens=1" %%a IN ('tasklist.exe') do (
if "%%a"=="winvnc.exe" (
msg %USERNAME% "Скажите Админу что AnyDesk уже запущен."
exit 0
)
)
REM *********************
REM Download Application
REM *********************
powershell -Command "Invoke-WebRequest https://corp.example.ru/UltraVNC.zip -Method Get -Outfile %USERPROFILE%\Downloads\UltraVNC.zip"
if NOT Exist "%USERPROFILE%\Downloads\UltraVNC.zip" (
msg %USERNAME% "Скажите Админу что AnyDesk невозможно скачать."
exit 1
)
REM *********************
REM Extract Application
REM *********************
powershell -Command "Expand-Archive -Force %USERPROFILE%\Downloads\UltraVNC.zip %LOCALAPPDATA%"
REM *********************
REM Generate Random ID
REM *********************
set /a _rand_id=%RANDOM%
REM *********************
REM Show Generated ID to user
REM *********************
msg %USERNAME% "Назовите Админу ваш ID - %_rand_id% ."
REM *********************
REM Run Application
REM *********************
%LOCALAPPDATA%\UltraVNC\winvnc.exe -sc_prompt -sc_exit -autoreconnect ID:%_rand_id% -connect corp.example.ru -run
Этот скрипт пользователь будет качать и запускать по указанию.
Что делает скрипт:
качает подготовленный архив с vnc сервером UltraVNC.zip
распаковывает его
запускает winvnc с реверсивным подключением к repeater-у.
Для унификации скрипт содержит только встроенные команды, никакого стороннего софта.
Создать index файл веб сервера со ссылкой на скрипт AnyDesk2:
<html>
<head>
<title>AnyDesk2</title>
<meta charset="UTF-8">
</head>
<body>
<p>
<a href="AnyDesk2.cmd" download>Скачать AnyDesk2 для Windows</a>
</p>
<p>
После скачивания перейти в папку "Загрузки" и запустить <b>AnyDesk2</b>.
</p>
</body>
</html>
Выглядеть будет примерно так:
Скачать AnyDesk2 для Windows
После скачивания перейти в папку "Загрузки" и запустить AnyDesk2.
В итоге в корне веб сервера имеется три файла:
index.html
AnyDesk2.cmd
UltraVNC.zip
Все предварительные действия закончены, ждем звонков от пользователей.
При обращении сказать пользователю перейти на сайт https://corp.example.ru, кликнуть на ссылку скачать и запустить из папки Загрузки скрипт AnyDesk2. С этим все справляются, даже Роза Марковна. В процессе работы скрипта всплывает сообщение с номером ID, попросить пользователя назвать его.
У себя запустить vncviewer.exe, указать сервер corp.example.ru и названный ID. Ввести заданный при создании ultravnc.ini пароль.
Виола.
После отключения vnc сервер на стороне пользователя сам завершит работу. Это большой плюс. Т.е. vnc сервер работает только во время сеанса связи, в остальное время он даже не запущен. Даже если злоумышленники сломают repeater и узнают пароль, подключиться к пользователю не смогут.
Название скрипта выбрано из-за знакомства пользователей с программой anydesk. Если назвать по-другому, то замучают наводящими вопросами. Только время тратить.
Для безопасности можно применить режим node3 с сайта UltraVNC с авторизацией на ключах. Но это усложнит схему. Надо будет ставить repeater за реверсивным прокси nginx или за stunnel, на стороне пользователя совместно с winvnc запускать также stunnel, в скрипте добавлять кучу проверок запущенных программ, портов, правила брандмауэра....
Считаю не стоит усилий.
Что в итоге.
Нет постоянно подключенных vnc серверов к repeater-у.
Не надо инсталлировать у пользователей софт с топопривязками.
Не нужны права администратора.
Архив с vnc сервером и пароль можно менять в любой момент, он скачивается и обновляется при каждом запуске скрипта.
Скорость отличная и нет зависимости от зарубежных партнеров.
При смене адреса repeater-а или веб сервера все меняется в одном месте.
Скрипт с архивом можно выложить куда угодно, хоть на google диск.