1. 程式人生 > >利用SSH隧道技術穿越內網訪問遠端裝置

利用SSH隧道技術穿越內網訪問遠端裝置

本文為作者原創,轉載請註明出處:https://www.cnblogs.com/leisure_chn/p/11899478.html

通常,我們用於除錯的計算機無法遠端訪問位於區域網中的待除錯裝置。通過 ssh 的埠轉發(又稱 ssh 隧道)技術,可以實現這種遠端除錯功能。

下文中,sshc 指 ssh 客戶端,sshd 指 ssh 伺服器。

1. ssh 埠轉發模式簡介

ssh 客戶端運行於本地機器,它的作用是:登入到目標機器並在目標機器上執行命令。它可以建立一個安全通道,為不安全網路上兩個不受信任的主機提供安全的加密通訊。X11 連線、任意 TCP 埠和 UNIX 域套接字也可以通過 ssh 安全通道進行轉發。

ssh 連線並登入到指定的主機名(使用者名稱可選)。如果指定了命令,命令將在遠端主機上執行,而不是在本機 shell 裡執行。

1.1 ssh 常用選項簡介

ssh 埠轉發相關的常用選項如下:

-C

請求壓縮所有資料(包括 stdin、stdout、stderr 和用於轉發的 X11、TCP 和 UNIX 域連線的資料)。壓縮演算法與 gzip 使用的演算法相同,壓縮級別由 ssh 協議版本 1 的 CompressionLevel 選項控制。在調變解調器線路和其他慢速連線上採用壓縮是可取的,但它會減慢快速網路上的速度。


-f

請求 ssh 在執行命令之前轉到後臺。如果使用者希望 ssh 在後臺執行,但 ssh 需要使用者提供密碼或口令,使用 -f 選項就很有用,在使用者輸入密碼之後,ssh 就會轉入後臺執行。這個選項隱含了 -n 選項的功能(-n 選項將 stdin 重定向到 /dev/null,從而避免後臺程序讀 stdin)。在遠端站點上啟動 X11 程式的推薦方法是使用 "ssh -f host xterm" 。

如果 ExitOnForwardFailure 配置選項設定的是 "yes",則使用 -f 選項啟動的 ssh 客戶端會等所有的遠端埠轉發建立成功後才將自己轉到後臺執行。


-n

將 stdin 重定向到 /dev/null (實際上是為了防止後臺程序從stdin讀取資料)。當 ssh 在後臺執行時必須使用此選項。

一個常見的技巧是使用它在目標機器上執行 X11 程式。例如,ssh -n shadow.cs.hut.fi emacs & 將在 shadows.cs.hut.fi 上啟動 emacs 程式。X11 的連線將通過加密通道自動轉發。ssh 程式將在後臺執行。(如果 ssh 需要請求密碼或口令,則此操作無效;參見-f選項。)


-N

不執行遠端命令。此選項用於只需要埠轉發功能時。


-g

允許遠端主機連線到本地轉發埠。如果用於多路複用連線,則必須在主程序上指定此選項。


-t

強制分配一個偽終端。在目標機上執行任意的基於螢幕的程式時(例如,實現選單服務),分配偽終端很有用。使用多個 -t 選項則會強制分配終端,即使 ssh 沒有本地終端。


-T

禁止分配偽終端。


-L [bind_address:]port:host:hostport
-L [bind_address:]port:remote_socket
-L local_socket:host:hostport
-L local_socket:remote_socket

資料從本機轉發到遠端。本機上指定 TCP 埠或 UNIX 套接字的連線將被轉發到目標機上指定埠或套接字。

上述引數中,bind_address 指本地地址;port 指本地埠;local_socket 指本地 UNIX 套接字;host 指遠端主機地址;hostport 指遠端埠;remote_socket 指遠端 UNIX 套接字。

本地(ssh 客戶端)與遠端(ssh 服務端)建立一條連線,此連線的形式有四種:

本地 [bind_address:]port    <====>   遠端 host:hostport  
本地 [bind_address:]port    <====>   遠端 remote_socket  
本地 local_socket           <====>   遠端 host:hostport  
本地 local_socket           <====>   遠端 remote_socket  

位於本機的 ssh 客戶端會分配一個套接字來監聽本地 TCP 埠(port),此套接字可繫結本機地址(bind_address, 可選,本機不同網絡卡具有不同的 IP 地址)或本地 UNIX 套接字(local_socket)。每當一個連線建立於本地埠或本地套接字時,此連線就會通過安全通道進行轉發。

也可在配置檔案中設定埠轉發功能。只有超級使用者可以轉發特權埠。

預設情況下,本地埠是根據 GatewayPorts 設定選項繫結的。但是,使用顯式的bind_address 可將連線繫結到指定地址。bind_address 值是 “localhost”時,表示僅監聽本機內部資料[TODO: 待驗證],值為空或“*”時,表示監聽本機所有網絡卡的監聽埠。

注意:localhost 是個域名,不是地址,它可以被配置為任意的 IP 地址,不過通常情況下都指向 127.0.0.1(ipv4)和 ::1。127.0.0.1 這個地址通常分配給 loopback 介面。loopback 是一個特殊的網路介面(可理解成虛擬網絡卡),用於本機中各個應用之間的網路互動。

GatewayPorts 說明 (查閱 man sshd_config):指定是否允許遠端主機(ssh客戶端)連線到本機(ssh服務端)轉發埠。預設情況下,sshd(8)將遠端埠轉發繫結到環回地址,這將阻止其他遠端主機連線到本機轉發埠。GatewayPorts 也可設定為將將遠端埠轉發繫結到非環回地址,從而允許其他遠端主機連線到本機。GatewayPorts 值“no”,表示強制遠端埠轉發僅對本機可用;值“yes”,表示強制遠端埠轉發繫結到萬用字元地址;值“clientspecified”,表示允許客戶端選擇轉發繫結到的地址。預設是“no”。


-R [bind_address:]port:host:hostport
-R [bind_address:]port:local_socket
-R remote_socket:host:hostport
-R remote_socket:local_socket

此選項在本地機上執行,目標機上指定 TCP 埠或 UNIX 套接字的連線將被轉發到本機上指定埠或套接字。

上述引數中,bind_address 指遠端地址;port 指遠端埠;remote_socket 指遠端 UNIX 套接字;host 指本地地址;hostport 指本地埠;local_socket 指本地 UNIX 套接字。

工作原理:位於遠端的 ssh 服務端會分配一個套接字來監聽 TCP 埠或 UNIX 套接字。當目標機(服務端)上有新的連線建立時,此連線會通過安全通道進行轉發,本地機執行當前命令的程序收到此轉發的連線後,會在本機內部新建一條 ssh 連線,連線到當前選項中指定的埠或套接字。參 2.3 節分析。

也可在配置檔案中設定埠轉發功能。只有超級使用者可以轉發特權埠。

預設情況下,目標機(服務端)上的 TCP 監聽套接字只繫結迴環介面。也可將目標機上的監聽套接字繫結指定的 bind_address 地址。bind_address 值為空或 “*” 時,表示目標機上的監聽套接字會監聽目標機上的所有網路介面。僅當目標機上 GatewayPorts 設定選項使能時,通過此選項為目標機指定 bind_address 才能繫結成功(參考 sshd_config(5))。

如果 port 引數是 ‘0’,目標機(服務端)可在執行時動態分配監聽埠並通知本地機(客戶端),如果同時指定了 “-O forward” 選項,則動態分配的監聽埠會被列印在標準輸出上。


-D [bind_address:]port

指定本地“動態”應用程式級埠轉發。它的工作方式是分配一個套接字來監聽本地埠(可選繫結指定的 bind_address)。每當連線到此埠時,連線都通過安全通道進行轉發,然後使用應用程式協議確定將遠端計算機連線到何處。目前支援 SOCKS4 和 SOCKS5 協議,ssh 將充當 SOCKS 伺服器。只有 root 使用者可以轉發特權埠。還可以在配置檔案中指定動態埠轉發。

IPv6 地址可以通過將地址括在方括號中來指定。只有超級使用者可以轉發特權埠。預設情況下,本地埠是根據 GatewayPorts 設定選項進行繫結的。但是,可以使用顯式的 bind_address 將連線繫結到特定的地址。bind_address 值為 “localhost” 時表示監聽埠僅繫結為本地使用,而空地址或 “*” 表示監聽所有網路介面的此埠。


1.2 ssh 埠轉發模式

ssh 的埠轉發有三種模式:

  • 本地:ssh -C -f -N -g -L local_listen_port:remote_host:remote_port agent_user@agent_host

    將本地機監聽埠 local_listen_port 上的資料轉發到遠端埠 remote_host:remote_port

  • 遠端:ssh -C -f -N -g -R agent_listen_port:local_host:local_port agent_user@agent_host

    將代理機監聽埠 agent_listen_port 上的資料轉發到本地埠 local_host:local_port

  • 動態:ssh -C -f -N -g -D listen_port agent_user@agent_host

2. 利用 ssh 隧道建立遠端除錯環境

組網環境下裝置角色如下:

代理機:把一個具有公網 IP 的中間伺服器用作 ssh 代理,將這臺代理機稱作代理 A(Agent)。

目標機:把待除錯的目標機器稱作目標機 T(Target)。目標機通常是待除錯的裝置,處於區域網內,外網無法直接訪問內網中的裝置。

本地機:把除錯用的本地計算機稱作本地機 L(Local)。本地機通常也位於區域網內。

L 和 T 無法互相訪問,但 L 和 T 都能訪問 A。我們將 T 通過 ssh 連線到A,將 L 也通過 ssh 連線到A,A 用於轉發資料,這樣就能使用本地計算機 L 來訪問遠端裝置 R。

2.1 目標機 T (sshc)

2.1.1 shell 中 T 連線 A

目標機 T 上的 sshc 連線代理機 A 上的 sshd:

ssh -T -f -N -g -R :10022:127.0.0.1:22 [email protected]

這條命令的作用:
1. 建立一條 ssh 連線,T 上的 ssh 客戶端連線到 A 上的 ssh 伺服器,A 的 IP 是 120.198.45.126,埠號是 10022,賬號是10022;
2. 如果有其他 ssh 客戶端連線到了 A 的 10022 埠上,則 A 會將這條連線轉發到 T,T 在內部建立新的連線,連線到本機 22 埠。

這條命令在 T 上執行。在 T 連線 A 這條命令裡,T 是本地主機(local),A 是遠端主機(remote)。

解釋一下此命令各選項:

  • -T 不分配偽終端;
  • -f 使 ssh 程序在使用者輸入密碼之後轉入後臺執行;
  • -N 不執行遠端指令,即遠端主機(代理機A)不需執行指令,只作埠轉發;
  • -g 允許遠端主機(代理機A)連線到本地轉發埠;
  • -R 將遠端主機(代理機A)指定埠上的連線轉發到本機埠;
  • [email protected]
    表示使用遠端主機 120.198.45.126 上的使用者 frank 來連線遠端主機;
  • :10022:127.0.0.1:22
    表示本機迴環介面(127.0.0.1,也可使用本機其他網路介面的地址,比如乙太網 IP 或 WiFi IP)的 22 埠連線到遠端主機的 10022 介面,因遠端主機 10022 繫結的地址為空,所以遠端主機會監聽其所有網路介面的 10022 埠。

在目標機 shell 中檢視連線是否建立:

root@localhost:~# ps | grep ssh
22850 root      2492 S    ssh -T -f -N -g -R :10022:127.0.0.1:22 [email protected]
22894 root      3500 S    grep ssh

在目標機 shell 中關閉 ssh 連線:

kill -9 $(pidof ssh)

此時在目標機 T 和代理機 A 中檢視 ssh 連線資訊,兩端都可以看到 ssh 連線不存在了。

2.1.2 C 程式碼中 T 連線 A 的處理

C 程式碼中主要還是呼叫 2.1.1 節中的命令。但是由 C 程式碼編譯生成的程序無法在命令列和使用者進行互動,因此要避免互動問題。

1. 避免首次連線時的 y/n(或yes/no) 詢問

如果是首次登入代理機 A,本機(目標機 T)沒有 A 的資訊,需用使用者手動輸入 y 之後才能繼續。列印如下:

root@localhost:~# ssh -T -f -N -g -R :10022:127.0.0.1:22 [email protected]

Host '120.198.45.126' is not in the trusted hosts file.
(ssh-rsa fingerprint md5 86:09:0c:1b:fd:0b:02:8c:29:62:7f:ff:70:1b:64:f5)
Do you want to continue connecting? (y/n) 

如果 T 上有 A 的資訊,可通過執行刪除操作:rm ~/.ssh/known_hosts 再進行上述測試。

如果是在 C 程式碼中執行登入命令,程序在後臺自動執行,是無法和使用者進行互動的。為了避免互動動作,應該禁止 ssh 發出 y/n 的詢問。

如果 ssh 客戶端是 dropbear ssh,則新增 -y 引數,如下:

ssh -y -T -f -N -g -R :10022:127.0.0.1:22 [email protected]

如果 ssh 客戶端是 openssh,則新增 -o StrictHostKeyChecking=no 選項,如下:

ssh -o "StrictHostKeyChecking no" -y -T -f -N -g -R :10022:127.0.0.1:22 [email protected]

2. 避免輸入登入密碼

避免由使用者手動輸入登入密碼有如下方法:

1) 用 ssh-copy-id 把本地主機的公鑰複製到遠端主機的authorized_keys檔案上,登入不需要輸入密碼。
2) 用 expect 呼叫 shell 指令碼,向 shell 指令碼傳送密碼。這種方式是模擬鍵盤輸入。
3) 如果是 openssh,則用 sshpass 向 ssh 命令列傳遞密碼。如果是 dropbear,則通過 DROPBEAR_PASSWORD 環境變數向 ssh 命令列傳遞密碼。

我們採用第 3 種方法。

假如代理機 A 上使用者 frank 密碼是 123456,則最終 C 程式碼裡應執行的指令如下:

# openssh
sshpass -p '123456' ssh -y -T -f -N -g -R :10022:127.0.0.1:22 [email protected]

# dropbear
DROPBEAR_PASSWORD='123456' ssh -y -T -f -N -g -R :10022:127.0.0.1:22 [email protected]

dropbear 無法接收 DROPBEAR_PASSWORD 變數傳遞密碼的處理方法:

dropbear 包含 ssh 客戶端和 ssh 伺服器,體積小巧,常用於嵌入式裝置。dropbear ssh 無法接收 sshpass 傳入的密碼資訊。但 dropbear ssh 可以通過環境變數 DROPBEAR_PASSWORD 傳入密碼資訊。openwrt 從某一版開始,通過打補丁的方式禁用了 DROPBEAR_PASSWORD 選項,我們可以找到對應的補丁,開啟 DROPBEAR_PASSWORD 選項,再重新編譯生成 dropbear。如下:

修改 dropbear patch 檔案(如下路徑位於 openwrt 原始碼根目錄):

vim package/network/services/dropbear/patches/120-openwrt_options.patch

將如下幾行刪除:

@@ -226,7 +226,7 @@ much traffic. */
  * note that it will be provided for all "hidden" client-interactive
  * style prompts - if you want something more sophisticated, use 
  * SSH_ASKPASS instead. Comment out this var to remove this functionality.*/
-#define DROPBEAR_PASSWORD_ENV "DROPBEAR_PASSWORD"
+/*#define DROPBEAR_PASSWORD_ENV "DROPBEAR_PASSWORD"*/
 
 /* Define this (as well as ENABLE_CLI_PASSWORD_AUTH) to allow the use of
  * a helper program for the ssh client. The helper program should be

重新編譯生成 dropbear,並替換裝置裡已安裝的 dropbear。

#define DEFAULT_SSH_AGENT_HOST      "120.198.45.126"
#define DEFAULT_SSH_AGENT_PORT      "10022"
#define DEFAULT_SSH_AGENT_USER      "ssha_debug"
#define DEFAULT_SSH_AGENT_PASSWD    "220011ssha"
int login_to_ssh_agent(const char *host, const char *port, const char *user, const char *passwd)
{
    // openssh client:
    // sshpass -p '123456' ssh -y -T -f -N -g -R :10022:127.0.0.1:22 [email protected]

    // dropbear ssh clent:
    // DROPBEAR_PASSWORD='123456' ssh -y -T -f -N -g -R :10022:127.0.0.1:22 [email protected]

    char cmd[256];
    snprintf(cmd, sizeof(cmd), "DROPBEAR_PASSWORD='%s' ssh -y -T -f -N -g -R :%s:127.0.0.1:22 %s@%s", 
             (passwd != NULL) ? passwd : DEFAULT_SSH_AGENT_PASSWD, 
             (port != NULL) ? port : DEFAULT_SSH_AGENT_PORT,
             (user != NULL) ? user : DEFAULT_SSH_AGENT_USER,
             (host != NULL) ? host : DEFAULT_SSH_AGENT_HOST);
    printf("login to ssh agent: \n%s\n", cmd);
    system(cmd);

    return 0;
}

2.2 代理機 A (sshd)

在 /etc/ssh/sshd_config 中新增如下幾行後重啟 ssh 服務:

GatewayPorts yes
UseDNS no
GSSAPIAuthentication no

目標機 T 發起連線後,在代理機 A 上查詢目標機 T 是否連線成功:

sudo netstat -anp | grep 10022

列印形如:

tcp        0      0 0.0.0.0:10022           0.0.0.0:*               LISTEN      8264/sshd: frank
tcp6       0      0 :::10022                :::*                    LISTEN      8264/sshd: frank

上述列印中,8264 就是和目標機 T 保持連線的 sshd 程序號,如需關閉當前連線重新建立一個新的連線,則先在代理機 A 上執行:

kill -9 8264

然後再執行 2.1 節的指令,就會建立一次新的代理連線。

為了安全,我們可以專門新建一個使用者,僅用於 ssh 埠轉發功能,不能在 shell 中使用此使用者登入。如下建立一個 ssha_debug 的使用者,無 shell 登入許可權。然後為此使用者建立密碼。注意系統中 nologin 檔案的位置,不同系統可能路徑不同。

sudo useradd ssha_debug -M -s /usr/sbin/nologin
sudo passwd ssha_debug

2.3 本地機 L (sshc)

2.3.1 本地機 L 登入目標機 T

有三種方式:

1. 在本地機 L 上通過 ssh 登入代理機 A,在 A 的 shell 中再登入目標機 T

代理伺服器的公網 ip 是 120.198.45.126,內網 ip 是 192.168.1.102。

1) 先使用 ssh(SecureCRT 或 OpenSSH 命令列) 登入上代理伺服器的 shell。如果除錯機在內網,既可登入代理機的外網 ip,也可登入其內網 ip。

2) 在代理機的 shell 中執行如下命令登入遠端裝置:

ssh -p 10022 [email protected] -vvv

注意,此命令中使用者 root 及其密碼是遠端裝置上的賬戶。

如果提示 Host key 認證失敗之類的資訊,請按提示執行如下命令:

ssh-keygen -f "/home/frank/.ssh/known_hosts" -R [127.0.0.1]:10022

也可直接刪除當前使用者目錄下的 .ssh/known_hosts 檔案。
然後重新執行登入裝置操作。

建議優先使用此方法。

2. 在本地機 L 上使用 ssh 命令登入目標機 T

Win 10 系統預設安裝有 OpenSSH 客戶端。可以在除錯機 Windows 命令列中執行:

ssh -p 10022 [email protected] -vvv

對於本地計算機來說,待除錯的裝置 ip 地址不可見。本機登入到代理機 120.198.45.126 的轉發埠 10022,通過代理機轉發功能,本地機能成功登入到遠端裝置上。注意,此命令中使用者 root 及其密碼是裝置上的賬戶,不是 SSH 代理伺服器上的賬戶。

如果出現認證失敗之類的資訊。可刪除 C:/Users/當前使用者/.ssh/known_hosts 檔案,然後再試。

3. 在本地機 L 上使用 SecureCRT 工具登入目標機 T

也可以直接使用 SecureCRT 軟體,設定好代理機的 ip(120.198.45.126) 和埠號(10022),填上裝置的登入使用者和登入密碼。

不建議使用此方法。因為連線過程太長或連線失敗的話,無法看到錯誤提示資訊。

2.3.2 檢視代理機 A 列印資訊

在 L 執行登入 T 之前檢視列印資訊:

frank@SERVER:~$ sudo netstat -anp  | grep 10022
tcp        0      0 0.0.0.0:10022           0.0.0.0:*               LISTEN      106438/sshd: frank
tcp6       0      0 :::10022                :::*                    LISTEN      106438/sshd: frank

在 L 執行登入 T 之後檢視列印資訊:

frank@SERVER:~$ sudo netstat -anp  | grep 10022
tcp        0      0 0.0.0.0:10022           0.0.0.0:*               LISTEN      106438/sshd: frank
tcp        0      0 192.168.1.102:10022     120.229.163.51:27027    ESTABLISHED 106438/sshd: frank
tcp6       0      0 :::10022                :::*                    LISTEN      106438/sshd: frank

可以看到,上述第二行是 L 執行登入命令後新出現的列印資訊。表示新建立了一條 L 到 A 的 ssh 連線。

L 端的外網地址 120.229.163.51:27027 連線到 A 上的 192.168.1.102:10022,L 通常位於區域網內、具有一個內網地址,120.229.163.51 可能是 L 連線的路由器的公網 IP。

這條連線建立後,A 將這條連線轉發到 R。

2.3.3 檢視目標機 T 列印資訊

在 L 執行登入 T 之前檢視列印資訊:

root@localhost:~# netstat -anp | grep 22
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      917/sshd
tcp        0      0 192.168.202.140:47989   120.198.45.126:22       ESTABLISHED 9452/ssh
tcp        0      0 192.168.202.140:22      192.168.202.100:64737   ESTABLISHED 2041/sshd
tcp        0      0 :::22                   :::*                    LISTEN      917/sshd

在 L 執行登入 T 之後檢視列印資訊:

root@localhost:~# netstat -anp | grep 22
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      917/sshd
tcp        0      0 192.168.202.140:47989   120.198.45.126:22       ESTABLISHED 9452/ssh
tcp        0      0 192.168.202.140:51732   192.168.202.140:22      ESTABLISHED 9452/ssh
tcp        0      0 192.168.202.140:22      192.168.202.140:51732   ESTABLISHED 9579/sshd
tcp        0      0 :::22                   :::*                    LISTEN      917/sshd

可以看到,上述第 3 行和第 4 行是登入之後新增加的列印資訊。

第 2 行,表示 T 上的 ssh 客戶端連線到了 A 上的 ssh 服務端,程序號是 9452。第 3 行,表示程序 9452 收到了 A 轉發來的 ssh 連線後,在本機內部建立新的 ssh 連線,使用 51732 埠號作為 ssh 客戶端,連線到本機 22 埠,22 埠是 sshd 埠。第 4 行,表示本機新啟動一個 sshd 程序,來接收 sshc 的連線。

這樣,L 到 T 的 ssh 通路徹底打通了。A 將來自 L 的連線轉發到 R,R 在內部啟動了 sshd 來處理來自 L 的請求,通過 A 的代理作用,實現了 L 上的 sshc 和 T 上的 sshd 的互動。

3. 典型使用場景步驟總結

上文已涵蓋詳細使用方法,但篇幅太長。此處簡單總結使用步驟如下:

3.1 在代理機 A 上執行

使用 SecureCRT 登入代理機 A。代理機外網 ip 120.198.45.126,內網 ip 192.168.1.102,埠 22。如果本地機與代理機在同一個局域網裡,使用代理機的內網 ip 登入即可。

在代理機 shell 中檢視是否有未關閉的 ssh 隧道:

sudo netstat -anp | grep 10022

若列印形如:

tcp        0      0 0.0.0.0:10022           0.0.0.0:*               LISTEN      8264/sshd: frank
tcp6       0      0 :::10022                :::*                    LISTEN      8264/sshd: frank

則表示有未關閉的 ssh 隧道連線。執行如下命令可關閉連線。

kill -9 8264

3.2 在目標機 T 上執行

使用遠端應用程式介面或者在遠端裝置 T 上做一些特殊操作,觸發 T 執行如下兩條指令之一:

# openssh
sshpass -p '123456' ssh -y -T -f -N -g -R :10022:127.0.0.1:22 [email protected]

# dropbear
DROPBEAR_PASSWORD='123456' ssh -y -T -f -N -g -R :10022:127.0.0.1:22 [email protected]

3.3 在本地機 L 上執行

在本地機 L 上執行如下指令,登入遠端目標機 T:

ssh -vvv -p 10022 [email protected]

另外一種變通的方式是,在本地機先通過 ssh 登入上代理機 A 的 shell。然後在 A 的 shell 中執行如下指令:

ssh -vvv -p 10022 [email protected]

4. 注意事項

1. 確保代理機 A 所在的網路防火牆不遮蔽 10022 埠
2. 確保代理機 A 上 /etc/ssh/sshd_config 配置檔案設定正確
3. 關閉 ssh 隧道既可在代理機 A 上進行(關閉相應的 sshd 程序),也可在目標機 T 上進行(關閉相應的 ssh 程序)
4. 每次只能訪問一臺目標機。如果想同時訪問多臺,可以代理機上設定多個轉發埠,每條連線使用一個埠進行轉發
5. 為保證安全,開啟 ssh 隧道時儘量使用無登入許可權的使用者,並且此使用者的密碼建議經常更新

5. 參考資料

[1] 阮一峰, SSH原理與運用(二):遠端操作與埠轉發
[2] SSH 代理設定
[3] ssh命令和SSH服務詳解

6. 修改記錄

2019-11-20 V1.0 初