Підключення через зворотний SSH-тунель
Це продовження статті про зворотний SSH. Там ми налаштували серверну сторону — сервіс autossh, який відкриває зворотний тунель від внутрішнього сервера до публічного VPS (workspace). Тут ми налаштовуємо клієнтську сторону — як підключитися з вашого ноутбука до цих внутрішніх серверів через workspace.
Як це працює
Внутрішній сервер вже встановив зворотний тунель до workspace. Наприклад, він перенаправив свій локальний порт 22 на порт 2222 на workspace. Тож якщо ви підключитесь по SSH до localhost:2222 на workspace, ви потрапите на внутрішній сервер.
Замість того, щоб робити це вручну у два кроки, ми використовуємо ProxyCommand у ~/.ssh/config, щоб зробити це однією командою.
Хост workspace
Спочатку визначте workspace (ваш публічний VPS, до якого підключаються всі тунелі):
Підключення до внутрішнього сервера
Кожен внутрішній сервер має зворотний тунель до 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:
- SSH читає конфігурацію і бачить
ProxyCommand ssh -W %h:%p workspace. - Спочатку підключається до
workspace(вашого публічного VPS). - Звідти підключається до
localhost:2222— це кінцева точка зворотного тунелю. - Ви потрапляєте на внутрішній сервер.
Кілька серверів
Додайте один блок на кожен сервер, кожен зі своїм портом:
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 проходить через 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 там.