Я пытаюсь создать туннель ssh для доступа к удаленному серверу (A), доступ к которому возможен только через другой сервер (B). У меня есть ключ на локальной машине (L), чтобы добраться до сервера-ретранслятора (B), и еще один ключ на сервере-ретрансляторе (B), чтобы добраться до сервера назначения (A).
[локальная машина(L) с ключом к серверу ретрансляции(B)] --> [сервер ретрансляции(B) с ключом к серверу назначения (A)] --> [сервер назначения (A)]
У меня на локальной машине есть файл ~/.ssh/config, который выглядит следующим образом:
Host relay.server(B)
Hostname relay.server
Port 22
User me
IdentityFile ~/.ssh/id_rsa
Host destination.server(A)
Hostname destination.server
Port 1122
User me
IdentityFile ~/.ssh/id_rsa
И я могу легко заставить свой туннель работать с помощью следующего:
запуск команды: ssh -N -L 1122:SERVER_PRIVATE_IP:22 relay.server(B)
на моей локальной машине (L). Это запрашивает у меня пароль для разблокировки первого ключа, а затем, кажется, зависает, не возвращает запрос, использование параметра -f
или, заканчивающегося на , &
не позволяет мне ввести пароль. Однако, если я ввожу ^C
эту команду после ввода пароля и затем ввожу, ssh destination.server(A)
я получаю запрос на ввод пароля для разблокировки второго ключа, после чего я подключаюсь к целевому серверу (A).
Я ищу одну команду, которая позволит мне подключиться к целевому серверу (A) с моей локальной машины (L) и предложит мне ввести пароли, необходимые для разблокировки каждого ключа. Или предложение по альтернативному способу организации вещей, чтобы я мог напрямую подключиться к целевому серверу (A) с моей локальной машины (L) через сервер-ретранслятор (B).
решение1
Короткий ответ: вам нужно
ProxyCommand
используяnc
для подключения черезForwardAgent
передавать ключи- убедитесь, что ваш открытый ключ присутствует
.ssh/authorized_keys
на всех серверах
Host relay Hostname relay.server.fqdn.or.IP User me IdentityFile ~/.ssh/id_rsa ForwardAgent yes Host destination Hostname destination.server.fqdn.or.IP User me IdentityFile ~/.ssh/id_rsa ProxyCommand ssh -q relay "nc %h %p" ForwardAgent yes
Более длинная часть.
Опция ProxyCommand
в ssh config запускает команду всякий раз, когда Host
используется это включение. Обычно она используется с nc
доступным из nmap.org, также известным как ncat
и имеет множество опций.
В приведенной выше Host destination
записи конфигурации ssh ProxyCommand
было установлено значение ssh -q relay "nc %h %p"
, которое гласит: ssh должен тихо ретранслироваться и запускаться nc destination.server.fqdn.or.IP 22
.
nc
устанавливает соединение между входящим ssh и пунктом назначения.
Сообщает ForwardAgent yes
ssh добавить ключ в ssh-agent. Агенты ssh отслеживают ключи и используются для автоматической передачи нужного на хост по мере необходимости. Сообщает ForwardAgent yes
агенту передать ключ другому агенту на ретрансляторе, а затем снова в пункт назначения.
Теперь, чтобы все это работало, каждый сервер, через который вы проходите, и в конечном итоге пункт назначения должны иметь открытый ключ, связанный с вашим закрытым ключом (id_rsa) в своем .ssh/authorized_keys
файле. Когда вы создавали свой закрытый ключ, id_rsa, открытый ключ, id_rsa.pub, также должен был быть создан.
Если у вас нет вашего открытого ключа, вы всегда можете получить его из закрытого ключа через ssh-keygen -y -f ~/.ssh/id_rsa
для легкого копирования/вставки. Обратите внимание, что открытый ключ имеет 2 или 3 поля, разделенных пробелами, ноодинлиния.
Итак, ssh relay
отредактируйте ~/.ssh/authorized_keys
(который может отсутствовать, поэтому mkdir -p ~/.ssh
может быть необходим) и вставьте открытый ключ в новую строку (или в первую, если его нет).
Находясь на сервере-ретрансляторе, проверьте, nc
существует ли он в /bin или /usr/bin. Если его нет, то вам нужно установить его с помощью менеджера пакетов, yum или apt-get.
С сервера-ретранслятора ssh destination
выполните то же самое обновление ~/.ssh/authorized_keys
.
exit
полностью на ваш локальный компьютер, и вы сможетеssh destination
решение2
Более новые версии OpenSSH ProxyJump
позволяют .ssh/config
:
Host relay
Hostname relay.server.fqdn.or.IP
User me
IdentityFile ~/.ssh/id_rsa
ForwardAgent yes
Host destination
Hostname destination.server.fqdn.or.IP
ProxyJump relay
User me
IdentityFile ~/.ssh/id_rsa