Введение / Зачем это нужно
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.