Как настроить SSH проброс портов как службу или запланированное задание в Windows 10?
У меня есть закрытый ключ на локальном компьютере и соответствующий открытый ключ на терминальном сервере (asd-pc-00).
Я успешно создал проброс портов с помощью следующей команды в bat-файле:
ssh -i "C:\windows\ccmsetup\id_test2" -o StrictHostKeyChecking=no -o UserKnownHostsFile=NUL -N -f -T -R 33890:localhost:3389 test2@asd-pc-00
Однако при попытке создать службу Windows с помощью команды:
sc.exe create "SSH-Tunnel-Service" binPath= "C:\Windows\System32\OpenSSH\ssh.exe -i `"C:\windows\ccmsetup\id_test2`" -o StrictHostKeyChecking=no -o UserKnownHostsFile=NUL -N -f -T -R 33890:localhost:3389 test2@asd-pc-00"
я получаю ошибку 1053: “Служба не ответила на запрос своевременно”.
Также я пробовал использовать Планировщик задач для запуска скрипта из bat-файла или просто команды. Задание отображается как выполняющееся, но тунель не устанавливается.
В конечном итоге я хочу развернуть этот SSH-тунель через SCCM. Подскажите, что я делаю не правильно?
Для настройки SSH проброса портов как службы или запланированного задания в Windows 10 существуют несколько проверенных методов. Давайте разберем проблему и предложим эффективные решения.
Основная причина, по которой ваша команда sc.exe не работает, заключается в том, что службы Windows запускаются в специальном безынтерактивном контексте, где отсутствуют необходимые для SSH настройки безопасности и аутентификации. Вот как правильно настроить SSH-тунель в качестве службы.
Содержание
- Проблема с запуском SSH в качестве службы Windows
- Решение с использованием NSSM (Non-Sucking Service Manager)
- Альтернативные методы настройки
- Настройка через Планировщик задач
- Подготовка для развертывания через SCCM
- Тестирование и отладка
- Заключение
Проблема с запуском SSH в качестве службы Windows
Ошибка 1053 возникает из-за того, что службы Windows работают в специальном контексте, который отличается от обычного интерактивного сеанса. Основные проблемы:
- Отсутствие интерактивного сеанса: SSH-клиент требует определенных условий для работы, которые не предоставляются средой службы
- Проблемы с аутентификацией: Безынтерактивный контекст службы может не корректно обрабатывать приватные ключи
- Ограничения прав: Служебный аккаунт может не иметь необходимых прав для доступа к файлу приватного ключа
Ваш подход с sc.exe технически возможен, но требует правильной настройки окружения и параметров.
Решение с использованием NSSM (Non-Sucking Service Manager)
NSSM является наиболее рекомендуемым инструментом для решения вашей задачи, как указано в нескольких источниках.
Шаг 1: Установка NSSM
- Скачайте NSSM с официального сайта: https://nssm.cc/download
- Распакуйте архив в удобное место, например
C:\Program Files\nssm - Добавьте путь к NSSM в системную переменную PATH или используйте полный путь к
nssm.exe
Шаг 2: Создание службы с NSSM
Используйте следующую команду для создания службы:
nssm install "SSH-Tunnel-Service" "C:\Windows\System32\OpenSSH\ssh.exe"
Шаг 3: Настройка параметров службы
После установки службы откройте окно конфигурации NSSM:
nssm edit "SSH-Tunnel-Service"
Или настройте параметры через командную строку:
nssm set "SSH-Tunnel-Service" AppParameters "-i `"C:\windows\ccmsetup\id_test2`" -o StrictHostKeyChecking=no -o UserKnownHostsFile=NUL -N -f -T -R 33890:localhost:3389 test2@asd-pc-00"
nssm set "SSH-Tunnel-Service" AppDirectory "C:\Windows\System32\OpenSSH"
nssm set "SSH-Tunnel-Service" DisplayName "SSH Tunnel Service"
nssm set "SSH-Tunnel-Service" Description "SSH Port Forwarding Tunnel"
Шаг 4: Настройка учетной записи службы
Важно: Укажите учетную запись, которая имеет доступ к файлу приватного ключа:
nssm set "SSH-Tunnel-Service" ObjectName "LocalSystem" # или ваша учетная запись
nssm set "SSH-Tunnel-Service" Password "" # пароль, если требуется
Шаг 5: Запуск службы
nssm start "SSH-Tunnel-Service"
Проверьте статус службы:
nssm status "SSH-Tunnel-Service"
Важно: Как отмечено в источниках, NSSM является предпочтительным решением для запуска SSH туннелей в качестве служб, так как он правильно обрабатывает контекст выполнения и параметры.
Альтернативные методы настройки
Метод 1: Использование Plink из PuTTY
Если вы предпочитаете использовать PuTTY, можно настроить через Plink:
nssm install "SSH-Tunnel-Service-Plink" "C:\Path\To\putty\plink.exe"
nssm set "SSH-Tunnel-Service-Plink" AppParameters "-i `"C:\windows\ccmsetup\id_test2`" -ssh -N -R 33890:localhost:3389 test2@asd-pc-00"
Метод 2: Использование AutoSSH для надежного соединения
Для автоматического восстановления соединения используйте AutoSSH:
nssm install "SSH-Tunnel-Service-AutoSSH" "C:\Path\To\autossh\autossh.exe"
nssm set "SSH-Tunnel-Service-AutoSSH" AppParameters "-M 20000 -i `"C:\windows\ccmsetup\id_test2`" -o StrictHostKeyChecking=no -o UserKnownHostsFile=NUL -N -T -R 33890:localhost:3389 test2@asd-pc-00"
Метод 3: Использование пакетного файла с задержкой
Создайте bat-файл с задержкой запуска SSH:
@echo off
timeout /t 10 /nobreak >nul
ssh -i "C:\windows\ccmsetup\id_test2" -o StrictHostKeyChecking=no -o UserKnownHostsFile=NUL -N -f -T -R 33890:localhost:3389 test2@asd-pc-00
Настройте NSSM на запуск этого bat-файла вместо прямой SSH-команды.
Настройка через Планировщик задач
Если вы предпочитаете использовать Планировщик задач, настройте его правильно:
Шаг 1: Создание задания
- Откройте Планировщик задач
- Создайте новое задание
- На вкладке “Общие”:
- Имя: “SSH Tunnel Service”
- Запускать с наивысшими правами: Включено
- Запускать, пользователь вошел в систему: Отключено
Шаг 2: Настройка триггера
- Действие: При запуске системы
- Отложенный запуск: 1 минута
Шаг 3: Настройка действия
- Действие: Запустить программу
- Программа/скрипт:
cmd.exe - Аргументы:
/C "C:\Path\To\your\tunnel.bat"
Шаг 4: Настройка условий
- Отключить задачу, если система работает от батарей
- Если компьютер переведен в спящий режим, запустить задачей при пробуждении
Примечание: Как указано в исследованиях, Планировщик задач может показывать, что задание выполняется, но не устанавливать тунель из-за проблем с контекстом выполнения.
Подготовка для развертывания через SCCM
Для развертывания через SCCM подготовьте пакет следующим образом:
Структура пакета:
SSH-Tunnel-Package/
├── Install.bat
├── Uninstall.bat
├── nssm.exe
├── ssh_tunnel_config.xml
└── Readme.txt
Install.bat:
@echo off
echo Installing SSH Tunnel Service...
REM Copy NSSM to system directory
copy "%~dp0nssm.exe" "%SystemRoot%\System32\"
REM Install the service
nssm install "SSH-Tunnel-Service" "C:\Windows\System32\OpenSSH\ssh.exe"
nssm set "SSH-Tunnel-Service" AppParameters "-i `"C:\windows\ccmsetup\id_test2`" -o StrictHostKeyChecking=no -o UserKnownHostsFile=NUL -N -f -T -R 33890:localhost:3389 test2@asd-pc-00"
nssm set "SSH-Tunnel-Service" AppDirectory "C:\Windows\System32\OpenSSH"
nssm set "SSH-Tunnel-Service" ObjectName "LocalSystem"
REM Start the service
nssm start "SSH-Tunnel-Service"
echo Installation completed successfully
Uninstall.bat:
@echo off
echo Uninstalling SSH Tunnel Service...
REM Stop and remove the service
nssm stop "SSH-Tunnel-Service"
nssm remove "SSH-Tunnel-Service" confirm
echo Uninstallation completed successfully
Настройка SCCM:
- Создайте приложение с двумя типами развертывания:
- Установка: Install.bat
- Удаление: Uninstall.bat
- Настройте условия развертывания
- Укажите параметры для пользователя и компьютера
Тестирование и отладка
Проверка статуса службы:
sc query "SSH-Tunnel-Service" nssm status "SSH-Tunnel-Service"
Логирование для отладки:
Добавьте логирование в вашу SSH-команду:
nssm set "SSH-Tunnel-Service" AppParameters "-i `"C:\windows\ccmsetup\id_test2`" -o StrictHostKeyChecking=no -o UserKnownHostsFile=NUL -N -f -T -R 33890:localhost:3389 test2@asd-pc-00 > `"C:\logs\ssh_tunnel.log`" 2>&1"
Проверка прав доступа:
Убедитесь, что учетная запись службы имеет доступ к файлу приватного ключа:
icacls "C:\windows\ccmsetup\id_test2"
Заключение
Для настройки SSH проброса портов как службы в Windows 10 рекомендуется использовать NSSM (Non-Sucking Service Manager), который специализируется на правильном запуске приложений в контексте служб Windows. Основные шаги:
- Установите NSSM и настройте им службу
- Корректно укажите параметры SSH-команды включая путь к приватному ключу
- Настройте учетную запись службы с необходимыми правами
- Используйте логирование для отладки проблем
- Подготовьте пакет для SCCM с установочными и деинсталляционными скриптами
Прямой запуск SSH через sc.exe или Планировщик задач часто не работает из-за ограничений контекста выполнения служб Windows. NSSM решает эту проблему, корректно обрабатывая параметры и окружение для запуска SSH-туннелей.
Для развертывания через SCCM подготовьте пакет с NSSM и скриптами установки/удаления, что позволит централизованно управлять SSH-туннелями на компьютерах сети.
Источники
- NSSM - the Non-Sucking Service Manager
- Persistent SSH tunnel for Windows - Technicus
- How can I make a SSH tunnel command into a service on Windows 10? - Stack Overflow
- r/sysadmin on Reddit: What is the best SSH tunneling setup for Windows?
- Configure SSH Tunnel (Port Forwarding) on Windows | Windows OS Hub