Настройка постоянного SSH-туннеля в виде службы Windows
При администрировании удаленных серверов безопасным стандартом считается закрытие портов баз данных (например, PostgreSQL 5432 или MySQL 3306) для внешнего мира. Доступ к ним организуют через защищенный SSH-туннель (SSH Port Forwarding).
Однако ручной запуск туннеля через консоль неудобен: окно терминала нужно держать открытым, а после перезагрузки ОС или сбоя сети связь прерывается. Оптимальное решение для Windows-разработчиков — настроить проброс порта как полноценную службу Windows, которая будет работать в фоне и автоматически подниматься при старте системы.
В этой статье мы разберем, как реализовать такую схему с помощью встроенного SSH-клиента Windows и утилиты NSSM.
Что нам понадобится
- Встроенный OpenSSH-клиент (доступен в Windows 10/11 по умолчанию). Для Windows Server 2016 необходимо скачать с официального источника, например, отсюда https://github.com/PowerShell/Win32-OpenSSH/releases
- NSSM (Non-Sucking Service Manager) — бесплатная микро-утилита, которая превращает любой консольный скрипт или команду в полноценную службу Windows с функцией автоперезапуска.
Шаг 1. Настройка авторизации по SSH-ключам
Служба Windows работает в фоновом режиме без участия пользователя, поэтому она не сможет запросить пароль для подключения к удаленному серверу. Необходимо настроить беспарольный вход по SSH-ключу.
- Откройте PowerShell и создайте пару ключей (если их еще нет):
powershell
ssh-keygen -t ed25519
-
Скопируйте публичный ключ на удаленный сервер (содержимое файла ~/.ssh/id_ed25519.pub нужно добавить в файл
~/.ssh/authorized_keysна сервере). -
Проверьте подключение из консоли. Вы должны заходить на сервер без ввода пароля: powershell
ssh user@remote_server_ip
Шаг 2. Тестирование команды проброса порта
Перед созданием службы обязательно убедитесь, что команда туннелирования работает корректно в ручном режиме. Синтаксис команды для проброса порта (например, для PostgreSQL):
powershell
ssh -N -L 5433:127.0.0.1:5432 user@remote_server_ip -i C:\Users\Ваше_Имя\.ssh\id_ed25519
Разбор флагов:
- -N — указание не выполнять удаленные команды (нужно только для проброса портов).
- -L 5433:127.0.0.1:5432 — перенаправлять локальный порт 5433 на порт 5432 удаленного сервера.
- -i — явный путь к вашему приватному SSH-ключу.
Проверьте работу: не закрывая окно консоли, попробуйте подключиться к базе данных через ваш SQL-клиент (DBeaver/pgAdmin), указав localhost и порт 5433. Если подключение успешно — закройте консоль (Ctrl+C).
Шаг 3. Установка туннеля как службы через NSSM
- Скачайте утилиту NSSM с официального сайта и распакуйте архив (https://nssm.cc/builds).
- Откройте PowerShell от имени Администратора, перейдите в папку с распакованной утилитой (выбирайте версию из папки win64) и выполните команду для создания службы:
powershell
.\nssm.exe install SSH-Tunnel-DB
-
Откроется графический интерфейс настройки службы. Заполните вкладки следующим образом:
Вкладка Application:
- Path: Путь к системному SSH-клиенту. Обычно это:
C:\Windows\System32\OpenSSH\ssh.exe-
Startup directory: C:\Windows\System32\OpenSSH
-
Arguments: Аргументы, которые мы тестировали на Шаге 2:
text-N -L 5433:127.0.0.1:5432 user@remote_server_ip -i C:\Users\Ваше_Имя\.ssh\id_ed25519
Вкладка Details:
- Display name: Отображаемое имя (например, SSH Tunnel for Database)
- Startup type: Выберите Automatic (чтобы служба стартовала вместе с Windows).
Вкладка Logon (Важно!):
По умолчанию службы работают от имени Local System. У этой учетной записи может не быть доступа к вашим приватным SSH-ключам.
- Переключите маркер на This account.
- Укажите логин и пароль вашей учетной записи Windows (под которой вы настраивали SSH-ключи).
-
Нажмите кнопку Install service.
Шаг 4. Запуск и проверка службы
- Откройте стандартный менеджер служб Windows (Win + R → services.msc).
- Найдите в списке службу с именем SSH Tunnel for Database.
- Нажмите по ней правой кнопкой мыши и выберите Запустить (Start).
Теперь туннель работает незаметно в фоновом режиме. Если у вас пропадет интернет или удаленный сервер временно перезагрузится, NSSM автоматически переподключит SSH-сессию, как только связь восстановится.
Как удалить службу?
Если туннель больше не нужен, удалить службу можно одной командой в PowerShell (от имени Администратора):
powershell
.\nssm.exe remove SSH-Tunnel-DB confirm
Заключение
Настройка SSH-туннеля в виде фоновой службы Windows полностью решает проблему «отваливающихся» консольных окон и экономит время при ежедневной разработке. Вы получаете безопасный, постоянный и изолированный доступ к удаленной инфраструктуре напрямую со своего рабочего места.