1. Что такое SSH-туннелирование и зачем оно нужно
SSH-туннелирование (Port Forwarding) — это метод создания защищенного зашифрованного канала между локальным компьютером и удаленным сервером для безопасной пересылки сетевого трафика произвольных сервисов и протоколов.
Основные сценарии применения:
- Защищенный доступ: Подключение к локальным базам данных (MySQL, PostgreSQL, Redis) или веб-панелям на сервере без их открытия во внешний интернет.
- Публикация локальных разработок: Демонстрация сайта, API или Docker-контейнера, запущенного на ноутбуке за NAT, внешним клиентам или коллегам через удаленный VPS.
- Безопасный серфинг: Использование удаленного сервера в качестве шифрованного SOCKS5-прокси в незащищенных Wi-Fi сетях.
2. Локальный проброс портов (Local Port Forwarding: `-L`)
Суть: Порт с удаленного сервера (или устройства в его сети) пробрасывается на ваш локальный компьютер.
Трафик идет по схеме: Ваш ПК → SSH-туннель → Сервер (приватный сервис).
Синтаксис команды:
ssh -L [Локальный_Порт]:[Целевой_IP]:[Целевой_Порт] [Пользователь@Сервер]
Практический пример:
Получение доступа к веб-сервису, работающему на сервере локально на порту 443, через порт 8443 вашего ПК:
ssh -L 8443:127.0.0.1:443 user@203.0.113.10
После этого страница откроется в вашем браузере по адресу: https://127.0.0.1:8443.
3. Удаленный проброс портов (Remote Port Forwarding: `-R`)
Суть: Порт с вашего локального устройства (ПК, ноутбука или Docker-контейнера) пробрасывается на удаленный VPS-сервер.
Трафик идет по схеме: Внешний пользователь / ПК → VPS-сервер → SSH-туннель → Ваш Ноутбук.
Синтаксис команды:
ssh -R [Порт_на_Сервере]:[Локальный_IP]:[Локальный_Порт] [Пользователь@Сервер]
Практический кейс: Проброс веб-сервиса (Zabbix / Docker) с ноутбука на VPS
Если на вашем ноутбуке запущен веб-сервер на порту 8000 (например, скрипт, Docker-контейнер Zabbix или Node.js):
# Команда выполняется с ноутбука
ssh -R 8080:127.0.0.1:8000 user@203.0.113.10
# /etc/ssh/sshd_config
GatewayPorts yes
После этого перезапустите службу SSH: sudo systemctl restart ssh.
Нюансы настройки SSH-авторизации на втором устройстве (ноутбуке):
-
Авторизация по ключам: Сервер с отключенным парольным входом вернет ошибку
Permission denied (publickey). На ноутбуке необходимо сгенерировать отдельную пару ключей:ssh-keygen -t ed25519 -
Добавление ключа: Скопируйте публичную часть (
Get-Content $HOME\.ssh\id_ed25519.pub) и вставьте ее в~/.ssh/authorized_keysна VPS. -
Запуск однострочного HTTP-сервера в PowerShell (без Python): Если на Windows-ноутбуке не установлен Python, запустите тестовый сервер корректно с разделителями
;(чтобы избежатьParserError):$l = New-Object System.Net.HttpListener; $l.Prefixes.Add("http://localhost:8000/"); $l.Start(); Write-Host "Сервер запущен!"; while ($l.IsListening) { $c = $l.GetContext(); $r = $c.Response; $b = [System.Text.Encoding]::UTF8.GetBytes("<h1>Привет с ноутбука!</h1>"); $r.ContentLength64 = $b.Length; $r.OutputStream.Write($b, 0, $b.Length); $r.Close() }
4. Динамический проброс портов (Dynamic Port Forwarding: `-D`)
Суть: Превращение SSH-соединения в локальный SOCKS5-прокси для шифрования всего веб-трафика.
Синтаксис команды:
ssh -D [Локальный_Порт_SOCKS] [Пользователь@Сервер]
Пример запуска:
ssh -D 1080 my-vps-server
Настройка в браузере (на примере Mozilla Firefox):
- Откройте Настройки → прокрутите вниз до блока Настройки сети → нажмите Настроить...
- Выберите пункт «Ручная настройка сервиса прокси».
- Заполните поле Узел SOCKS:
127.0.0.1| Порт:1080| переключатель на SOCKS v5. - Отметьте галочку «Отправлять DNS-запросы через SOCKS v5» для защиты от утечек DNS.
5. Сводная таблица и управление туннелями
| Флаг | Тип | Направление трафика | Типовой кейс |
|---|---|---|---|
-L |
Local | ПК → VPS | Доступ к закрытой БД / веб-панели на сервере. |
-R |
Remote | VPS → Ноутбук | Публикация локального сайта/Docker во внешний мир. |
-D |
Dynamic | Приложение → SOCKS5 → VPS | Шифрование браузерного трафика (SOCKS5-прокси). |
Диагностика и завершение сессий:
Для проверки доступности порт-форвардинга в Windows PowerShell используйте:
Test-NetConnection -ComputerName 127.0.0.1 -Port 8080
Для принудительного закрытия подвисших SSH-туннелей в фоновом режиме Windows:
# Завершение всех фоновых SSH-процессов
Stop-Process -Name ssh -Force
# Принудительное освобождение конкретного порта (например, 8080)
Get-NetTCPConnection -LocalPort 8080 | ForEach-Object { Stop-Process -Id $_.OwningProcess -Force }