我想使用中间服务器(堡垒、跳转、网关)通过 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...
.bashrc
然后在您的客户端上,向您的文件(或您使用的任何 shell)添加一个如下所示的函数:
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
仅使用网关上的一个公钥。