Способ 1 - лук (вложенные туннели)
С OpenSSH 7.3 и позже:
Host webserverA
ProxyJump bastionA,bastionB
То же самое через командную строку:
$ ssh -J bastionA,bastionB webserverA
В качестве альтернативы (также с 7.3; не смешивайте это и выше):
Host webserverA
ProxyJump bastionB
Host bastionB
ProxyJump bastionA
В более старых версиях - в основном идентичные (но не копируются автоматически такие параметры, как ssh -v
):
Host webserverA
ProxyCommand ssh bastionB -W %h:%p
Host bastionB
ProxyCommand ssh bastionA -W %h:%p
Этот метод инициирует все соединения локально, настраивая туннель ssh -W
для каждого шага. Поэтому аутентификация происходит локально (ForwardAgent и GSSAPIDelegateCredentials не требуются), и ваш локальный файл .ssh/config
применяется к каждому шагу. На стороне сервера требуется только базовая поддержка пересылки TCP, так же как и при использовании -W
или -L
.
Тем не менее, каждый уровень добавляет дополнительные издержки, так как он в конечном итоге несет SSH в SSH в SSH в SSH.
Обратите внимание, что каждый хост, кроме самого внешнего, перечисляет ProxyCommand через сервер непосредственно перед ним. Если бы у вас было 3 сервера, вы бы использовали [webserverA через bastionC], [bastionC через bastionB] и [bastionB через bastionA].
Способ 2 - прыжок за прыжком
Host webserverA
ProxyCommand ssh bastionA -A ssh bastionB -W %h:%p
Этот метод инициирует переход подключений за прыжком, запуская ssh
на каждом прыжке для подключения к следующему. Следовательно, ssh-agent и ForwardAgent
должны быть включены (или GSSAPIDelegateCredentials
если вы используете Kerberos); любые другие специальные настройки .ssh/config
должны быть скопированы на все хосты бастиона.
С другой стороны, он требует меньших издержек протокола (максимум два уровня на каждом шаге).
(Изменить: добавлен -A
всегда запрашивать переадресацию агента.)