Имеется сервер с доступом к порту 22 с домашнего IP — это будет rtfm-bastion.
За ним, в приватной сети, есть сервер баз данных, доступ к которому разрешён только с bastion хоста — это будет rtfm-db.
Задача: подключаться к серверу баз данных «напрямую», без дополнительных команд на бастион-хосте (вообще это надо будет для Ansible, но можно использовать и в повседневной работе).
Т.е, вместо того, что подключаться на bastion, и потом на нём в консоли вызывать ssh user@rtfm-db
— использовать одну команду с домашней машины.
Решение:
По теме: C: libssh – пример SSH-“клиента” — посмотреть «изнутри» на процесс установления SSH-соединения и сессий в нём.
Содержание
Настройка подключения к Bastion
Сначала — упростим подключение к bastion.
В ~/.ssh/config
вносим:
Host rtfm-bastion Hostname rtfm.co.ua User setevoy IdentityFile /home/setevoy/.ssh/setevoy_main_priv_openssh
Сохраняем, проверяем:
SSH Proxy — подключение к DB
Теперь — обновляем ~/.ssh/config
на своей машине, добавляем подключение к rtfm-db через rtfm—bastion:
Host rtfm-db Hostname 172.31.64.60 User admin ProxyCommand ssh -W %h:%p rtfm-bastion IdentityFile /home/setevoy/Work/RTFM/Bitbucket/aws-credentials/rtfm-prod.pem
Тут 172.31.64.60 будет использоваться для подстановки в %h
команды ProxyCommand
, а -W
указывает на форвадинг standard input/output.
Проверяем:
SSH Multiplexing
В настройках подключения к bastion — добавляем ControlMaster
, ControlPath
и ControlPersist
:
Host rtfm-bastion Hostname rtfm.co.ua User setevoy IdentityFile /home/setevoy/.ssh/setevoy_main_priv_openssh ControlPath ~/.ssh/cm-%r@%h:%p ControlMaster auto ControlPersist 1m
Кратко — ControlMaster
указывает ssh
использовать уже имеющееся TCP соединение, если оно есть. ControlPath
— путь к файлу сокета, а ControlPersist
— поддерживать вторую открытую сессию, даже если первая сессия уже завершена.
Хороший обзор есть
Если не использовать ControlMaster
, и в двух консолях открыть два подключения к rtfm-db — то мы будем иметь два отдельных TCP-соединения:
Теперь — вернём ControlMaster
, ControlPath
и ControlPersist
, закрываем соединения и открываем их заново, две штуки — проверяем соединения теперь (-t
— отобразить только TCP):
Используется только одно, а сессии устанавливаются через сокет, указанный в ControlPath
:
В каталоге ~/.ssh
на своей машине проверяем сокеты:
Ну и время на открытие сессий.
Без ControlMaster
— подключаемся и сразу выполняем exit
, что бы замерить время только на открытие-закрытие подключения и сессии:
Полторы секунды в среднем на каждое.
Возвращаем ControlMaster
, повторяем:
Первый раз почти 2 секунды — установление подключения, «рукопожатие». Второй и третий раз — меньше секунды, т.к. используется уже имеющееся подключение (которое будет активно ещё ControlPersist 1m
).
Ссылки по теме
Event Sequence of an SSH Connection