网关服务器跳转堡垒主机本地设置

网关服务器跳转堡垒主机本地设置

我想使用中间服务器(堡垒、跳转、网关)通过 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直接进入。这甚至适用于scpsftp

额外积分

如果您希望将其用于多台服务器,但只想在网关上管理一个公钥,则可以使用以下技巧。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仅使用网关上的一个公钥。

相关内容