通過代理機器攔截 SSH 連接並將其轉發到另一台(遠端)機器
我想設計一個代理,它的 IP 地址是公開的。客戶端知道該代理的 IP 地址並且可以通過 SSH 連接到它。但是,有一個主機的 IP 地址對客戶端來說是未知的。代理的目的是“攔截”來自客戶端的 SSH 並將其重定向到該私有主機。下圖展示了這個問題:
伺服器 B 是我要設計的代理。客戶端 C 不知道伺服器 A 的 IP 地址。客戶端 C 可以 SSH 伺服器 B(代理)。然後代理(伺服器 B)應該將 SSH 連接轉發到伺服器 A。基於這個答案,我嘗試了以下操作:
- 在伺服器 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 從
clientC
toserverB
和 fromserverB
toserverA
嗎?如果是這樣,有一個更簡單的解決方案。上clientC
,執行:ssh -J userB@serverB userA@serverA
這將首先 ssh to
userB@serverB
,自動設置埠轉發到 ssh onserverA
,並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
和之間的這種類型的埠轉發適用於快速
B
和A
骯髒的事情。如果您想要更適合生產的東西,請考慮使用 HAProxy、nginx 或 iptables/nftables 之類的東西來處理 TCP 轉發,而不是使用 SSH 轉發。