Ssh

通過代理機器攔截 SSH 連接並將其轉發到另一台(遠端)機器

  • October 15, 2020

我想設計一個代理,它的 IP 地址是公開的。客戶端知道該代理的 IP 地址並且可以通過 SSH 連接到它。但是,有一個主機的 IP 地址對客戶端來說是未知的。代理的目的是“攔截”來自客戶端的 SSH 並將其重定向到該私有主機。下圖展示了這個問題:

在此處輸入圖像描述

伺服器 B 是我要設計的代理。客戶端 C 不知道伺服器 A 的 IP 地址。客戶端 C 可以 SSH 伺服器 B(代理)。然後代理(伺服器 B)應該將 SSH 連接轉發到伺服器 A。基於這個答案,我嘗試了以下操作:

  1. 在伺服器 A 中,我執行以下命令:

ssh userB@serverB -R clientC:1234:serverA:22 2. 從客戶端 C,我執行以下命令:

ssh userA@serverB -p 1234

但是客戶端 C 無法與伺服器 A 建立連接,我收到以下消息:

ssh: connect to host server B (192.168.2.122) port 1234: Operation timed out

你能告訴我如何使代理(伺服器B)工作嗎?


解決了:

我的方法是正確的,我只需要sshd_config在伺服器 A 和伺服器 B(代理)中重新配置:

AllowAgentForwarding yes
AllowTcpForwarding yes
GatewayPorts yes
X11Forwarding yes

詳細資訊可以在這裡找到。

我的方法是正確的,我只需要sshd_config在伺服器 A 和伺服器 B(代理)中重新配置:

AllowAgentForwarding yes
AllowTcpForwarding yes
GatewayPorts yes
X11Forwarding yes

詳細資訊可以在這裡找到SSH 埠轉發

你能 ssh 從clientCtoserverB和 from serverBtoserverA嗎?如果是這樣,有一個更簡單的解決方案。上clientC,執行:

ssh -J userB@serverB userA@serverA

這將首先 ssh to userB@serverB,自動設置埠轉發到 ssh on serverA,並userA@serverA通過該轉發埠連接到。

如果這不可行,您可以使用您的方法進行一些修改,假設沒有防火牆或其他網路限制阻礙。

您需要調整從以下位置執行的反向轉發命令serverA

ssh userB@serverB -R "*:1234:localhost:22"

這裡*設置了bind_address,也就是反向轉發監聽的地址。從 ssh 手冊頁:

預設情況下,伺服器上的 TCP 偵聽套接字將僅綁定到環回介面。這可以通過指定一個 bind_address 來覆蓋。空的 bind_address 或地址“*”表示遠端套接字應偵聽所有介面。只有啟用了伺服器的 GatewayPorts 選項(請參閱 sshd_config(5)),指定遠端 bind_address 才會成功。

因此,設置bind_address可以讓您偵聽所有介面上的連接。(在您的版本中,您將其設置為clientC,這將不起作用,因為clientC的 IP 地址不引用serverB.

您還需要設置GatewayPorts clientspecified. /etc/ssh/sshd_config這提供ssh -R了綁定到非環回介面的權限。

然後你應該能夠從 ssh clientC

ssh userA@serverB -p 1234

和之間的這種類型的埠轉發適用於快速BA骯髒的事情。如果您想要更適合生產的東西,請考慮​​使用 HAProxy、nginx 或 iptables/nftables 之類的東西來處理 TCP 轉發,而不是使用 SSH 轉發。

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