如何在 AllowTcpForwarding 設置為 no 的情況下進行 ssh 轉發?
我需要在一些遠端盒子上做一些開發。幸運的是,我有 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
(甚至只是bash
andcat
ongateway
,見最後一個例子!)並且允許不使用 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:
使用
ControlMaster
ssh允許在只使用到網關的單個 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
命令(用於全雙工結果),甚至不需要遠端socat
或netcat
. 處理多層嵌套和轉義引號有點尷尬,也許可以做得更好,或者通過使用遠端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: