SSH умеет не только открывать терминал, но и пробрасывать порты по зашифрованному соединению. Это самый простой способ подключиться к PostgreSQL, Redis или веб-панели, которые слушают только 127.0.0.1 на сервере: ничего не нужно открывать в фаерволе.
Локальный проброс (-L): сервер → ваш компьютер
Порт 5432 PostgreSQL на сервере станет доступен на вашем компьютере по адресу localhost:15432:
$ ssh -N -L 15432:127.0.0.1:5432 [email protected]Пока команда работает, подключайтесь клиентом базы к localhost:15432. -N означает «не открывать терминал, только туннель». Остановить — Ctrl+C.
Можно пробросить сразу несколько портов:
$ ssh -N -L 15432:127.0.0.1:5432 -L 16379:127.0.0.1:6379 [email protected]Обратный проброс (-R): ваш компьютер → сервер
Показать коллеге или вебхуку локальную разработку: порт 3000 вашего компьютера появится на сервере как 127.0.0.1:8080, а наружу его отдаст Nginx на сервере.
$ ssh -N -R 8080:127.0.0.1:3000 [email protected]Динамический проброс (-D): SOCKS-прокси для себя
Полезно, чтобы открыть в браузере внутренние адреса вашей инфраструктуры (например, панели на 10.8.0.0/24), не пробрасывая каждый порт отдельно:
$ ssh -N -D 127.0.0.1:1080 [email protected]В настройках браузера или расширения укажите SOCKS5-прокси 127.0.0.1:1080.
Туннель в ~/.ssh/config
Host db-tunnel HostName 203.0.113.10 User root LocalForward 15432 127.0.0.1:5432 ServerAliveInterval 30 ServerAliveCountMax 3$ ssh -N db-tunnelПостоянный туннель с autossh
autossh перезапускает туннель при обрыве. Пример для второго сервера, которому нужен постоянный доступ к базе на первом (вход по ключу без фразы-пароля):
$ apt install -y autossh[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 [email protected]Restart=alwaysRestartSec=5[Install]WantedBy=multi-user.target$ systemctl daemon-reload$ systemctl enable --now db-tunnel$ systemctl status db-tunnelПроверьте результат
$ 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 пользователя. Подключитесь один раз вручную от этого пользователя.