我的网络布局是这样的:
现在 Alice 可以使用以下命令访问 SSH 网关(从现在开始只是网关):
ssh [email protected]
网关上的授权密钥文件如下所示
#/home/Alice/.ssh/authorized_keys
command="ssh -t alice@web" ssh-rsa ABCD...E== alice@somehost
因此,当 Alice 尝试使用她的私钥连接到网关时,她实际上连接到了 Web 服务器(网关 PC 可以使用无密码的私钥连接到 Web 服务器,因此保持透明)。
问题
我该如何设置以便 Alice 也能将内容 scp 到 Web 服务器?
我知道这会建立一个单独的连接,但是有没有办法让它像普通的 ssh 一样工作,以便即使像那样的东西也
-R12345:localhost:22
可以工作?
答案1
如果你想访问另一个 ssh 服务器后面的 ssh 服务器,只需使用“ProxyCommand”。示例:添加到 .ssh/config
Host Alice
User myLoginAtAlice # optional
ProxyCommand ssh -o Compression=no gateway netcat -w 90 %h %p
ServerAliveInterval 30
Compression yes
Host gateway
HostName gateway.public.ip
User myLoginAtTheGateway # optional
Compression yes
然后,您可以直接使用“Alice”作为主机名“ssh Alice”或“rsync”或“scp”。客户端看不到其中的奥秘。
这样,当您的网络拓扑/配置发生变化时,您就可以快速重新配置 ssh,只需更改 .ssh/config,而不必更改每个脚本。
解释:ssh 使用作为“代理命令”给出的命令作为传输,而不是直接 TCP 连接。Netcat 是一种网络工具,它(在数百万个其他功能中)只是将其 stdin/stdout 重定向到指定的远程主机。因此,“ssh gateway nc sshserver 22”将您连接到该机器的 ssh 服务器。%h 是主机名,%p 是端口。这样的设置允许您指定“端口 N”来更改端口,而无需更改 ProxyCommand 行。
我激活了最终计算机的压缩功能并禁用了外部压缩,因为压缩加密或压缩数据不会进一步减少数据量。当然,对压缩设置的任何调整也是可选的。
答案2
我遇到了与此完全相同的问题,但我无需彻底改变一切就能让它发挥作用。
我所做的就是将 $SSH_ORIGINAL_COMMAND 添加到网关 authorized_keys 以将任何内容沿着链传递到最终服务器。
所以这:
#/home/Alice/.ssh/authorized_keys
command="ssh -t alice@web" ssh-rsa ABCD...E== alice@somehost
变成:
#/home/Alice/.ssh/authorized_keys
command="ssh -q -t alice@web $SSH_ORIGINAL_COMMAND" ssh-rsa ABCD...E== alice@somehost
-q 用于抑制来自端点机器的连接关闭消息,因此如果本地使用重定向,它就不会出现在本地输出中。
然后您可以像这样使用 scp:
scp localFileName [email protected]:/path/on/end/point/remoteFileName
这具有额外的好处,即让用户通过命令将命令传递到终端服务器并在本地会话中获取结果,以便他们可以将其重定向到文件中或通过管道将其传输到不同的程序。
例如:
ssh -t [email protected] "ls -l" > tmp
这是有效的,因为看起来 sshd 使用 ssh 客户端指定的命令填充了环境变量 $SSH_ORIGINAL_COMMAND,但我不确定为什么这会奇迹般地允许 scp 以及命令传递到端点机器。
答案3
不幸的是,端口转发无法帮助将文件直接从 Alice 的工作站复制到 Web 服务器scp
。在这篇文章我解释了为什么 ssh(以及使用相同身份验证机制的 scp)不适用于使用 ssh 进行端口转发的连接。
该选项是在现在充当 SSH 网关的机器上设置 VPN 服务器,连接到它,然后您就可以直接访问防火墙后面的任何机器。