Ssh-Tunneling

是否可以有一個用於 ssh 隧道的共享埠,該埠根據客戶端隔離會話?

  • November 13, 2018

是否可以有一個用於 ssh 隧道的共享埠,該埠根據客戶端隔離會話?例如,如果我讓 client1 使用到共享伺服器上埠 9999 的隧道來連接到另一台伺服器的 ssh 隧道,如下所示:

Client1 埠 8888 —> 共享主機埠 9999 —> server1 埠 4477

有沒有辦法讓另一個客戶端也可以使用共享伺服器上的埠 9999 來隧道到不同的終端主機,如下所示?

Client2埠8888—>共享主機埠9999—>server2埠5568

關鍵點是轉發到共享主機埠的客戶端本地埠將始終是相同的埠。從共享主機,隧道可以擴展到所需的端點,但隧道仍將通過共享主機上的同一埠。

我已經嘗試了很多方法,但要麼最終導致客戶端 2 會話通過該埠被拒絕,要麼來自客戶端 1 的流量被饋送到客戶端 2。

我意識到這不是一個理想的設置,但不幸的是,這是我必須使用的。

–編輯–添加範例:

有 2 個 Web 伺服器只能通過共享主機訪問。在這個例子中,他們只會回复“server1 response”或“server2 response”。身份驗證由 rsa 密鑰處理,user1 和 user2 使用完全獨立的硬體。

user1 首先連接:

user1@localbox1$ ssh -t -L 8888:localhost:9999 user1@sharedhost.com "ssh -L 9999:localhost:80 user1@192.168.1.10"
user1@192.168.1.10 $ 

隧道按預期工作:

user1@localbox1$ curl "http://localhost:8888"
server1 repsonse
user1@localbox1$

當使用者 2 嘗試連接時,他們會收到一條錯誤消息,並使用來自使用者 1 的隧道:

user2@localbox2$ ssh -t -L 8888:localhost:9999 user2@sharedhost.com "ssh -L 9999:localhost:80 user2@192.168.1.11"
bind: Address already in use
channel_setup_fwd_listener_tcpip: cannot listen to port: 9999
Could not request local forwarding.
user2@192.168.1.11 $ 

然後將 User1 的會話轉發到 user2 的隧道。

user2@localbox2$ curl "http://localhost:8888"
server1 response
user2@localbox2$

如果隧道已創建,則響應將是server2 response而不是server1 response.

需要注意的是,不幸的是,第二條隧道的遠端命令是必需的,因為終端主機地址可能會更改,並且無法從使用者端確定值。為簡單起見,我只使用了一些實際的終端主機地址。

是的,這是可能的,假設 client1 和 client2 是不同的電腦,而不是同一台電腦上的不同使用者。

你認為它不起作用是有原因的嗎?你有沒有嘗試過,有些東西不起作用?

編輯

在您的範例中, client1 和 client2 在同一台電腦上localbox,所以這當然行不通。

最簡單的解決方案是使用兩個不同的埠。有什麼特別的理由不使用不同的埠嗎?

另一種解決方案是使用不同的源地址:

ssh -t -L 127.0.0.2:8888:localhost:9999 user1@sharedhost.com

ssh -t -L 127.0.0.3:8888:localhost:9999 user2@sharedhost.com

您現在可以連接到127.0.0.2:8888127.0.0.3:8888的目標。

您可以使用命名空間、容器、虛擬機,但這會更複雜,並且取決於您的需求。

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