+++
@@ -0,0 +1,108 @@
|
|||||||
|
# Настройка постоянного SSH-туннеля в виде службы Windows
|
||||||
|
|
||||||
|
При администрировании удаленных серверов безопасным стандартом считается закрытие портов баз данных (например, PostgreSQL 5432 или MySQL 3306) для внешнего мира. Доступ к ним организуют через защищенный SSH-туннель (SSH Port Forwarding).
|
||||||
|
|
||||||
|
Однако ручной запуск туннеля через консоль неудобен: окно терминала нужно держать открытым, а после перезагрузки ОС или сбоя сети связь прерывается. Оптимальное решение для Windows-разработчиков — настроить проброс порта как полноценную **службу Windows**, которая будет работать в фоне и автоматически подниматься при старте системы.
|
||||||
|
|
||||||
|
В этой статье мы разберем, как реализовать такую схему с помощью встроенного SSH-клиента Windows и утилиты NSSM.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Что нам понадобится**
|
||||||
|
|
||||||
|
1. **Встроенный OpenSSH-клиент** (доступен в Windows 10/11 по умолчанию). Для Windows Server 2016 необходимо скачать с официального источника, например, отсюда https://github.com/PowerShell/Win32-OpenSSH/releases
|
||||||
|
2. **NSSM (Non-Sucking Service Manager)** — [бесплатная микро-утилита](https://nssm.cc/builds), которая превращает любой консольный скрипт или команду в полноценную службу Windows с функцией автоперезапуска.
|
||||||
|
|
||||||
|
## Шаг 1. Настройка авторизации по SSH-ключам
|
||||||
|
|
||||||
|
Служба Windows работает в фоновом режиме без участия пользователя, поэтому она не сможет запросить пароль для подключения к удаленному серверу. Необходимо настроить беспарольный вход по SSH-ключу.
|
||||||
|
|
||||||
|
1. Откройте PowerShell и создайте пару ключей (если их еще нет):
|
||||||
|
|
||||||
|
**powershell**
|
||||||
|
```
|
||||||
|
ssh-keygen -t ed25519
|
||||||
|
```
|
||||||
|
2. Скопируйте публичный ключ на удаленный сервер (содержимое файла ~/.ssh/id_ed25519.pub нужно добавить в файл ```~/.ssh/authorized_keys``` на сервере).
|
||||||
|
|
||||||
|
3. Проверьте подключение из консоли. Вы должны заходить на сервер без ввода пароля:
|
||||||
|
**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
|
||||||
|
|
||||||
|
1. Скачайте утилиту NSSM с официального сайта и распакуйте архив (https://nssm.cc/builds).
|
||||||
|
2. Откройте PowerShell от имени Администратора, перейдите в папку с распакованной утилитой (выбирайте версию из папки win64) и выполните команду для создания службы:
|
||||||
|
|
||||||
|
**powershell**
|
||||||
|
```
|
||||||
|
.\nssm.exe install SSH-Tunnel-DB
|
||||||
|
```
|
||||||
|
|
||||||
|
3. Откроется графический интерфейс настройки службы. Заполните вкладки следующим образом:
|
||||||
|
|
||||||
|
**Вкладка 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-ключи).
|
||||||
|
|
||||||
|
4. Нажмите кнопку **Install service**.
|
||||||
|
|
||||||
|
## Шаг 4. Запуск и проверка службы
|
||||||
|
|
||||||
|
1. Откройте стандартный менеджер служб Windows (Win + R → services.msc).
|
||||||
|
2. Найдите в списке службу с именем **SSH Tunnel for Database**.
|
||||||
|
3. Нажмите по ней правой кнопкой мыши и выберите **Запустить** (Start).
|
||||||
|
|
||||||
|
Теперь туннель работает незаметно в фоновом режиме. Если у вас пропадет интернет или удаленный сервер временно перезагрузится, NSSM автоматически переподключит SSH-сессию, как только связь восстановится.
|
||||||
|
|
||||||
|
## Как удалить службу?
|
||||||
|
|
||||||
|
Если туннель больше не нужен, удалить службу можно одной командой в PowerShell (от имени Администратора):
|
||||||
|
|
||||||
|
**powershell**
|
||||||
|
```
|
||||||
|
.\nssm.exe remove SSH-Tunnel-DB confirm
|
||||||
|
```
|
||||||
|
|
||||||
|
## Заключение
|
||||||
|
|
||||||
|
Настройка SSH-туннеля в виде фоновой службы Windows полностью решает проблему «отваливающихся» консольных окон и экономит время при ежедневной разработке. Вы получаете безопасный, постоянный и изолированный доступ к удаленной инфраструктуре напрямую со своего рабочего места.
|
||||||
|
|
||||||
Reference in New Issue
Block a user