Ssh

用兩台伺服器做一個代理

  • November 23, 2019

我想實現一個中間有兩個(A 和 B)伺服器的代理。流量從我的電腦到伺服器 B,然後到伺服器 A,然後獲取數據。我在 ~/.ssh/config 中發現了這個配置:

HOST B
   HostName B
   user debian
   DynamicForward 0.0.0.0:1081

我可以使用我的 1081 埠作為代理。但是現在我不知道如何通過 A 代理 B 的所有流量。

這是我的 ssh 版本:

OpenSSH_7.2p2 Ubuntu-4ubuntu2.8,OpenSSL 1.0.2g 2016 年 3 月 1 日

B 只是處理它到 A 的所有事情。A 必鬚根據其數據選擇在哪裡檢索數據。顯然只有 A 應該有DynamicForward隧道,B 的角色只是連接的中間主機。通常 B 應該只需要一個經典的LocalForward來向 A 提出查詢。

這可以通過不同的方式完成,但最簡單和最安全的方法利用ProxyJump功能,該功能將顯示 A 好像它是直接可訪問的,因此不再需要考慮 B 將如何與預期的埠轉發互動。可以認為 B 幾乎是不可見的。所以最後可以放入下面的配置~/.ssh/config

Host B
   User userb

Host A
   User usera
   ProxyJump B
   DynamicForward 1081

僅呼叫:

ssh A

如果沒有配置文件,等效的命令行將是:

ssh -D 1081 -J userb@B usera@A

更新:如果ssh的版本早於 7.3(因為它似乎是 OP),ProxyJump仍然可以被ProxyCommand + ssh -W替換,如下所示:

作為配置文件~/.ssh/config

Host B
   User userb

Host A
   User usera
   ProxyCommand ssh -W %h:%p B
   DynamicForward 1081

或沒有配置文件的等效命令行:

ssh -D 1081 -o 'ProxyCommand ssh -W %h:%p userb@B' usera@A

SOCKS5 API 將在客戶端上可用localhost:1081(除非放回0.0.0.0:1081(或使用GatewayPorts / -g)以使其可用於其他客戶端)。在後台,由一對管道處理,一個衍生的子ssh程序將通過主機 B 建立一個隧道,並將 A 的 ssh 伺服器呈現給初始ssh命令:整個 ssh 是隧道的,這就是為什麼沒有特定的額外埠轉發的原因配置。

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