我想使用中間(堡壘、跳躍、網關)伺服器 ssh 到遠端私有主機。這個指令運作正常:
ssh gateway ssh private
透過這個 ~/.ssh/config 設定:
Host gateway
User gateway-user
HostName XX.XX.XX.XX
RequestTTY force
如何在 ~/.ssh/config 中實現此功能?我已經嘗試了 ProxyCommand 的多次迭代,但沒有成功。我想使用位於網關主機上的識別檔案來存取私有主機。我希望能夠做到:
ssh private
我知道這裡描述的技術,但它要求我的公鑰位於所有私人主機上,但我不希望這樣:
http://www.lorrin.org/blog/2014/01/10/one-liner-ssh-via-jump-box-using-proxycommand/
答案1
首先,在網關上設定您的 ssh 金鑰,以便您可以 ssh 到私有。然後在您的客戶端上建立一個單獨的私鑰/公鑰對,用於在網關上進行身份驗證。例如ssh-keygen -t rsa -f id_gateway
。
然後在網關上,使用command=
authorized_keys 檔案中的語法。例如,您的條目可能如下所示:
command="sh -c 'ssh private ${SSH_ORIGINAL_COMMAND:-}'" ssh-rsa AAAAB3....
搜尋 sshd 線上說明頁以command="command"
取得更多資訊。請務必將 id_gateway.pub 金鑰新增至此行。然後在.ssh/config
您的客戶端中新增以下條目:
Host private
User gateway-user
Hostname xxx.xxx.xxx.xxx
IdentitiesOnly Yes
IdentityFile ~/.ssh/id_gateway
現在,您應該能夠從您的客戶端ssh private
直接進入。scp
sftp
額外學分
如果您想將其用於多台伺服器,但只想管理網關上的公鑰,則可以使用以下技巧。sshd
預設只允許從本地環境接收某些變數。其中之一是LC_PAPER
很少用於任何用途。因此我們可以使用它來傳遞伺服器的主機名,如下所示:
首先,將公鑰條目更改為
command="sh -c 'ssh $LC_PAPER ${SSH_ORIGINAL_COMMAND:-}'" ssh-rsa AAAAB3...
然後在您的客戶端上,向您的文件(或您使用的任何 shell)添加一個函數,.bashrc
如下所示:
ssh_proxy() {
LC_PAPER=$1 /usr/bin/ssh $*
}
如果需要的話,可以建立一個別名:
alias ssh=ssh_proxy
最後,將Host
部分新增至您的.ssh/config
部分,如上所示。例如:
Host private2
User gateway-user
Hostname xxx.xxx.xxx.xxx
IdentitiesOnly Yes
IdentityFile ~/.ssh/id_gateway
現在您應該能夠僅使用網關上的一個公鑰來完成ssh private
此操作。ssh private2