Введение
Ситуация: рабочая машина под управлением Windows находится в корпоративной ��ети за NAT. Извне хода в сеть нет. К рабочему компьютеру необходим удалённый доступ с домашнего компьютера на Linux. Работа AnyDesk оставляет желать лучшего.
Имеется VPS под управлением Ubuntu server. Организуем SSH туннелирование, для использования штатного Windows RDP
Договорённости
VPS
IP: 1.2.3.4
User name: userVPS
Windows (target machine)
User name: userWindows
Директория для сохранения скриптов: %USERPROFILE%\Documents\scripts
Administrator login: userAdministrator
Действия на целевой машине (Windows)
Важно: удалённый доступ к рабочему столу должен быть включён (тогда пункт о разрешении удалённого доступа можно пропустить), либо нужно иметь доступ уровня администратора.
Работать быстрее из консоли
<Win+R> cmdРазрешить удалённое подключение к рабочему столу
runas /user:userAdministrator "reg add \"HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\" /v fDenyTSConnections /t REG_DWORD /d 0 /f"Создать ключ для подключения к серверу без ввода пароля
ssh-keygen -t ed25519Скопировать ключ на сервер
type "%USERPROFILE%\.ssh\id_ed25519.pub" | ssh user@host "cat >> .ssh/authorized_keys"Создать скрипт создания и поддержания туннеля:
mkdir %USERPROFILE%\Documents\scripts notepad %USERPROFILE%\Documents\scripts\ssh_tunnel.ps1
Листинг скрипта
# Будет запускаться по расписанию/событию через Планировщик задач Windows. Формирует SSH туннель (подключения к VPS), а также контролирует и устраняет случай обрыва связи # Конфигурация $vpsUser = "userVPS" # имя пользователя $vpsIp = "1.2.3.4" # адрес VPS $vpsPort = "22" # порт на VPS для доступа по SSH; хотя опытные люди утверждают, что этот порт не нужно держать открытым $remotePort = "33389" # порт на VPS для туннелирования $localPort = "3389" # порт на локальной машине; для RDP стандартный порт 3389 $interval = 3600*2 # 2 часа (в секундах: 3600 сек × 2) $sshArgs = "-R ${remotePort}:localhost:${localPort} ${vpsUser}@${vpsIp} -N -o ServerAliveInterval=60 -o ExitOnForwardFailure=yes" Write-Host "Мониторинг туннеля запущен. Интервал: 2 часа." -ForegroundColor Cyan while ($true) { # 1. Ищем существующий процесс SSH к этому VPS $process = Get-Process ssh -ErrorAction SilentlyContinue | Where-Object { $\_.CommandLine -like "\*$vpsIp\*" } if ($process) { Write-Host "$(Get-Date): Принудительное обновление сессии..." -ForegroundColor Gray Stop-Process -Id $process.Id -Force Start-Sleep -Seconds 2 } # 2. Запускаем новый туннель Write-Host "$(Get-Date): Запуск SSH туннеля..." -ForegroundColor Green Start-Process ssh -ArgumentList $sshArgs -WindowStyle Hidden # 3. Спим $interval секунд Start-Sleep -Seconds $interval }
Создать задачу в Планировщике задач
schtasks /Create /SC DAILY /ST 15:00 /TN "SSH tunnel" /TR "powershell.exe -ExecutionPolicy Bypass -File \"%USERPROFILE%\Documents\scripts\ssh_tunnel.ps1\""М-да, это не crontab. Предыдущий пункт в переводе:
создать
запуск ‒ ежедневно
в 15:00
задача с именем: SSH tunnel
команда запуска (обратить внимание на использование кавычек: обрамляющие ‒ обязательно двойные):
"powershell.exe -ExecutionPolicy Bypass -File \"%USERPROFILE%\Documents\scripts\ssh_tunnel.ps1\""
Действия на сервере (VPS Ubuntu Server)
По умолчанию для RDP используется порт 3389, для схожести туннелировать на сервер будем через порт 33389.
Проверить: не используется ли выбранный порт
ss -lt | grep :33389Открыть порт
sudo utf allow 33389/tcpПеренастроить sshd_config
sudo nano /etc/ssh/sshd_configУстановитьGatewayPorts yesПерезапустить SSH
sudo systemctl restart ssh
Действия на клиентской машине (Linux Mint)
Быстрее всего работать в консоли
<Ctrl+Alt+T>Установка Remmina
sudo apt-get -y install remmina remmina-plugin-rdpДобавить конфигурацию соединения:
nano ~/.local/share/remmina/workWindows.remminaВ файле конфигурации:
[remmina] password=. name=Компьютер на работе server=194.164.235.131:33389 protocol=RDP username=userWindows
При запуске Remmina предложит список хостов для подключения, выбрать Компьютер на работе. После запуска останется ввести пароль пользователя целевой машины и активировать сохранение пароля.
