Модуль 1: Linux, Сети и SSH

SSH-туннелирование и проброс портов: Local, Remote (-R) и Dynamic (-D) Port Forwarding

1. Что такое SSH-туннелирование и зачем оно нужно

SSH-туннелирование (Port Forwarding) — это метод создания защищенного зашифрованного канала между локальным компьютером и удаленным сервером для безопасной пересылки сетевого трафика произвольных сервисов и протоколов.

Как работает SSH-тунель
Схема 1: Как работает SSH-тунель

Основные сценарии применения:

  • Защищенный доступ: Подключение к локальным базам данных (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
Критический нюанс (GatewayPorts): По умолчанию SSH-сервер разрешает подключение к проброшенному порту только локально внутри себя. Чтобы порт 8080 на VPS стал доступен для всего интернета, отредактируйте конфиг SSH на сервере:
# /etc/ssh/sshd_config
GatewayPorts yes
После этого перезапустите службу SSH: sudo systemctl restart ssh.

Нюансы настройки SSH-авторизации на втором устройстве (ноутбуке):

  1. Авторизация по ключам: Сервер с отключенным парольным входом вернет ошибку Permission denied (publickey). На ноутбуке необходимо сгенерировать отдельную пару ключей:
    ssh-keygen -t ed25519
  2. Добавление ключа: Скопируйте публичную часть (Get-Content $HOME\.ssh\id_ed25519.pub) и вставьте ее в ~/.ssh/authorized_keys на VPS.
  3. Запуск однострочного 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):

  1. Откройте Настройки → прокрутите вниз до блока Настройки сети → нажмите Настроить...
  2. Выберите пункт «Ручная настройка сервиса прокси».
  3. Заполните поле Узел SOCKS: 127.0.0.1 | Порт: 1080 | переключатель на SOCKS v5.
  4. Отметьте галочку «Отправлять 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 }