Перейти до змісту

Підключення через зворотний SSH-тунель

Це продовження статті про зворотний SSH. Там ми налаштували серверну сторону — сервіс autossh, який відкриває зворотний тунель від внутрішнього сервера до публічного VPS (workspace). Тут ми налаштовуємо клієнтську сторону — як підключитися з вашого ноутбука до цих внутрішніх серверів через workspace.

Як це працює

[Ваш ноутбук] --ssh--> [workspace (публічний VPS)] --зворотний тунель--> [внутрішній сервер]

Внутрішній сервер вже встановив зворотний тунель до workspace. Наприклад, він перенаправив свій локальний порт 22 на порт 2222 на workspace. Тож якщо ви підключитесь по SSH до localhost:2222 на workspace, ви потрапите на внутрішній сервер.

Замість того, щоб робити це вручну у два кроки, ми використовуємо ProxyCommand у ~/.ssh/config, щоб зробити це однією командою.

Хост workspace

Спочатку визначте workspace (ваш публічний VPS, до якого підключаються всі тунелі):

Host workspace
    HostName 203.0.113.10
    User admin
    IdentityFile ~/.ssh/id_ed25519
    IdentitiesOnly yes

Підключення до внутрішнього сервера

Кожен внутрішній сервер має зворотний тунель до workspace на унікальному порті. Щоб підключитися через нього:

Host internal-server-1
    HostName localhost
    Port 2222
    User serveradmin
    ProxyCommand ssh -W %h:%p workspace
    IdentityFile ~/.ssh/id_ed25519
    IdentitiesOnly yes

Що відбувається, коли ви виконуєте ssh internal-server-1:

  1. SSH читає конфігурацію і бачить ProxyCommand ssh -W %h:%p workspace.
  2. Спочатку підключається до workspace (вашого публічного VPS).
  3. Звідти підключається до localhost:2222 — це кінцева точка зворотного тунелю.
  4. Ви потрапляєте на внутрішній сервер.

Кілька серверів

Додайте один блок на кожен сервер, кожен зі своїм портом:

Host internal-server-1
    HostName localhost
    Port 2222
    User serveradmin
    ProxyCommand ssh -W %h:%p workspace
    IdentityFile ~/.ssh/id_ed25519
    IdentitiesOnly yes

Host internal-server-2
    HostName localhost
    Port 2223
    User anotheradmin
    ProxyCommand ssh -W %h:%p workspace
    IdentityFile ~/.ssh/id_ed25519
    IdentitiesOnly yes

Host internal-db
    HostName localhost
    Port 2224
    User dbadmin
    ProxyCommand ssh -W %h:%p workspace
    IdentityFile ~/.ssh/id_ed25519
    IdentitiesOnly yes

Тепер ви можете просто виконати:

ssh internal-server-1
ssh internal-server-2
ssh internal-db

Кожна команда — це один крок з вашого ноутбука, але під капотом SSH проходить через workspace.

Корисні глобальні налаштування

Додайте це на початок ~/.ssh/config, щоб зробити всі підключення стабільнішими:

Host *
    IdentityFile ~/.ssh/id_ed25519
    IdentitiesOnly yes
    ControlMaster auto
    ControlPath ~/.ssh/cm-%r@%h:%p
    ControlPersist 10m
    ServerAliveInterval 15
    ServerAliveCountMax 3
  • ControlMaster/ControlPath/ControlPersist — повторно використовує одне TCP-зʼєднання для кількох SSH-сесій до одного хоста. Перше ssh workspace відкриває зʼєднання, наступні миттєво використовують його.
  • ServerAliveInterval/ServerAliveCountMax — надсилає keepalive-пакети кожні 15 секунд; розриває зʼєднання, якщо 3 поспіль не вдалися (45 секунд загалом). Запобігає зависанню сесій.

Конвенція портів

Коли ви керуєте багатьма серверами, корисно призначати порти систематично:

Порт Сервер
2222 internal-server-1
2223 internal-server-2
2224 internal-db
2225 internal-app
... ...

Таким чином ви завжди знаєте, який порт належить якому серверу, а сервіси autossh на кожному сервері використовують відповідний порт у прапорці -R.

Швидка перевірка

# Перевірити зʼєднання з workspace
ssh workspace echo "workspace OK"

# Перевірити внутрішній сервер через тунель
ssh internal-server-1 hostname

Якщо перша команда працює, а друга — ні, зворотний тунель на внутрішньому сервері, ймовірно, не працює — перевірте сервіс autossh там.