В инфраструктуре серверы часто не имеют публичного IP-адреса и доступны только из внутренней сети. При этом отдельный сервер может быть доступен извне и использоваться как промежуточный SSH-узел — bastion или jump host.
Например, bastion доступен по адресу
203.0.113.10, а внутренний сервер имеет адрес 10.0.0.20. Напрямую подключиться к внутреннему серверу из внешней сети нельзя:ssh admin@10.0.0.20
Если bastion имеет доступ к
10.0.0.20:22, используем ProxyJump:ssh -J user@203.0.113.10 admin@10.0.0.20
(адреса в примерах документационные — при повторении замените их на свои)
SSH сначала подключится к
203.0.113.10, а соединение с SSH-сервером на 10.0.0.20 будет установлено через этот промежуточный узел.Если SSH на bastion работает на нестандартном порту, его можно указать прямо в параметре
-J:ssh -J user@203.0.113.10:2222 admin@10.0.0.20
Для постоянной работы удобнее описать оба сервера в
~/.ssh/config:Host bastion
HostName 203.0.113.10
User user
Host internal
HostName 10.0.0.20
User admin
ProxyJump bastion
После этого подключение к внутреннему серверу выполняется обычной командой:
ssh internal
Через тот же маршрут можно использовать
scp:scp backup.tar.gz internal:/tmp/
Или
sftp:sftp internal
Если до целевого сервера нужно пройти через несколько промежуточных узлов, их можно перечислить через запятую:
ssh -J user@gateway1,user@gateway2 admin@internal
То же самое можно записать в конфигурации:
Host internal
HostName 10.0.0.20
User admin
ProxyJump gateway1,gateway2
Для bastion и внутреннего сервера можно использовать разные SSH-ключи:
Host bastion
HostName 203.0.113.10
User jump
IdentityFile ~/.ssh/bastion_ed25519
Host internal
HostName 10.0.0.20
User admin
IdentityFile ~/.ssh/internal_ed25519
ProxyJump bastion
Приватный ключ от внутреннего сервера при этом не требуется копировать на bastion. Аутентификацию на конечном сервере выполняет локальный SSH-клиент.
Посмотреть итоговую конфигурацию, которую SSH применит для подключения, можно через:
ssh -G internal
Например, отдельно вывести основные параметры:
ssh -G internal | grep -Ei 'hostname|user|proxyjump|identityfile'
Если соединение не устанавливается, запускаем SSH с диагностическим выводом:
ssh -v internal
Для более подробной диагностики:
ssh -vvv internal
Так можно увидеть установление соединения через промежуточный узел, выбор ключей, проверку host key и этапы аутентификации.
ProxyJump можно использовать вместе с обычным port forwarding. Например, PostgreSQL работает на внутреннем сервере и слушает только локальный порт 5432:ssh -N -J user@203.0.113.10 \
-L 5433:127.0.0.1:5432 \
admin@10.0.0.20
После этого локально подключаемся к базе через порт
5433:psql -h 127.0.0.1 -p 5433 database
SSH-соединение пройдёт через bastion до внутреннего сервера, а перенаправление на
127.0.0.1:5432 будет выполнено уже со стороны конечного SSH-сервера.🔥
ProxyJump позволяет подключаться к серверам во внутренних сетях через bastion без ручного создания промежуточных SSH-сессий. Настройку можно вынести в ~/.ssh/config и использовать тот же маршрут для ssh, scp, sftp и SSH-туннелей.🚪 Linux Ready | #практика