我正在尝试创建一个 ssh 隧道来访问只能通过另一台服务器 (B) 访问的远程服务器 (A)。我在本地计算机 (L) 上有一个密钥,用于访问中继服务器 (B),在中继服务器 (B) 上还有一个密钥,用于访问目标服务器 (A)。
[本地机器(L)带着密钥发送到中继服务器(B)] --> [中继服务器(B)带着密钥发送到目标服务器(A)] --> [目标服务器(A)]
我有一个 ~/.ssh/config 文件,在我的本地机器(L)上看起来像这样:
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
我可以通过以下方式让隧道顺利运行:
在我的本地机器 (L) 上运行命令:ssh -N -L 1122:SERVER_PRIVATE_IP:22 relay.server(B)
。这会提示我输入密码以解锁第一个密钥,然后似乎挂起了它,没有返回提示,使用选项-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 config 中的选项会在使用ProxyCommand
该命令时运行命令。它通常与nmap.org 提供的一起使用,也称为 ,并且有很多选项。Host
nc
ncat
在上面的Host destination
ssh 配置条目中,ProxyCommand
设置为ssh -q relay "nc %h %p"
,表示 ssh 静默中继并运行nc destination.server.fqdn.or.IP 22
。
nc
建立传入 ssh 与目标之间的连接。
告诉ForwardAgent yes
ssh 将密钥添加到 ssh 代理。ssh 代理会跟踪密钥,并根据需要自动将正确的密钥传递给主机。 告诉ForwardAgent yes
代理将密钥传递给中继上的另一个代理,然后再传递给目的地。
现在,为了让这一切正常运作,您经过的每个服务器以及最终目的地都必须在其文件中拥有与您的私钥 (id_rsa) 关联的公钥.ssh/authorized_keys
。当您创建私钥 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