Linux

如何在 AllowTcpForwarding 設置為 no 的情況下進行 ssh 轉發?

  • February 10, 2021

我需要在一些遠端盒子上做一些開發。幸運的是,我有 shell 訪問權限,但我需要通過一個將 AllowTcpForwarding 設置為 false 的網關。

我在文件中達到了頂峰,它說:

AllowTcpForwarding 指定是否允許 TCP 轉發。預設值為“是”。請注意,除非使用者也被拒絕 shell 訪問,否則禁用 TCP 轉發不會提高安全性,因為他們總是可以安裝自己的轉發器。

我將如何安裝(或建構)我自己的轉發器?我的目標是通過 SSH使用 Pycharm設置一個遠端解釋器,並將其綁定到某個本地埠,通過 ssh 提供的數據,通過網關,然後到實際執行程式碼的開發框。我想我可以以某種方式利用 nc 或其他一些有助於完成工作的 unix 實用程序。

我知道我可以通過以下方式 SSH 到我的遠端盒子:

ssh -t user1@gateway ssh user2@devbox

但顯然這個選項在 pycharm 中不可用。我必須能夠打開一些本地埠,這樣

ssh -p 12345 localhost
(or variant)

將我連接到 user2@devbox。這將允許我將遠端解釋器配置為使用埠12345連接localhost到遠端框。

只要可以在socat本地和 on 上執行gateway(甚至只是bashand caton gateway,見最後一個例子!)並且允許使用 pty 進行 8bits clean,就可以通過 ssh 建立隧道。這裡有 4 個範例,對前面的進行了改進:

基本範例工作一次

(讓它分叉需要每個隧道一個 ssh 連接,不好)。必須轉義:for socat 才能接受 exec 命令:

術語1:

$ socat tcp-listen:12345,reuseaddr exec:'ssh user1@gateway exec socat - tcp\:devbox\:22',nofork

術語2:

$ ssh -p 12345 user2@localhost

術語1:

user1@gateway's password:

術語2:

user2@localhost's password: 

顛倒第一個和第二個地址使套接字立即可用

socat必須負責,所以沒有nofork

術語1:

   $ socat exec:'ssh user1@gateway exec socat - tcp\:devbox\:22' tcp-listen:12345,reuseaddr
   user1@gateway's password:

術語2:

   $ ssh -p 12345 user2@localhost
   user2@localhost's password:

使用ControlMasterssh

允許在只使用到網關的單個 ssh 連接時進行分叉,從而提供類似於通常埠轉發的行為:

術語1:

   $ ssh -N -o ControlMaster=yes -o ControlPath=~/mysshcontrolsocket user1@gateway
   user1@gateway's password:

術語2:

   $ socat tcp-listen:12345,reuseaddr,fork exec:'ssh -o ControlPath=~/mysshcontrolsocket user1@gateway exec socat - tcp\:devbox\:22'

第三學期:

   $ ssh -p 12345 user2@localhost
   user2@localhost's password:

只有bash並且cat可用gateway

通過使用bash的內置 tcp 重定向和兩個半雙工cat命令(用於全雙工結果),甚至不需要遠端socatnetcat. 處理多層嵌套和轉義引號有點尷尬,也許可以做得更好,或者通過使用遠端bash腳本來簡化。必須注意cat僅將 fork 用於輸出:

term1(無變化):

$ ssh -N -o ControlMaster=yes -o ControlPath=~/mysshcontrolsocket user1@gateway
user1@gateway's password:

術語2:

$ socat tcp-listen:12345,reuseaddr,fork 'exec:ssh -T -o ControlPath=~/mysshcontrolsocket user1@gateway '\''exec bash -c \'\''"exec 2>/dev/null 8<>/dev/tcp/devbox/22; cat <&8 & cat >&8"\'\'\'

第三學期:

$ ssh -p 12345 user2@localhost
user2@localhost's password:

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