在遠端運算方面,SSH 是最受歡迎且安全的協定之一。SSH 是一種加密網路協定,可與遠端裝置建立安全連線。連線到遠端裝置後,使用者可以在遠端 shell 上執行指令。SSH 在網路和系統管理員中最為常見。
這份速查表風格的指南介紹了 SSH 的概述、一些常見的 SSH 連線方式以及各種 SSH 設定。
SSH 概述
SSH 是 Secure Shell 的縮寫。有些人也將 SSH 稱為 Secure Socket Shell。SSH 是存取遠端伺服器最常見的方式。使用 SSH 連線到遠端系統時,您會連線到現有的帳戶。連線後,您將可以存取 shell 工作階段。所有執行的指令都將在遠端機器上執行,並將輸出列印在您的本機終端機上。
SSH 連線採用用戶端-伺服器(client-server)模式。遠端系統必須執行 SSH 守護行程(daemon)才能接受遠端 SSH 連線。SSH 守護行程會接聽特定連接埠、驗證連線請求,並在滿足條件時產生適當的環境。
在本指南中,我們設定了兩台 Ubuntu 伺服器。主伺服器將設定為連線到次要伺服器。次要伺服器將設定為接受來自主伺服器的 SSH 連線。這些伺服器 IP 位址將在整個指南中使用:
-
主伺服器:31.171.250.121
-
次要伺服器:31.171.250.130
首先,您可以參考我們關於如何在 Ubuntu 中使用 SSH 連線到遠端伺服器 以及 如何設定您的 Linux 伺服器以使用基於金鑰的 SSH 驗證 的詳細指南。現在,讓我們開始吧!
SSH 驗證
SSH 驗證主要有兩種類型。傳統方法是使用密碼。它的安全性較低,強烈不建議使用。第二種方法是 SSH 金鑰。SSH 金鑰提供非常強大的安全性,強烈推薦使用。
雖然密碼驗證更容易理解和設定,但它很容易被利用。例如,自動化機器人可以使用暴力破解來入侵系統。SSH 金鑰是加密金鑰。每個金鑰都有兩個部分 – 私鑰和公鑰。公鑰可以分享到任何地方,無需擔心。然而,私鑰必須保持安全防護。
要使用 SSH 金鑰作為驗證方法,遠端系統必須安裝公鑰的複本。本機系統上也應安裝私鑰和公鑰的複本。預設情況下,公鑰會列在以下檔案中。每個不重複的使用者都有該檔案的唯一複本:
|
1 |
~/.ssh/authorized_keys |
以下是驗證程序的運作方式:
-
用戶端系統向遠端系統傳送連線請求。它還會傳送要使用哪個 SSH 金鑰。
-
遠端系統會檢查公鑰是否列在 authorized_keys 中。
-
如果金鑰存在,系統會產生一個隨機字串,並使用公鑰進行加密。加密後的訊息只能使用私鑰進行解密。
-
收到字串後,用戶端將解密該字串。
-
結合該字串和先前協商的會話 ID(session ID),會產生一個 MD5 雜湊值。用戶端將 MD5 雜湊值傳送到遠端系統。
-
遠端系統知道隨機字串和會話 ID。如果 MD5 雜湊值相符,則允許連線。
SSH 金鑰
在本指南中,SSH 金鑰將是驗證的主要焦點。因此,本節將重點介紹如何使用 SSH 金鑰。
-
產生 SSH 金鑰組
預設情況下,Linux 系統未安裝 SSH 金鑰。然而,系統可能包含先前產生/安裝的 SSH 金鑰。假設之前沒有 SSH 金鑰,我們需要產生新的 SSH 公鑰和私鑰組。SSH 支援多種用於產生 SSH 金鑰的加密演算法,例如 RSA、DSA、ECDSA 和 EdDSA。RSA 是預設且首選的演算法。
-
產生一般的 RSA 金鑰組
要產生 SSH 金鑰組,請執行以下指令:
|
1 |
ssh-keygen |
系統提示會詢問您要將金鑰對儲存在何處。如前所述,這將會是一個 RSA 金鑰對。如果未輸入任何值,SSH 將會把它儲存到預設位置 /home/demo/.ssh/id_rsa.
下一步是輸入密碼短語。建議使用密碼短語。密碼短語的長度是任意的。它增加了一層安全性。然而,SSH 允許在沒有任何密碼短語的情況下產生金鑰。如果您想要不含密碼短語的金鑰,只需按 Enter 鍵即可。
最終的輸出提供了以下金鑰資訊:
-
私鑰的位置( /root/.ssh/id_rsa)。絕對不應該分享它。
-
公鑰的位置( /root/.ssh/id_rsa.pub)。與任何人分享都是安全的。
-
金鑰指紋。
-
金鑰隨機圖像。其原理是,如果金鑰遭到破解,您可能會透過注意到金鑰圖像的任何變化來發現。
-
產生具有不同位元數的 RSA 金鑰對
預設情況下,SSH 金鑰為 2048 位元。就安全性而言,這被認為已經足夠。然而,我們可以手動指定使用不同的位元數。位元值越高,金鑰就越強固。
執行以下命令以產生 4096 位元的 SSH 金鑰對。大多數伺服器都支援 4096 位元的 SSH 金鑰。如果金鑰太大,出於 DDoS 防護目的,它可能不會被接受:
|
1 |
ssh-keygen -b 4096 |
因為我們已經產生過金鑰對,SSH 會詢問是否覆寫前一個。其餘過程與產生一般金鑰對相同。
-
變更私鑰密碼短語
我們可以變更私鑰的密碼短語。此過程需要您知道目前的密碼短語。要變更密碼短語,請執行以下命令:
|
1 |
ssh-keygen -p |

該命令將提示您輸入私鑰的位置。如果金鑰儲存在預設位置,請按 Enter 鍵。輸入目前的密碼短語。如果被接受,您就可以指定一個新密碼短語。
-
顯示 SSH 金鑰指紋
每個 SSH 金鑰對都共享一個密碼學指紋。此指紋可用於識別唯一的金鑰。這在許多情況下都很有用。執行以下命令以檢查 SSH 金鑰的指紋:
|
1 |
ssh-keygen -l |

輸入金鑰的位置。如果金鑰儲存在預設位置,請按 Enter 鍵。
複製公鑰
SSH 金鑰對已準備好用於保護遠端連線。為了讓遠端系統接受 SSH 金鑰進行驗證,它需要有一份公鑰的複本。有多種方法可以將公鑰的複本複製到遠端伺服器。
-
使用 ssh-copy-id
該 ssh-copy-id 是 OpenSSH 套件的一部分。這是複製 SSH 公鑰的預設方式。它簡單且易於使用。執行以下命令以傳輸公鑰的複本:
|
1 |
ssh-copy-id <username>@<secondary_server_ip> |

您需要遠端使用者帳戶的密碼才能完成此程序。如果成功,將會顯示成功訊息。
-
使用 SSH 連線
如果使用 ssh-copy-id 工具不可用,但主要伺服器可以使用 SSH 連線到次要伺服器,那麼我們可以使用不同的技巧來複製金鑰。這是透過 SSH 命令將公鑰的內容以管線(pipe)方式傳送到遠端。請注意,如果目錄 ~/.ssh 在遠端系統上不存在,它可能無法運作:
|
1 |
cat ~/.ssh/id_rsa.pub | ssh <username>@<secondary_server_ip> "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys" |
-
手動複製
如果無法進行遠端連線,唯一剩下的方法就是手動將公鑰新增到遠端伺服器。首先,獲取公鑰的內容:
|
1 |
cat ~/.ssh/id_rsa.pub |
在遠端伺服器上,將金鑰放置在適當的位置:
|
1 2 3 |
mkdir -pv ~/.ssh echo <public_key> >> ~/.ssh/authorized_金鑰 |
使用 SSH
現在公鑰已設定完成,我們準備好使用 SSH 進行遠端連線。
-
連線至遠端系統
第一步是學習如何使用 SSH 連線至遠端系統。這假設本機和遠端系統都允許 SSH 流量。若要連線至遠端系統,請輸入以下內容:
|
1 |
ssh <secondary_server_ip> |

若要連線至遠端伺服器上的特定使用者,請改用以下結構:
|
1 |
ssh <username>@<secondary_server_ip> |

如果是第一次連線至該伺服器,SSH 可能會顯示警告。輸入 yes 以繼續連線。如果遠端帳戶受密碼保護,您必須輸入密碼。如果 SSH 金鑰受密碼短語保護,您也必須輸入密碼短語。
-
連線至不同的連接埠
預設情況下,SSH 執行於連接埠 22。SSH 用戶端在連線至遠端系統時會採用預設的連接埠值。然而,如果遠端系統針對 SSH 流量接聽不同的連接埠,則無法運作。在這種情況下,我們需要手動宣告連接埠號碼。若要宣告特定連接埠,請使用 -p 旗標:
|
1 |
ssh -p <port> <username>@<secondary_server_ip> |
每次都手動宣告連接埠會降低效率。我們可以永久變更預設的連接埠值。若要執行此操作,請開啟 SSH 設定檔。如果該檔案不存在,以下命令將會建立它:
|
1 |
nano ~/.ssh/config |
然後,新增以下行:
|
1 2 3 4 5 |
Host <remote_alias> HostName <remote_hostname> Port <port_value> |
-
在遠端伺服器上執行命令
現在連線已建立,您在本機終端機上執行的任何命令都將傳送至遠端伺服器。產生的任何輸出都將傳送至本機終端機。
如果只需執行單一命令,我們可以在不進行完整 SSH 登入的情況下執行它。我們只需在 SSH 連線指令後宣告該命令即可:
|
1 |
ssh <username>@<secondary_server_ip> <command_to_run> |
-
將金鑰新增至 SSH 代理程式
如果 SSH 金鑰設有密碼短語,則每次連線至遠端系統時,您都必須輸入該密碼短語。重複執行此操作會降低效率。我們可以讓 SSH 代理程式來處理。這是一個小型公用程式,可在您輸入密碼短語後儲存私鑰。在終端機工作階段期間,該私鑰將可供使用。若要啟動 SSH 代理程式,請執行以下命令:
|
1 |
eval $(ssh-agent) |

該程式正在背景執行。您只需要將私鑰新增至代理程式即可。請執行以下命令:
|
1 |
ssh-add |

輸入密碼短語以完成操作。
-
轉遞 SSH 憑證
我們也可以將 SSH 設定為在無密碼的情況下從一部伺服器連線至另一部伺服器。這可能非常高效,尤其是在處理眾多遠端伺服器時。若要實現此目的,我們需要轉遞 SSH 憑證。轉遞 SSH 憑證需要將遠端伺服器設定為接受來自本機/伺服器的連線。然後,您只需要使用 -A 旗標。它會在目前的工作階段中將您的憑證轉遞至伺服器:
|
1 |
ssh -A <username>@<secondary_server_ip> |
遠端伺服器設定
本節包含一些常見的伺服器端設定,以協助您改善伺服器回應和連線安全性。
-
停用密碼驗證
如果已設定 SSH 金鑰且 SSH 連線運作正常,那麼停用密碼驗證是安全的。以下設定將在任何使用者透過 SSH 連線時停止要求輸入密碼。在遠端伺服器上,開啟 sshd_config 檔案,並使用 root/sudo 權限:
|
1 |
sudo nano /etc/ssh/sshd_config |
接下來,搜尋項目 PasswordAuthentication。如果該行被註解了,請取消註解。將值變更為 no:
|
1 |
PasswordAuthentication no |

儲存檔案並關閉編輯器。若要使變更生效,請重新啟動 SSH 服務:
|
1 |
sudo service ssh restart |
如果系統是 CentOS/Fedora,請改用以下命令:
|
1 |
sudo service sshd restart |
-
變更 SSH 連接埠
如前所述,SSH 使用連接埠 22 來交換 SSH 流量。然而,根據一些系統管理員的說法,為 SSH 分配不同的連接埠會更好。這有助於防止自動化機器人灌爆該連接埠。若要變更 SSH 監聽的連接埠,請開啟 sshd_config 檔案:
|
1 |
sudo nano /etc/ssh/sshd_config |
搜尋項目 Port。如果它被註解了,請取消註解。然後,將值變更為其他數值。連接埠值為無正負號的 16 位元整數 (0-65535):
|
1 |
Port 1024 |

儲存檔案並關閉編輯器。若要套用變更,請重新啟動 SSH 精靈:
|
1 |
sudo service ssh restart |
在 CentOS/Fedora 上,請改為執行以下命令:
|
1 |
sudo service sshd restart |
-
使用者限制
我們可以設定哪些使用者帳戶可以透過 SSH 連線。這也涉及調整 sshd_config 檔案。使用 sudo/root 權限開啟該檔案:
|
1 |
sudo nano /etc/ssh/sshd_config |
搜尋項目 AllowUsers。新增允許的使用者:
|
1 |
AllowUsers <user_1> <user_2> |

儲存檔案並關閉編輯器。重新啟動 SSH 精靈以使變更生效:
|
1 |
sudo service ssh restart |
在 CentOS/Fedora 上,請改為執行以下命令:
|
1 |
sudo service sshd restart |
-
群組限制
與使用者限制類似,我們也可以決定哪些使用者群組可以透過 SSH 連線到系統。開啟 sshd_config 檔案:
|
1 |
sudo nano /etc/ssh/sshd_config |
使用項目 AllowGroups 來新增可以使用 SSH 的特定使用者群組:
|
1 |
AllowGroups <user_group> |

儲存檔案並關閉編輯器。重新啟動 SSH 精靈以使變更生效:
|
1 |
sudo service ssh restart |
對於 CentOS/Fedora,請改為執行以下命令:
|
1 |
sudo service sshd restart |
請注意,如果從使用者群組中新增或移除了任何使用者,則需要重新啟動 SSH 精靈。否則,群組變更將不會生效。
-
停用 root 登入
如果您可以使用具有 sudo 權限的使用者,建議停用透過 SSH 進行 root 登入。開啟 sshd_config 檔案:
|
1 |
sudo nano /etc/ssh/sshd_config |
將項目 PermitRootLogin 的值變更為 no:
|
1 |
PermitRootLogin no |

儲存檔案並關閉編輯器。重新啟動 SSH 精靈以使變更生效:
|
1 |
sudo service ssh restart |
在 CentOS/Fedora 上,請改為執行以下命令:
|
1 |
sudo service sshd restart |
-
轉發 X 應用程式顯示
SSH 精靈還可以將 X 應用程式的顯示從伺服器轉發到用戶端。然而,若要使其正常運作,遠端系統必須設定 X 視窗系統。該功能也必須在 SSH 設定中啟用。開啟 SSH 設定檔:
|
1 |
sudo nano /etc/ssh/sshd_config |
將指令 X11Forwarding 的值變更為 yes:
|
1 |
X11Forwarding yes |

儲存檔案並關閉編輯器。重新啟動 SSH 服務以使變更生效:
|
1 |
sudo service ssh restart |
在 CentOS/Fedora 上,請改為執行以下命令:
|
1 |
sudo service sshd restart |
用戶端設定
在本節中,我們將介紹 SSH 用戶端上的一些常見設定。
-
特定伺服器的連線資訊
在本機系統上,我們可以定義遠端連線的詳細資訊。所有資訊都儲存在位於以下路徑的設定檔中: ~/.ssh/config:
|
1 |
nano ~/.ssh/config |
每個遠端系統區塊都由關鍵字 Host 後跟別名來表示。所有特定於系統的指令都放在這裡。連線到遠端系統時,SSH 會自動套用它們。如需設定的完整、深入說明,請查看說明手冊(man page):
|
1 |
man ssh_config |

遠端連線的條目將遵循以下結構:
|
1 2 3 |
Host <remote_hostname> <directive> <value> |
-
連線逾時
您可能會發現,在您準備好執行任何操作之前,SSH 工作階段就已經中斷連線。如果用戶端沒有向遠端伺服器傳送任何封包,一段時間後連線就會逾時。為了避免這種情況,我們可以設定本機用戶端每隔一段時間傳送一個封包,以保持連線運作。
開啟本機設定檔:
|
1 |
nano ~/.ssh/config |
在遠端連線條目下,新增指令 ServerAliveInterval ,後跟以秒為單位的封包間隔時間:
|
1 |
ServerAliveInterval 120 |

儲存檔案並關閉編輯器。
-
停用主機檢查
預設情況下,每當嘗試連線到新伺服器時,SSH 用戶端都會回報遠端 SSH 服務的指紋。這是驗證主機’真實性的實用功能。如果惡意攻擊者試圖偽裝遠端主機,它將顯示為新伺服器。
停用此功能可能會帶來巨大的安全性風險。通常建議保持開啟此選項。然而,在某些情況下,停用主機檢查可能會帶來便利。開啟設定檔:
|
1 |
nano ~/.ssh/config |
在遠端主機區段下,新增以下指令:

|
1 2 3 |
StrictHostKeyChecking no UserKnownHostsFile /dev/null |
第一個指令將停用自動將新主機新增至儲存在 known_hosts 檔案中的已知主機清單。第二個指令是不對任何變更發出警告。儲存檔案並關閉編輯器。
-
在單一 TCP 連線上多工傳輸 SSH
有時,建立 TCP 連線可能需要相當長的時間。如果需要對同一台機器建立多個連線,那麼多工(multiplexing)是一個您可以利用的絕佳功能。SSH 多工允許在多個 SSH 工作階段中使用同一個 TCP 連線。它減少了建立新工作階段所需的部分工作負載。限制連線數量也可能有所幫助。
我們可以手動設定多工連線,或者讓 SSH 在可用時自動使用它。在這裡,我們將設定 SSH 採用第二種方式。開啟 SSH 設定檔:
|
1 |
nano ~/.ssh/config |
在檔案頂部新增萬用字元主機定義。這可確保下一組指令將套用於所有遠端連線。新增以下指令:
|
1 2 3 4 5 |
ControlMaster auto ControlPath ~/.ssh/multiplex/%r@%h:%p ControlPersist 1 |

第一個指令指示 SSH 在可用時自動使用多工。第二個指令建立控制通訊端(control socket)的路徑。此通訊端將在建立第一個工作階段時建立。後續的工作階段將遵循此通訊端。
最後一個指令告訴 SSH 讓初始的主連接在背景執行。它還表示 TCP 連接將在最後一個 SSH 工作階段結束一秒後自動終止。接下來,建立我們在設定檔中宣告的目錄:
|
1 |
mkdir -pv ~/.ssh/multiplex |
最後,多路復用應該已經啟用。
SSH 逸出碼
建立連接後,有幾種方法可以使用逸出碼來控制連接行為。
-
強制中斷連接
您的 SSH 工作階段卡住了嗎?SSH 工作階段通常由伺服器管理。如果伺服器出現問題,卡在失效的 SSH 工作階段中可能會令人沮喪。幸好,OpenSSH 提供了實用的控制功能,可以從用戶端管理連接狀態。
按幾下 Enter 鍵。然後,輸入以下指令:
|
1 |
~. |
![]()
這裡, ~ 是控制字元。在用戶端執行此指令後,連接應該會立即關閉。
-
SSH 背景工作階段
我們也可以將 SSH 工作階段放到背景執行。當放到背景時,您將返回一般的 shell 工作階段。工作完成後,您可以再次返回 SSH shell。請注意,您需要有適當的逾時設定,以避免 SSH 工作階段在背景時發生逾時。若要將 SSH 工作階段放到背景,請輸入控制字元,後面加上 Ctrl + Z:
|
1 |
~<Ctrl + Z> |

如果這是您最近的背景工作,您可以使用以下指令重新啟用它:
|
1 |
fg |
如果有多個背景工作,我們可以從工作列表中確認:
|
1 |
jobs |

若要將目標工作移至前景,請記下第一欄的工作值。然後,執行以下指令:
|
1 |
fg %<job_value> |
-
變更連接埠轉發設定
利用控制機制,我們可以即時變更連接埠轉發規則。建立連接後,我們可以建立或拆除連接埠轉發規則。這是 SSH 命令列介面的一部分。
若要存取 SSH 命令列介面,請執行以下指令:
|
1 |
~C |
![]()
若要列出可用選項,請輸入以下指令:
|
1 |
-h |
如果輸出內容太少,請嘗試使用以下控制指令來增加詳細程度:
|
1 |
~v |
現在,再次執行 -h 指令:
|
1 |
-h |

正如輸出所說明的,使用簡單的指令來實作任何連接埠轉發都非常簡單。例如,也可以使用 kill 指令來銷毀通道,這由 K 在指令列表中表示。
結語
SSH 非常常見。這就是為什麼學習 SSH 非常有用。我們全面的 SSH 概述涵蓋了使用者日常使用 SSH 所需了解的最重要 SSH 設定。一旦掌握,您應該就能應對幾乎所有的 SSH 伺服器設定。
祝您使用愉快!
留言
目前尚無留言。成為第一個留言的人吧。