Ssh

如何通過一對一的 NAT 建立 ssh 隧道

  • September 13, 2020

我需要一個從我家到私有 IP 10.4.100.6的 SSH 隧道,如下圖所示:

+-------+    +-----------------+  +------------+  +-------------+
|       |    |                 |  |            |  |             |
| Home  +----+ foo.example.com +--+ 10.4.100.5 +--+  10.4.100.6 |
|       |    |                 |  |            |  |             |
+-------+    +-----------------+  +------------+  +-------------+

我對10.4.100.510.4.100.6具有 root 訪問權限。我對foo.example.com的訪問權限為零。當我 ssh 到foo.example.com時,我不知何故登陸了10.4.100.5,這是一個不同的主機。我們正在談論 4 個獨立的主機。我假設foo.example.com使用一對一的 NAT。

我試過:

ssh -L 8080:10.4.100.6:80 user@foo.example.com

沒運氣。有小費嗎?

***編輯:***事實證明隧道有效,但不適用於 websockets。連接ws://localhost:8080失敗:

<snip> WebSocket connection to 'ws://localhost:8080/' failed: Error during WebSocket handshake: Unexpected response code: 200

起初我沒有意識到這一點。我以為連接掛了。

***編輯2:***我很抱歉,但我想通了。我沒有意識到該應用程序涉及 2 個伺服器:埠 80 上的 nginx 和埠 8080 上的 websocket 伺服器。我創建了 2 個單獨的 SSH 隧道,現在一切正常。我很困惑,因為我選擇的本地埠 8080 也是遠端 websocket 伺服器使用的埠。

總結:通過一對一的 NAT 創建 SSH 隧道沒有什麼特別的要求。

前提是10.4.100.5可以訪問,10.4.100.6:80我不明白為什麼您的ssh -L 8080:10.4.100.6:80 user@foo.example.com行不通。

你可以遠端登錄/捲曲10.4.100.6:8010.4.100.5?如果不是,則可能是防火牆配置為10.4.100.6禁止訪問埠 80,方法是斷開連接而不拒絕它。

您可以使用 OpenSSH 中的ProxyJump功能來乾淨地完成此操作。

ssh -J user@foo.example.com -L 8080:localhost:80 user@10.4.100.6

添加-J user@foo.example.com告訴 ssh 通過 foo.example.com 上動態設置的埠轉發連接到目標。如果您沒有設置 ssh 密鑰,系統將提示您輸入 foo.example.com 和 10.4.100.6 的密碼。

如果這對您有用,您可以將其添加到本地~/.ssh/ssh_config以使其更容易。例如,

Host 10.4.100.6
   ProxyJump user@foo.example.com

然後,您無需-J在命令行上指定連接到 10.4.100.6。

引用自:https://serverfault.com/questions/1033692