ローカルマシンAからプロキシBを経由して宛先ホストCにSSHで接続する簡単な方法を探しています。Cの公開キーに付随する秘密キーはBにあり、できません。ローカルマシンにそのキーを置きます。任意のヒント?
また、〜/ .ssh / configを使用してこれを実行できるようにしたいと思います。
ありがとう!
ローカルマシンAからプロキシBを経由して宛先ホストCにSSHで接続する簡単な方法を探しています。Cの公開キーに付随する秘密キーはBにあり、できません。ローカルマシンにそのキーを置きます。任意のヒント?
また、〜/ .ssh / configを使用してこれを実行できるようにしたいと思います。
ありがとう!
回答:
回路図:
ssh ssh
A ------> B ------> C
^ ^
using A's using B's
ssh key ssh key
前提条件:
A
ssh-agentを実行しています。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'
Bのssh秘密鍵が標準以外の場所にある場合、そのパスをの後に追加しますssh-add
。
これでアクセスできるはずですC
からA
。
A$ ssh C
C$
ProxyJump B
。出典:wikibooks-
nc
ますか?
ForwardAgent yes
前に、ProxyJump
コマンドを実行します。
以下が機能しているか確認してください。
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」のIDファイルは、「B」のsshキーへのパスです。ProxyCommandはNetcatを使用して、「B」から「C」への接続を開きます。Netcat、またはncは「B」にインストールする必要があります。
これが他の人に役立つことを願っています。
基本的にリモートインスタンス上の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。
Snowballの回答は大いに役立ちました。ただし、コマンドにいくつかの変更を加え、その動作を説明したいと考えました。この状況を考えると:
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
最終ホストCの認証に必要な1秒間だけキーを追加することを示します。nc %h %p
開始します(両方ともファイル内の情報に基づいてSSHによって記入されます)。netcat
%h
%p
~/.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'