OpenSSH 的客戶端有一個 ProxyCommand 的選項,用於 SSH 客戶端與伺服器之間的隧道通訊 (tunneling)。所謂的隧道技術,也稱代理技術,是網路通訊技術的一個普遍概念,就是把一條信道建立於另外一條信道之上。
SSH 會話基於一個 TCP 連接,如果我們把連接的兩個端口各自的出口(也即入口)進行截獲,就可以用其他的信道來傳輸。而且 SSH 仍然認為它用的是和另一端連接一條 TCP 連接。
ProxyCommand 指定一個命令(稱為 Proxy),SSH 客戶端將通過標準輸入輸出和這個命令啟動後的進程進行正常的 SSH 通訊,而 Proxy 連接著 SSH 伺服器(一般是一個 Server Proxy,再由該 Server Proxy 連接伺服器)。
環境說明
遠端伺服器的IP地址為0.0.0.1,代號為X;
另一個遠端伺服器的IP為0.0.0.2,代號為Y;
目前本機的IP地址為0.0.0.3,代號為A,本地可以利用SSH客戶端通過密鑰或密碼連接X和Y;
這裡全部使用密鑰的方式進行訪問,本機 A 與 Y 之間無法進行訪問。
本地的
~/.ssh/config
的配置檔案資訊如下,通過 X 連接到 Y;
Host X
HostName 0.0.0.1
User root
Port 22
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_1
Host Y
HostName 0.0.0.2
User root
Port 22
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_2
Host test
HostName 0.0.0.2
User root
Port 22
IdentityFile ~/.ssh/id_rsa_2
ProxyCommand ssh X -W %h:%p
測試本機通過 X 連接到 Y 伺服器
ssh test
附註:
-W host:port
請求將客戶端的標準輸入和輸出通過安全通道轉發到主機的端口。雖然這些可以在配置檔案或使用-o命令行選項中被覆蓋,但它暗示了-N、-T、ExitOnForwardFailure和ClearAllForwardings。
-W:該參數在OpenSSH 5.4及之後的版本才支援,參考官方的Release資訊;
在使用-W之前,通常都是使用nc選項,nc允許你轉發TCP/UDP數據包到指定(備用)位置並且基本上與ssh -W相同;
參考:
openssh