Ssh
用兩台伺服器做一個代理
我想實現一個中間有兩個(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 是隧道的,這就是為什麼沒有特定的額外埠轉發的原因配置。