Я ищу простой способ подключения по SSH с моего локального компьютера A через прокси-сервер B на целевой хост C. Закрытый ключ, который идет с открытым ключом на C, находится на B, и я не могу поместил этот ключ на мою локальную машину. Какие-нибудь советы?
Кроме того, я бы хотел сделать это с помощью ~ / .ssh / config.
Спасибо!
Схема:
ssh ssh
A ------> B ------> C
^ ^
using A's using B's
ssh key ssh key
Предварительные условия:
A
работает ssh-агент;A
может получить доступ B
;B
может получить доступ C
;A
открытый ключ ssh присутствует в B:~/.ssh/authorized_keys
B
открытый ключ ssh присутствует в C:~/.ssh/authorized_keys
В ~/.ssh/config
на A
, Добавить
Host C
ProxyCommand ssh -o 'ForwardAgent yes' B 'ssh-add && nc %h %p'
Если ваш закрытый ключ ssh на B находится в нестандартном месте, добавьте его путь после ssh-add
.
Теперь у вас должен быть доступ к C
из A
:
A$ ssh C
C$
Проверьте, работает ли следующее.
ssh -t B ssh C
Используйте следующую команду, если вы хотите использовать ключ, хранящийся на B.
ssh -t B ssh -i /path/to/identity_on_B C
Здесь мы указываем команду, т.е. ssh -i /path/to/identity_on_B C
для выполнения на B вместо оболочки входа.
Я решил это сейчас. Вот решение, которое довольно простое. Я должен был увидеть это раньше:
~ / .ssh / config:
Host B
HostName 1.2.3.4
User myuser
IdentityFile ~/.ssh/rsa_key
ControlMaster auto
ControlPath ~/.ssh/socket/master-%l-%r@%h:%p
Host C.*
User customer_username
Port customer_port
IdentityFile remote/path/to/ssh/key
ForwardAgent yes
ProxyCommand ssh accessable.server nc %h %p
Host C.server-1
HostName 2.3.4.5
«B» - это прокси-сервер, через который вы прыгаете. Его следует настроить так же, как вы обычно настраиваете доступ к серверу.
«C» - это хост назначения. Его необходимо настроить для использования «B» в процессе подключения. Идентификационный файл в 'C' - это путь к ssh-ключу на 'B'. ProxyCommand использует Netcat для открытия соединения с «C» из «B». Netcat, или nc, необходимо будет установить на «B».
ПРИМЕЧАНИЕ 1. Чтобы это сработало, вам необходимо скопировать идентификационный файл B (обычно ~ / .ssh / rd_isa) в A. Обычно я меняю его имя на rd_isa_B.
ПРИМЕЧАНИЕ 2: это решение также работает для scp.
Надеюсь, это поможет другим.
Я написал простой скрипт, чтобы в основном перечислить мои ключи ssh на удаленном экземпляре, а затем добавить тот, который я выбрал, в свой локальный агент ssh. Это не очень чисто, но позволяет мне хранить все ключи в удаленном месте, а не локально.
Вот сценарий, если кому интересно:
#!/usr/bin/ruby
require "rubygems"
require "fileutils"
# Get key list
key_list = (`ssh jumpbox "cd ~/.ssh/ ; ls id_rsa*" | sed 's/id_rsa_/ /g' | sed 's/id_rsa//g'`)
puts ' '
puts 'Available customer keys:'
puts key_list
# Get customer name input
puts ' '
puts 'Enter customer name: '
customer_name = gets.chomp
# Add key to ssh-agent
key_name = "~/.ssh/id_rsa_#{customer_name}"
puts ' '
puts "Adding #{key_name} to local ssh-agent"
`ssh jumpbox "ssh-add ~/.ssh/id_rsa_#{customer_name}"`
exit 0
#!/usr/bin/env bash
target_host=10.121.77.16
target_port=22
target_user=vagrant
bastion_user=yourusername
bastion_host=10.23.85.245
bastion_port=32780
scp -P $target_port -o ProxyCommand="ssh -o 'ForwardAgent yes' $bastion_user@$bastion_host -p $bastion_port 'ssh-add ~/.ssh/*.rsa && nc %h %p'" /tmp/x.txt $target_user@$target_host:/tmp/
Делать:
ssh someuser@IP_D
такой, что
A -> B-> C -> D
где A - хост, на котором вы находитесь,
отредактируйте ваш локальный ~ / .ssh / config следующим образом:
Host IP_D
ProxyCommand ssh -o 'ForwardAgent yes' userX@IP_C 'ssh-add && nc %h %p'
Host IP_C
ProxyCommand ssh -o 'ForwardAgent yes' userY@IP_B 'ssh-add && nc %h %p'
Этот ответ основан на выбранном ответе. Мне нужно было выяснить, как разные пользователи вписываются в общий сценарий.
У меня это работает. HTH.
Снежок ответ очень помогло. Однако я внес некоторые изменения в команду и хотел объяснить, как она работает. Учитывая эту ситуацию:
ssh ssh
A -------> B -------> C
^ ^
using A's using B's
ssh key ssh key
Измените свой ~/.ssh/config
файл и добавьте хост B
через который вы хотите перейти, как вы обычно настраиваете хост:
Host B
User myusername
HostName b.mycompany.com
Затем вы добавляете хост C
на котором вы хотите закончить:
Host C
User myusername
HostName c.intranet.mycompany.com
ProxyCommand ssh -T -q -o 'ForwardAgent yes' B 'ssh-add -t 1 && nc %h %p'
Обратите внимание ProxyCommand
, где:
ssh -T -q
указывает, что ему не следует выделять псевдо-TTY (-T
) и молчи (-q
);B
, мы добавляем ключ к SSH-ключам A
через ssh-add
;-o 'ForwardAgent yes'
.ssh-add -t 1
указывает, что я хочу, чтобы ключ был добавлен только на 1 секунду, необходимую для аутентификации на конечном хосте C;nc %h %p
инициирует netcat
подключение к конечному хосту %h
в порту %p
(оба они будут заполнены SSH на основе информации в ~/.ssh/config
файл).Если вам нужно указать собственный ключ на B
для использования, вы можете сделать это, изменив ssh-add
часть:
Host C
User myusername
HostName c.intranet.mycompany.com
ProxyCommand ssh -T -q -o 'ForwardAgent yes' B 'ssh-add -t 1 ~/.ssh/mykey && nc %h %p'