Skip to content

This article is available in Russian. An English version is on the way.Open the Russian page

SSH-туннели: доступ к базе и админкам без открытых портов

Пробросить порт с сервера на свой компьютер (-L), обратно (-R) или через SOCKS (-D) и держать туннель постоянно с autossh.

Level
Intermediate
Reading time
3 min read
Updated
Tested on
Ubuntu 22.04, Ubuntu 24.04, Debian 12
Contents
  1. Локальный проброс (-L): сервер → ваш компьютер
  2. Обратный проброс (-R): ваш компьютер → сервер
  3. Динамический проброс (-D): SOCKS-прокси для себя
  4. Туннель в ~/.ssh/config
  5. Постоянный туннель с autossh
  6. Проверьте результат
  7. Частые ошибки

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

Локальный проброс (-L): сервер → ваш компьютер

Порт 5432 PostgreSQL на сервере станет доступен на вашем компьютере по адресу localhost:15432:

bash
$ ssh -N -L 15432:127.0.0.1:5432 root@203.0.113.10

Пока команда работает, подключайтесь клиентом базы к localhost:15432. -N означает «не открывать терминал, только туннель». Остановить — Ctrl+C.

Можно пробросить сразу несколько портов:

bash
$ ssh -N -L 15432:127.0.0.1:5432 -L 16379:127.0.0.1:6379 root@203.0.113.10

Обратный проброс (-R): ваш компьютер → сервер

Показать коллеге или вебхуку локальную разработку: порт 3000 вашего компьютера появится на сервере как 127.0.0.1:8080, а наружу его отдаст Nginx на сервере.

bash
$ ssh -N -R 8080:127.0.0.1:3000 root@203.0.113.10

Динамический проброс (-D): SOCKS-прокси для себя

Полезно, чтобы открыть в браузере внутренние адреса вашей инфраструктуры (например, панели на 10.8.0.0/24), не пробрасывая каждый порт отдельно:

bash
$ ssh -N -D 127.0.0.1:1080 root@203.0.113.10

В настройках браузера или расширения укажите SOCKS5-прокси 127.0.0.1:1080.

Туннель в ~/.ssh/config

~/.ssh/config
Host db-tunnel    HostName 203.0.113.10    User root    LocalForward 15432 127.0.0.1:5432    ServerAliveInterval 30    ServerAliveCountMax 3
bash
$ ssh -N db-tunnel

Постоянный туннель с autossh

autossh перезапускает туннель при обрыве. Пример для второго сервера, которому нужен постоянный доступ к базе на первом (вход по ключу без фразы-пароля):

bash
$ apt install -y autossh
/etc/systemd/system/db-tunnel.service
[Unit]Description=SSH tunnel to PostgreSQLAfter=network-online.targetWants=network-online.target[Service]User=deployEnvironment=AUTOSSH_GATETIME=0ExecStart=/usr/bin/autossh -M 0 -N -o ServerAliveInterval=30 -o ServerAliveCountMax=3 -o ExitOnForwardFailure=yes -L 15432:127.0.0.1:5432 deploy@203.0.113.10Restart=alwaysRestartSec=5[Install]WantedBy=multi-user.target
bash
$ systemctl daemon-reload$ systemctl enable --now db-tunnel$ systemctl status db-tunnel

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

bash
$ ss -tln | grep 15432$ psql -h 127.0.0.1 -p 15432 -U app app

Частые ошибки

  • bind: Address already in use — локальный порт занят. Выберите другой, например 25432.
  • channel open failed: connect failed — на сервере по указанному адресу и порту никто не слушает. Проверьте ss -tlnp на сервере.
  • Туннель в systemd не стартует — ключ защищён фразой-паролем или хост не добавлен в known_hosts пользователя. Подключитесь один раз вручную от этого пользователя.

Read to the end and the article counts toward your learning progress.

  • ssh
  • туннель
  • проброс портов
  • autossh
  • socks

Was this article helpful?