我正在嘗試建立一個 ssh 隧道來存取只能透過另一台伺服器(B)存取的遠端伺服器(A)。我的本機電腦(L)上有一個金鑰可以到達中繼伺服器(B),中繼伺服器(B)上有另一個金鑰可以到達目標伺服器(A)。
[具有中繼伺服器(B)金鑰的本機電腦(L)] --> [具有目標伺服器(A)金鑰的中繼伺服器(B)] --> [目標伺服器(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)。
我正在尋找一個命令,它可以讓我從本地電腦(L)連接到目標伺服器(A),並提示我提供解鎖每個金鑰所需的密碼。或建議另一種組織方式,以便我可以透過中繼伺服器 (B) 從本機電腦 (L) 直接連接到目標伺服器 (A)。
答案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
較長的部分。
每當使用該封裝時,ssh 配置中的選項ProxyCommand
就會執行命令。Host
它通常與nc
nmap.org(也稱為 nmap.org)一起使用,ncat
並且有許多選項。
在上面的Host destination
ssh 配置條目中,ProxyCommand
設定為ssh -q relay "nc %h %p"
: ssh to要安靜地中繼並運行nc destination.server.fqdn.or.IP 22
。
nc
在傳入的 ssh 和目標之間建立連線。
告訴ForwardAgent yes
ssh 將金鑰新增至 ssh-agent。 ssh 代理程式會追蹤金鑰並用於根據需要自動將正確的金鑰傳遞給主機。告訴ForwardAgent yes
代理將密鑰傳遞給中繼上的另一個代理,然後再次傳遞到目的地。
.ssh/authorized_keys
現在,為了使這一切發揮作用,您所經過的每台伺服器以及最終的目的地都必須在其文件中具有與您的私鑰 (id_rsa) 關聯的公鑰。當您建立私鑰 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