Linux

Настройка SSH-туннелей: безопасный проброс портов и трафика

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

Обновлено 5 апреля 2026 г.
15-20 мин
Средняя
FixPedia Team
Применимо к:Ubuntu 20.04 / 22.04 LTSDebian 11 / 12RHEL / AlmaLinux 9+OpenSSH 8.0+

Введение / Зачем это нужно

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

Требования / Подготовка

Перед выполнением команд убедитесь в соблюдении базовых условий:

  • На локальной машине и удалённом хосте установлен openssh-client и openssh-server.
  • У вас есть рабочий SSH-доступ к серверу (аутентификация по ключам предпочтительнее пароля).
  • Вы знаете IP-адрес или домен сервера, а также порты целевых внутренних сервисов.
  • Локальный брандмауэр не блокирует выбранные вами порты, а на сервере открыт порт 22.

Шаг 1: Локальный проброс портов (Local Forwarding)

Локальный туннель принимает соединения на вашем компьютере, шифрует их и пересылает на удалённый сервер, который доставляет их к целевому хосту. Используйте этот режим, когда нужный сервис работает только в локальной сети сервера или на 127.0.0.1.

ssh -L 9090:10.0.0.5:3306 user@remote-server.com -N -f

Разбор параметров:

  • -L 9090:10.0.0.5:3306 — привязывает ваш локальный порт 9090 к 10.0.0.5:3306 в сети сервера.
  • -N — отключает запуск удалённой оболочки, оставляя только туннель.
  • -f — переводит процесс в фон после ввода пароля или проверки ключа.

Теперь подключитесь к удалённой базе через mysql -u root -p -h 127.0.0.1 -P 9090. Весь трафик будет зашифрован.

Шаг 2: Удалённый проброс портов (Remote Forwarding)

Обратная задача: нужно сделать порт с вашего компьютера доступным для других пользователей через внешний сервер. Это удобно для быстрой демонстрации локального веб-приложения или API.

ssh -R 8888:localhost:3000 user@remote-server.com -N -f

По умолчанию сервер привяжет порт 8888 только к 127.0.0.1. Чтобы туннель стал доступен по внешнему IP, добавьте в /etc/ssh/sshd_config на сервере строку GatewayPorts clientspecified, затем перезапустите демон: sudo systemctl restart sshd.

⚠️ Важно: Перед запуском убедитесь, что порт 8888 на сервере свободен. Иначе получите ошибку bind: Address already in use и туннель не создастся.

Шаг 3: Динамический прокси (SOCKS5)

Динамический туннель превращает SSH-клиент в SOCKS5-прокси. Через него можно маршрутировать веб-трафик, минуя локальные ограничения сети, без необходимости указывать каждый адрес вручную.

ssh -D 1080 user@remote-server.com -N -f

Для использования настройте клиентское приложение:

  • В браузерах Chromium/Firefox перейдите в настройки сети и укажите 127.0.0.1 порт 1080, тип SOCKS v5. Обязательно включите опцию «DNS через прокси», иначе утечки DNS сведут безопасность на нет.
  • Для терминала оберните вызовы через proxychains или tsocks, предварительно настроив /etc/proxychains.conf.

Проверка результата

Убедиться в корректной работе туннелей можно одной командой:

ss -tulpn | grep -E '9090|8888|1080'

Вывод покажет процессы, слушающие указанные порты, и подтвердит, что они привязаны к 127.0.0.1 или ::1. Для проверки передачи данных выполните curl -v http://127.0.0.1:9090 или откройте целевой ресурс в браузере.

Чтобы туннель переживал обрывы сети, используйте autossh:

autossh -M 0 -N -f -L 9090:127.0.0.1:80 user@remote-server.com

Флаг -M 0 отключает собственный мониторинг autossh и делегирует проверку SSH-keepalive.

Возможные проблемы

  • Connection refused при подключении к локальному порту. Проверьте, не завершился ли фоновый процесс SSH. Убедитесь, что вы обращаетесь именно к 127.0.0.1, а не к localhost (иногда система резолвит его в ::1, где порт не привязан).
  • Туннель разрывается при долгом простое. Добавьте в ~/.ssh/config параметры ServerAliveInterval 60 и ServerAliveCountMax 3. Клиент начнёт отправлять ping каждые 60 секунд и восстановит соединение при потере ответа.
  • Привязка к IPv6 вызывает конфликты. Если ваша сеть активно использует IPv6, явно укажите версию протокола в команде: ssh -4 -L ... или добавьте AddressFamily inet в конфигурационный файл SSH.

Часто задаваемые вопросы

Почему SSH-туннель сразу закрывается после создания?
Можно ли перенаправлять UDP-трафик через стандартный SSH?
Как разрешить создание туннелей на стороне сервера?

Полезное

Подготовка окружения
Создание локального туннеля (-L)
Настройка динамического прокси (-D)
Проверка и поддержание соединения

Эта статья помогла вам решить проблему?