⚙️ Паровой сервер ROADIT

SSH-туннелирование: практическое руководство по Local, Remote и Dynamic Port Forwarding

SSH давно перестал быть просто способом подключиться к удалённому серверу. В руках администратора он превращается в универсальный инструмент для безопасной доставки сетевого трафика туда, куда обычным пользователям путь закрыт.

Представьте старый паровой завод. Между цехами идут десятки труб, по которым движется пар. Никто не видит содержимое труб, но каждый механизм получает именно то давление, которое ему необходимо. SSH-туннель работает почти так же: вместо пара внутри движется TCP-трафик, а вместо медных труб — зашифрованный канал.

Сегодня SSH-туннели используются буквально везде:

  • доступ к внутренним веб-приложениям;
  • подключение к MySQL и PostgreSQL без открытия портов наружу;
  • безопасный RDP;
  • обход сетевых ограничений;
  • временная публикация локального сервиса в Интернет;
  • SOCKS-прокси для браузера.

Главное преимущество — никаких VPN, дополнительных сервисов и сложной инфраструктуры. Достаточно установленного OpenSSH, который входит практически во все современные Linux-дистрибутивы и доступен в Windows. Поддержка локального (-L), удалённого (-R) и динамического (-D) проброса портов остаётся стандартной возможностью OpenSSH.



Как работает SSH-туннель

Самая распространённая ошибка начинающих администраторов — думать, что SSH-туннель каким-то образом “открывает порт”.

На самом деле происходит совсем другое. После подключения по SSH создаётся защищённый канал. Внутри этого канала начинают передаваться обычные TCP-пакеты. Получается примерно такая схема.

SSH Tunnel (AES Encryption)

Никакой магии. SSH просто принимает соединение на одном конце трубы и аккуратно выпускает его на другом.


Какие бывают SSH-туннели

Практически вся работа сводится к трём режимам.

РежимКлючНазначение
Local Forwarding-Lоткрыть удалённый сервис локально
Remote Forwarding-Rоткрыть локальный сервис удалённо
Dynamic Forwarding-DSOCKS-прокси

На практике около 90% задач решаются именно этими тремя режимами.


Local Port Forwarding (-L)

Это самый популярный сценарий.

Допустим, имеется сервер базы данных:

10.10.50.15:5432

Он доступен только внутри корпоративной сети.

Но есть SSH-сервер:

gateway.company.local

через который можно войти.

Тогда команда выглядит так:

ssh -L 5432:10.10.50.15:5432 admin@gateway.company.local

После подключения можно открыть локальный клиент PostgreSQL:

psql -h localhost

и работать так, словно база находится на вашем компьютере.

SSH самостоятельно доставит весь трафик через защищённый канал.

Разбираем команду по винтикам

ssh

Запускает SSH-клиент.

-L

Создаёт локальный туннель.

5432

Порт, который открывается у вас на компьютере.

10.10.50.15

Хост назначения.

5432

Порт удалённой базы.

admin@gateway.company.local

SSH-сервер, через который строится тоннель.

Практический пример

Есть внутренний Jenkins.

192.168.10.25:8080

Доступен только внутри сети.

Выполняем:

ssh -L 8080:192.168.10.25:8080 admin@vpn.company.ru

Теперь браузер открывает

http://localhost:8080

и вы работаете с Jenkins так, будто сидите прямо в офисе. Никаких опубликованных портов. Никакого VPN.

Полезные параметры

Очень часто туннель нужен без открытия консоли.

Используйте:

ssh -N -L 8080:192.168.10.25:8080 admin@server

Опция

-N

говорит SSH: “терминал не нужен, только туннель.”.

Если хочется сразу отправить процесс в фон:

ssh -f -N -L 8080:192.168.10.25:8080 admin@server

Теперь SSH продолжит работать как демон. Такие режимы предусмотрены OpenSSH и широко используются для постоянных туннелей.


Remote Port Forwarding (-R)

Если Local Forwarding позволяет попасть внутрь удалённой сети, то Remote Forwarding работает наоборот. Он публикует локальный сервис на удалённом сервере.

Это очень полезно, если:

  • компьютер находится за NAT;
  • провайдер не даёт белый IP;
  • необходимо временно показать коллегам локальное веб-приложение;
  • нужно организовать обратный доступ к сервису.

Например, локально запущен веб-сервер:

localhost:3000

Выполняем:

ssh -R 8080:localhost:3000 admin@public-server

Теперь пользователи, подключившиеся к удалённому серверу на порт 8080, смогут работать с вашим локальным приложением. По умолчанию удалённый порт обычно слушает только loopback, а для публикации на всех интерфейсах может потребоваться настройка GatewayPorts на сервере.

Где это реально используется

За годы администрирования чаще всего приходилось использовать Remote Forwarding в таких ситуациях:

  • демонстрация локального сайта заказчику;
  • временный доступ к веб-интерфейсу оборудования;
  • удалённая диагностика сервисов;
  • проброс RDP через Linux-хост;
  • обслуживание IoT-устройств за NAT.

Практически всегда это оказывается быстрее и безопаснее, чем временно открывать порты на маршрутизаторе.


Dynamic Port Forwarding (-D): превращаем SSH в SOCKS5-прокси

Если локальный (-L) и удалённый (-R) проброс портов напоминают медные трубы, соединяющие две конкретные машины, то режим -D — это уже настоящий распределительный коллектор. Через него можно направлять практически любой TCP-трафик.

Вместо проброса одного порта OpenSSH запускает локальный SOCKS5-прокси, а приложения сами решают, какие соединения отправлять через него. Такой режим поддерживается OpenSSH уже много лет и остаётся стандартным способом организации динамического туннеля.

Например:

ssh -D 1080 -N user@server.example.com

После выполнения команды на локальном компьютере появится SOCKS5-прокси:

127.0.0.1:1080

Теперь достаточно указать этот прокси в браузере, VS Code, IDE или другом приложении, поддерживающем SOCKS5.

Где используется Dynamic Forwarding

На практике этот режим регулярно применяется в следующих сценариях:

  • безопасный доступ к внутренним веб-приложениям;
  • работа с административными панелями;
  • подключение IDE к внутренним API;
  • тестирование сервисов из другой сети;
  • безопасная работа через публичный Wi-Fi.

Важно понимать одну особенность: SSH не является полноценной заменой VPN. Через SOCKS-прокси пойдёт только трафик тех приложений, которые вы явно настроите на его использование.


Используем ~/.ssh/config

После десятка SSH-команд терминал начинает напоминать свиток древнего инженера. Постоянно вводить длинные параметры неудобно, поэтому OpenSSH позволяет хранить настройки в конфигурационном файле клиента.

Например:

Host prod-db
    HostName 192.168.20.15
    User admin
    Port 22
    IdentityFile ~/.ssh/id_ed25519

Теперь подключение выглядит максимально просто:

ssh prod-db

Если требуется создать туннель автоматически:

Host jenkins
    HostName bastion.company.local
    User admin
    LocalForward 8080 192.168.100.25:8080

После этого достаточно выполнить:

ssh jenkins

Туннель создастся автоматически.


ProxyJump — современная альтернатива длинным цепочкам SSH

Во многих компаниях серверы находятся во внутренней сети и недоступны напрямую. Для доступа используется bastion host (jump server).

Раньше приходилось применять громоздкие конструкции через ProxyCommand.

Сегодня используется гораздо более удобная возможность OpenSSH — ProxyJump (или ключ -J). Она позволяет автоматически строить цепочку подключений через один или несколько промежуточных серверов.

Простейший пример:

ssh -J bastion.company.local db01.internal

Или через конфигурационный файл:

Host bastion
    HostName bastion.company.local
    User admin

Host db01
    HostName 10.20.30.15
    User postgres
    ProxyJump bastion

Теперь достаточно выполнить:

ssh db01

OpenSSH самостоятельно подключится к bastion, а затем перенаправит соединение на внутренний сервер.


SSH-туннели в Windows

Начиная с современных версий Windows 10 и Windows 11, OpenSSH Client можно установить как дополнительный компонент или использовать уже предустановленную версию в новых сборках.

Проверка выполняется одной командой:

ssh -V

Создание туннеля ничем не отличается от Linux:

ssh -L 3306:10.10.10.20:3306 admin@server

Или:

ssh -D 1080 admin@server

Благодаря этому не требуется использовать сторонние программы вроде PuTTY, если достаточно возможностей OpenSSH.


Автоматическое восстановление соединения с помощью AutoSSH

SSH-соединения иногда обрываются:

  • нестабильный Интернет;
  • перезагрузка маршрутизатора;
  • смена сети;
  • временная потеря связи.

Если туннель должен работать постоянно, удобно использовать autossh.

Установка в Debian/Ubuntu:

sudo apt install autossh

Запуск:

autossh -M 0 -f -N \
-L 5432:10.10.50.15:5432 \
admin@server

В отличие от обычного ssh, утилита автоматически восстановит соединение после разрыва.


Типичные ошибки

Connection refused

Причины:

  • сервис не запущен;
  • указан неправильный порт;
  • firewall блокирует соединение.

Проверяем:

ss -tln

или

sudo lsof -i

Address already in use

Локальный порт уже используется.

Проверяем:

ss -tlnp

или меняем порт:

ssh -L 8081:...

Permission denied (publickey)

Наиболее распространённая причина — неправильный ключ.

Проверяем:

ssh -i ~/.ssh/id_ed25519 server

или включаем подробный вывод:

ssh -vvv server

Опция -vvv выводит детальную информацию о процессе подключения и значительно упрощает диагностику проблем.


Практические рекомендации

За годы эксплуатации SSH-туннелей сформировался небольшой набор правил, который помогает избежать большинства проблем.

  • Не публикуйте базы данных напрямую в Интернет — используйте SSH-туннели.
  • Применяйте ProxyJump вместо сложных цепочек ProxyCommand.
  • Для постоянных соединений используйте autossh или systemd.
  • Всегда работайте по ключевой аутентификации.
  • Ограничивайте удалённый проброс (-R) настройками сервера и внимательно относитесь к параметру GatewayPorts, если требуется доступ извне.

Заключение

SSH-туннелирование остаётся одним из самых универсальных инструментов системного администратора. С его помощью можно безопасно подключаться к внутренним сервисам, организовывать временный доступ к приложениям, строить цепочки через bastion-хосты и создавать защищённые каналы без развёртывания полноценного VPN.

Главное — понимать, какой режим подходит под конкретную задачу:

  • -L — получить доступ к удалённому сервису с локальной машины.
  • -R — предоставить удалённый доступ к локальному приложению.
  • -D — поднять SOCKS5-прокси для гибкой маршрутизации трафика.
  • ProxyJump — упростить работу с серверами, расположенными за bastion-хостом.

Когда эти инструменты освоены, SSH превращается не просто в средство удалённого входа, а в универсальный механизм управления сетевыми соединениями — надёжный, предсказуемый и проверенный временем.



⚙️ Машинное отделение ROADIT благодарит за прочтение.
Больше команд, шпаргалок и обзоров — на roadit.ru и в нашем Телеграф-канале.
📋 Все команды


Оставьте комментарий