无缝 SFTP 隧道/跳线盒

Ita*_*lek 5 ssh sftp ssh-tunneling

我正在尝试为用户建立一种连接到gateway serverSSH/SFTP 的方法(SFTP 优先,SSH 很好),并让该gateway服务器将用户路由到我的网络内由用户名和私有主机标识的私有服务器他们想要达到。这必须是无缝的用户体验,即 - 没有特殊的配置文件设置,没有命令行会话的标志,并且在 Filezilla 等 UI 工具中没有特殊的设置。

到目前为止我所做的就是将此块添加到服务器sshd_config中的文件中gateway

Match User someuser                                                                                                                                                                                                                               
   ForceCommand sftp  -i /home/someuser/.ssh/id_rsa someuser@some_other_server
Run Code Online (Sandbox Code Playgroud)

现在,当我从客户端计算机上执行此操作时,效果非常好:

ssh -i id_rsa someuser@gateway_server_machine

它将触发ForceCommand并给我一个到机器的 SFTP 会话some_other_server

当我做sftp -i id_rsa someuser@gateway_server_machine

连接挂起并最终终止。

所以,即使有详细信息,sftp 也不会提供任何信息 - 只是挂在那里 - 但这是我从服务器端得到的:

debug1: subsystem: internal-sftp
Starting session: forced-command (config) 'sftp  -i /home/someuser/.ssh/id_rsa someuser@some_other_server ' for someuser from 10.16.2.149 port 58822 id 0
Run Code Online (Sandbox Code Playgroud)

在 SSH 上我得到:

Starting session: forced-command (config) 'sftp  -i /home/someuser/.ssh/id_rsa someuser@some_other_server ' on pts/1 for someuser from 10.16.2.149 port 33550 id 0
debug1: Setting controlling tty using TIOCSCTTY.
Run Code Online (Sandbox Code Playgroud)

我需要弄清楚我在这里做错了什么,或者是否有更好的方法来为我的用户提供这种连接。

Mar*_*ryl 3

ForceCommand sftp -i /home/someuser/.ssh/id_rsa someuser@some_other_server
Run Code Online (Sandbox Code Playgroud)

以上将使用其文本界面在中间服务器上启动 SFTP客户端。您的本地 SFTP 客户端(或任何其他客户端)无法与之通信。它需要二进制SFTP协议。这也解释了为什么似乎是作为客户工作。但事实并非如此。它只是通过管道将客户端的文本接口传输到中间服务器上。sftpsshsftpsftp


你需要的是这样的:

ForceCommand ssh -s sftp -i /home/someuser/.ssh/id_rsa someuser@some_other_server
Run Code Online (Sandbox Code Playgroud)

这使得(最)远程服务器启动 SFTP服务器( -s sftp) 和中间服务器来通过管道传输二进制SFTP 协议(ssh​​仅通过管道传输远程的二进制输入/输出sftp-server,与您设置本地ssh管道文本输入的方式相同)中间输出sftp)。


但如果您同时需要 SFTP 和 SSH,则需要使用SFTPSubsystem指令ForceCommand,而不是:

Subsystem sftp ssh -s sftp -i /home/someuser/.ssh/id_rsa someuser@some_other_server
Run Code Online (Sandbox Code Playgroud)

或者,为了避免必须分别为 SSH 和 SFTP 重复隧道,您可以使用SSH_ORIGINAL_COMMAND环境变量来决定是否使用-s sftp

如果您实际上知道(最)远程 SFTP 服务器也有 OpenSSH 并且与sftp-server中间服务器具有相同的二进制路径,那么这应该涵盖 SSH 和 SFTP:

ForceCommand ssh -i /home/someuser/.ssh/id_rsa someuser@some_other_server $SSH_ORIGINAL_COMMAND
Run Code Online (Sandbox Code Playgroud)