透過 ssh 隧道連結位於 NAT 後方的機器

透過 ssh 隧道連結位於 NAT 後方的機器

我有兩台機器。兩者都位於 NAT 後方。我也可以從每台機器存取伺服器。有沒有辦法透過 SERVER 從 machine1 到 machine2 建立 ssh 隧道?

客戶端機器是linux mint。伺服器是 debian。我在所有機器上只有使用者存取權限

答案1

我可以看到它是如何做到的..

所以你有 3 台電腦。甲、乙、丙

A、B 位於 NAT 後方。假設B是中介

方法一

2 條隧道

因此,您可以建立從 A 到 B 的 SSH 連線(隧道 1)。從C到B(2號隧道)。然後從隧道 1 轉送到隧道 2。

電腦 A 透過 SSH -L 連接

電腦 C 透過 SSH -R 連接

-L 或 -R 決定隧道的哪一側偵聽以及隧道的哪一側轉送。

所以,除非我犯了錯誤,否則你可以做類似的事情-

A$ ssh -L 1234:127.0.0.1:2345 user@compB
C$ ssh -R 2345:127.0.0.1:3456 user@compB

但我不確定是否可以與同一個 SSH 伺服器建立兩個連接,所以嘗試這個.. 建立兩個不同的 sshd 伺服器..

編輯 CompB 上的 sshd_config,您會看到它顯示“連接埠 22”,在其下方新增一行以顯示“連接埠 222”,然後 CompB 將在兩個連接埠上執行 ssh 伺服器。

然後你可以透過兩個不同的連接埠 22 和 222 連接到 ssh 伺服器

A$ ssh -L 1234:127.0.0.1:2345 user@compB -p22
C$ ssh -R 2345:127.0.0.1:3456 user@compB -p222

連接埠 1234 是電腦 A 上連接客戶端程式的連接埠。

端口 2345 是計算機 B 上的端口,也是隧道 2 的入口

連接埠3456是您在CompC上執行伺服器程式的端口

這樣,CompA就可以透過CompB連接到CompC上的伺服器

方法2

一條隧道

一種選擇是只使用一個隧道,但這樣您只能在一半的路線上獲得加密。 5.6.7.8是CompC的IP,連接埠3456是CompC上的伺服器,連接埠1234是隧道的監聽埠。

A$ ssh -L 1234:5.6.7.8:3456 user@compB

然後在CompA上將客戶端程式連接到CompA上的1234端口,它就會全部轉到CompC上。

答案2

根據回覆巴洛普

我在 NAT 後面有 A 和 B。從 A 和 B 訪問 C

在 CI 上必須只有 ssh 存取權限。不需要其他任何東西。

在機器A上新增任務到crontab

$crontab -e

TUNCMDR='ssh -f -N -R 1144:localhost:22 Cuser@hostC'
* * * * * pgrep -f "$TUNCMDR" || ($TUNCMDR  &&  echo "`date`: Land remote port to localhost:22" >> ~/ssh-world.log)  &>/dev/null
TUNCMDL='ssh -f -N -L 1234:localhost:1143 Cuser@hostC'
* * * * * pgrep -f "$TUNCMDL" || ($TUNCMDL  &&  echo "`date`: Forward local 1234 port to remote" >> ~/ssh-world.log)  &>/dev/null

在機器 B 上將任務新增至 crontab

$crontab -e

TUNCMDR='ssh -f -N -R 1143:localhost:22 Cuser@hostC'
* * * * * pgrep -f "$TUNCMDR" || ($TUNCMDR  &&  echo "`date`: Land remote port to localhost:22" >> ~/ssh-world.log)  &>/dev/null
TUNCMDL='ssh -f -N -L 1234:localhost:1144 Cuser@hostC'
* * * * * pgrep -f "$TUNCMDL" || ($TUNCMDL  &&  echo "`date`: Forward local 1234 port to remote" >> ~/ssh-world.log)  &>/dev/null

注意:與主機 A 相比,主機 B 上的 1143 和 1144 連接埠發生了變化

在主機上A連接到B您運行ssh -p 1234 Buser@localhost
在主機上B連接到A您運行ssh -p 1234 Auser@localhost
在主機上C連接到A您運行ssh -p 1144 Auser@localhost
在主機上C連接到B您運行ssh -p 1143 Buser@localhost

可以看到正在運行的重連訊息cat ~/ssh-world.log

UPD

透過加入 ~/.ssh/config 來停止會話斷開/掛斷

Host *
    ServerAliveInterval 15

相關內容