Ssh

無縫 SFTP 隧道/跳箱

  • October 14, 2020

我正在嘗試為使用者設置一種方式來連接到相同gateway server的 SSH/SFTP(SFTP 優先,SSH 很好),並讓該gateway伺服器將使用者路由到我的網路內由使用者名和私有主機標識的私有伺服器他們想達到。這必須是無縫的使用者體驗,即 - 沒有特殊的配置文件設置,沒有用於命令行會話的標誌,並且在 Filezilla 等 UI 工具中沒有特殊設置。

到目前為止,我設法做的是將此塊添加到伺服器sshd_config中的文件中gateway

Match User someuser                                                                                                                                                                                                                               
  ForceCommand sftp  -i /home/someuser/.ssh/id_rsa someuser@some_other_server

現在,當我從客戶端電腦執行此操作時,這很有效:

ssh -i id_rsa someuser@gateway_server_machine

它將觸發ForceCommand並給我一個與some_other_server機器的 SFTP 會話。

當我做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

在 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.

我需要弄清楚我在這裡做錯了什麼,或者是否有更好的方法來為我的使用者提供這種連接。

ForceCommand sftp -i /home/someuser/.ssh/id_rsa someuser@some_other_server

以上將使用其文本界面在中間伺服器上啟動 SFTP客戶端。您的本地 SFTP 客戶端(或任何其他客戶端)無法與之通信。它需要二進制SFTP協議。這也解釋了為什麼似乎作為客戶工作。但事實並非如此。它只是在中間伺服器上傳遞客戶端的文本介面。sftp``ssh``sftp``sftp


你需要的是這樣的:

ForceCommand ssh -s sftp -i /home/someuser/.ssh/id_rsa someuser@some_other_server

這使得(大多數)遠端伺服器啟動 SFTP伺服器-s sftp)和中間伺服器將二進制SFTP 協議通過管道傳輸來回(ssh只是管道遠端的二進制輸入/輸出sftp-server,與設置本地ssh管道文本輸入/的方式相同)中間體的輸出sftp)。


但是,如果您同時需要 SFTP 和 SSH,則需要對 SFTP 使用Subsystem指令,而不是ForceCommand

Subsystem sftp ssh -s sftp -i /home/someuser/.ssh/id_rsa someuser@some_other_server

或者為了避免為 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

引用自:https://unix.stackexchange.com/questions/510258