SSH 連線是什麼?初學者必看的安全連線工具指南

最後更新:2025年3月4日
架構

在現代的網路世界中,無論是管理伺服器、遠端操作電腦,還是進行安全資料傳輸,SSH (Secure Shell) 都是技術人員不可或缺的工具之一。

它不僅能提供安全的加密連線,還有助於保護敏感資訊,防止數據在傳輸過程中被竊取或篡改。

本文將詳細介紹 SSH 的基本概念、運作原理,以及如何使用 SSH 進行安全的遠端連線,讓初學者也能輕鬆上手。


SSH 是什麼?

SSH (Secure Shell) 就像是一個安全的「隧道」,讓你可以透過網路「遙控」另一台電腦。

不管這台電腦是在隔壁房間,還是遠在世界的另一端,你都能坐在自己的電腦前,像操作本機一樣,進行遠端操作,例如執行指令、查看檔案、甚至重啟系統。

這個工具是由一位叫 Tatu Ylönen 的工程師在 1995 年發明的,主要是為了取代當時比較不安全的舊工具 (Telnet) 和其他沒有加密的遠端操作方法。

SSH 的特色是它能把你和遠端電腦之間傳輸的資料「包起來」並加密,讓你的訊息在網路上傳輸時不會被有心人偷看或竄改。

為什麼需要 SSH?

你可能會好奇:「我自己就有一台電腦,為什麼還要連到遠端電腦?」

其實,很多情況下,你的電腦無法勝任某些特定的工作,或者效率不高,這時候就需要透過 SSH 來遠端操作一台更合適的電腦,例如伺服器 (Server)。

1️⃣ 管理伺服器

假設你負責一個網站,這個網站放在某個雲端伺服器上(例如 AWS、Google Cloud)。

當網站出現問題或需要更新時,你不可能真的跑到機房去操作伺服器。

這時,你就可以用 SSH 從自己的電腦連到伺服器上,進行維護、重啟服務或更新程式碼。

2️⃣ 運算資源不夠

有時你的電腦性能不夠,比如進行大型資料分析、運行 AI 模型,或者做影像處理,這些都需要強大的計算能力。

此時,你可以透過 SSH 連到遠端擁有高效能硬體的伺服器,把這些「重工作」交給它去完成。

3️⃣ 安全存取公司資料

許多公司或組織的資料都存放在伺服器上,這樣做不僅安全,還能方便多人協作。

透過 SSH,你可以在任何地方安全地連接到公司的伺服器,查詢或更新資料,而不用擔心資料在傳輸過程中被竊取。

4️⃣ 技術支援與遠端協助

如果你的電腦遇到問題,技術人員可以透過 SSH 直接連到你的電腦,幫你遠端進行修復、排除故障,甚至安裝軟體,省去當面處理的麻煩。

SSH 如何確保數據安全?

SSH 之所以這麼受歡迎,除了可以讓你遠端操作電腦,還因為它能保證你的數據在網路上傳輸時的安全性

它主要靠以下三個關鍵功能來達到這一點:

  1. 加密通訊:SSH 會把所有數據進行加密處理,類似於把訊息裝進「密封信封」,只有收件人才能打開,防止中途被偷看。
  2. 身份驗證:當你連接到遠端電腦時,SSH 會先驗證你的身份,確保連接的雙方都是合法的,不會被黑客冒充。例如,透過密碼或使用更加安全的金鑰驗證方式,避免被不明人士入侵。
  3. 資料完整性檢查:SSH 會在數據傳輸過程中檢查資料的完整性,確保你收到的訊息沒有被篡改。就像寄包裹時,快遞公司會用膠帶封好,收到時若包裝被打開過,你一眼就能看出異常。

SSH 的運作原理

SSH 之所以能夠提供高安全性,主要依靠兩大核心機制:身份驗證 (Authentication)資料加密保護 (Data Protection)

這兩部分不僅各自發揮作用,還相互配合,共同構建了一個完整的安全體系。

身份驗證:安全機制的第一道關卡

身份驗證是 SSH 建立安全連線的第一步,主要目的是確認連線者的身份,確保只有合法的使用者才能進入伺服器,防止黑客或未經授權的人操作伺服器。

這就像你進入銀行之前,保全人員會先檢查你的身份,確認你是這家銀行的客戶。

如果身份不符,系統會直接拒絕連線,從而阻止攻擊者進入系統。

SSH 主要有兩種方法確認你的身份:密碼驗證金鑰驗證

1️⃣ 密碼驗證 (Password Authentication)

很簡單,當你連線到伺服器時,輸入你的帳號和密碼,伺服器會把你的密碼加密後,和它自己保存的密碼比對。

如果對得上,你就能進入伺服器。

優缺點
  • 優點:簡單方便,特別是臨時連線時很實用。
  • 缺點:安全性不高,容易被暴力破解 (不停嘗試密碼的攻擊手法)。如果很多人要共用伺服器,管理密碼也會很麻煩。
適合使用場景
  • 在家裡或小型公司內網使用還好,但如果是公開網路或公司伺服器,安全性不夠,建議用金鑰驗證。

2️⃣ 金鑰驗證 (Public Key Authentication)

怎麼運作?
  • 你會在自己的電腦上生成一對「公私鑰 (Key Pair)」。
  • 把公鑰上傳到伺服器,私鑰則安全地保存在你的電腦中。
  • 當你連線時,伺服器會發送一個測試資料 (Challenge) 給你,你用私鑰加密後傳回伺服器,伺服器用公鑰解密,如果能正確解密,表示你是合法用戶,就讓你登入。
優點
  • 非常安全:私鑰在你的電腦上,而且可以設定密碼保護,即使有人偷到你的私鑰檔案,沒有密碼也無法使用。
  • 免密碼登入:當金鑰設定好之後,每次連線不需要再輸入密碼,既安全又方便。
什麼時候用金鑰驗證?
  • 伺服器管理:像是 DevOps、雲端伺服器 (例如 AWS、GCP) 的操作,特別是在生產環境中使用。
  • 自動化任務:例如寫腳本進行自動化備份、程式部署等,免密碼連線能讓任務全自動完成。
如何設定?
# 生成公私鑰對
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

# 把公鑰傳送到伺服器
ssh-copy-id user@server_ip

資料加密保護:數據安全的守護者

當 SSH 成功驗證身份後,下一步就是保護資料傳輸的安全性

資料加密保護 (Data Protection) 的作用是在身份確認無誤後,建立一條加密的通道,讓你和伺服器之間的所有資料傳輸都不會被網路中的其他人竊聽或篡改。

這就像在銀行裡,與銀行職員談話的房間有良好的隔音,確保你的對話內容 (數據) 不會被外界聽見 (被竊聽)。

SSH 之所以安全,是因為它用了三種加密技術:對稱加密非對稱加密雜湊演算法。讓我一個個解釋給你聽。

1️⃣ 對稱加密 (Symmetric Encryption)

什麼是對稱加密?

你可以把對稱加密想像成一把「萬用鑰匙」,這把鑰匙既能鎖門 (加密資料),也能開門 (解密資料)。

無論是你輸入的指令,還是伺服器的回應內容,這些資料在網路上傳輸時都會用這把鑰匙加密起來,避免被偷看。

對稱加密的優點
  • 速度快:就像用同一把鑰匙開家裡所有的鎖一樣,簡單又迅速,特別適合大數據傳輸。
  • 安全性依賴鑰匙保管:如果這把「萬用鑰匙」 (Session Key) 被壞人拿到,那他就能打開所有加密的資料,所以鑰匙的交換過程需要特別小心。
SSH 常用的對稱加密方法
  • AES (Advanced Encryption Standard):SSH 最常用的加密方法,有不同強度 (128、192、256 位元),位元數越高,安全性越好。
  • ChaCha20:在某些情況下,比 AES 更快、更安全,特別是在行動裝置上效能不錯。

2️⃣ 非對稱加密 (Asymmetric Encryption)

什麼是非對稱加密?

這種加密就像「鎖」和「鑰匙」的組合,而且這組合不是萬用的,而是專屬的。具體來說:

  • 公鑰 (Public Key):這是一把「公開的鎖」,每個人都可以拿到,主要用來加密資料。
  • 私鑰 (Private Key):這是一把「私密的鑰匙」,只有你自己有,專門用來解密資料。
非對稱加密在 SSH 中的應用
  • 身份驗證:確保你連接的伺服器是真的,而不是黑客偽裝的。
  • 安全交換 Session Key:客戶端會用伺服器的公鑰把 Session Key 加密,再傳給伺服器。因為只有伺服器有對應的私鑰,才能解密拿到 Session Key,這樣整個連線過程都會保持安全。
常見的非對稱加密方法
  • RSA:經典又穩定,通常使用 2048 或 4096 位元的安全等級,數字越大安全性越高。
  • ECDSA:安全性高,但用的「鑰匙」長度比較短,運算起來更快。
  • Ed25519:新一代加密方式,效能更好,特別適合金鑰驗證。

3️⃣ 雜湊演算法 (Hashing)

什麼是雜湊演算法?

你可以把雜湊演算法想像成「資料的指紋機器」。它會把資料經過「攪拌」,產生一個獨一無二的「數位指紋」(雜湊值),而且同樣的資料每次都會產生相同的指紋。

在 SSH 中的作用
  • 資料完整性:資料傳輸時,SSH 會先對資料計算指紋,對方收到資料後也會做同樣的計算,兩個指紋一對比,一樣就代表資料沒有被篡改過。
  • 防止資料被偽造:每個數據包都有指紋,攻擊者如果偷偷修改資料,指紋就對不上了,系統馬上就能察覺。
常見的雜湊方法
  • SHA-2:SSH 中最常見的,提供 256 和 512 位元的安全級別。
  • SHA-3:更新一代的技術,在一些高安全需求的情境下使用。

身份驗證與資料保護如何協同工作?

  1. 先驗證身份
    當你嘗試連線到伺服器時,SSH 會先進行身份驗證。這一步確保「你是你」,防止壞人假冒你的身份進入系統。
  2. 建立加密的安全通道
    一旦身份驗證通過,SSH 會生成 Session Key,並透過非對稱加密技術安全地傳送給伺服器。伺服器解密後,雙方就能共享這個加密密鑰,開始安全通訊。
  3. 全程加密與資料完整性校驗
    之後所有的數據交換都會透過 Session Key 進行加密,防止資料在傳輸過程中被竊聽或篡改。雜湊演算法則持續校驗數據的完整性,防止資料被偽造或修改。

SSH 連線完整過程

sequenceDiagram
    participant Client as 你的電腦 (客戶端)
    participant Server as 遠端電腦 (伺服器)
    
    Client->>Server: 建立連線請求 (SSH Handshake)
    Server-->>Client: 傳送伺服器的公鑰 (Public Key)
    
    Client->>Client: 生成對稱加密密鑰 (Session Key)
    Client->>Server: 使用伺服器的公鑰加密 Session Key,傳送給伺服器
    
    Server->>Server: 使用私鑰解密 Session Key
    Client->>Server: 開始加密的安全通訊 (使用 Session Key)
    
    Client->>Server: 發送指令 (例如 ls、重啟伺服器)
    Server-->>Client: 回傳執行結果 (加密數據)

建立連線請求 (SSH Handshake)

SSH 連線的第一步是「握手 (Handshake)」過程,類似於雙方打招呼確認身份。

這個過程由客戶端 (你的電腦) 主動發起,向伺服器發出連線請求,主要包括:

  • 協議版本確認:客戶端和伺服器會交換各自支援的 SSH 協議版本 (如 SSH-2),以確保雙方能使用相同的加密技術和通信規範。
  • 加密演算法協商:雙方交換支援的加密、雜湊 (Hashing) 和壓縮演算法列表,並從中選擇最佳匹配的演算法,用於後續的數據加密和驗證。
  • 初始化隨機數 (Nonce):客戶端和伺服器各自生成一個隨機數,這些數字會參與後續 Session Key 的生成,增強安全性。

伺服器提供公鑰 (Server Public Key)

在確認連線建立後,伺服器會將自己的 公鑰 (Public Key) 發送給客戶端。

這個公鑰相當於一把加密資料的「鎖」,任何人都可以使用公鑰加密訊息,但只有伺服器持有的 私鑰 (Private Key) 才能解密這些訊息。

  • 伺服器身份驗證:客戶端會使用已知的伺服器公鑰進行驗證,確保連線的伺服器是真正的目標伺服器,而不是攻擊者冒充的假伺服器 (防止中間人攻擊, Man-in-the-Middle Attack)。
  • 檢查公鑰指紋 (Key Fingerprint):SSH 客戶端會顯示伺服器公鑰的指紋,讓使用者手動確認指紋是否正確,特別是在首次連線時,這一步驟能進一步確認伺服器的真實性。

生成 Session Key

客戶端 (你的電腦) 會生成一個隨機的 Session Key,這個 Session Key 是用於後續數據加密的 對稱加密密鑰

  • 為什麼使用 Session Key?
    對稱加密 (如 AES) 在大數據傳輸中速度更快、效能更好。相比於非對稱加密,對稱加密更適合長時間的數據流加密,例如在 SSH 連線過程中保持穩定的加密通道。
  • Session Key 的特性
    • 是臨時的,只在當前連線中有效,下次連線會重新生成,確保即使 Session Key 洩漏也不影響其他連線。
    • 完全隨機生成,避免被猜測。

加密 Session Key

客戶端會使用伺服器提供的 公鑰 (Public Key) 將生成的 Session Key 加密,然後將加密後的 Session Key 傳送給伺服器。這一步有幾個關鍵點:

  • 加密過程的安全性:因為加密是使用伺服器的公鑰進行的,即使中途有人攔截數據,也無法解密 Session Key,因為解密過程只能由伺服器持有的私鑰完成。
  • 非對稱加密技術的應用:此處通常使用 RSAECDSAEd25519 演算法進行加密,確保數據交換的安全性。
  • 防止重放攻擊 (Replay Attack):Session Key 與初始化隨機數 (Nonce) 結合,避免攻擊者重複使用已攔截的加密數據包進行攻擊。

伺服器解密 Session Key

當伺服器收到加密的 Session Key 後,會用自己的 私鑰 (Private Key) 對數據進行解密,獲取到客戶端傳送的 Session Key。

此時,伺服器與客戶端就擁有了一樣的加密密鑰,準備進入安全通訊階段。

  • 身份驗證階段 (Authentication):在進入加密通訊之前,伺服器通常會要求進行身份驗證,例如:
    • 密碼驗證:客戶端輸入帳號和密碼。
    • 金鑰驗證:客戶端提供私鑰進行非對稱加密驗證,比較加密後的資料是否能與伺服器中的公鑰匹配,這種方式更安全。
  • 驗證成功後進入加密通訊:只有通過身份驗證的客戶端,才能進入接下來的加密通訊階段,防止未經授權的用戶進入系統。

開始加密通訊 (Encrypted Communication)

此時,客戶端和伺服器已經建立了一條安全的加密通道,所有的數據傳輸都會使用 Session Key 進行加密,保障數據的機密性和完整性。

  • 加密數據傳輸:客戶端可以安全地發送指令 (如 lscdreboot),伺服器則將執行結果加密後傳回客戶端。
  • 數據完整性校驗:每個數據包都會生成雜湊值 (Hash),在傳輸過程中進行校驗,確保數據未被竄改。例如使用 HMAC (Hash-based Message Authentication Code) 技術,確保數據在傳輸中無法被偽造。
  • 持續安全連線:在整個 SSH 連線過程中,即使網路不穩定導致短暫中斷,SSH 也能安全地重新建立加密通道,保持數據安全。

如何使用 SSH 進行連線?

SSH (Secure Shell) 是一個強大的工具,可以讓你安全地遠端連接伺服器、傳輸文件,甚至進行端口轉發。

在開始使用 SSH 之前,你需要確保你的電腦上已經安裝了 SSH 客戶端。以下將詳細介紹從安裝客戶端到進階應用的每一個步驟。

安裝 SSH 客戶端

Windows 平台

在 Windows 系統中,你可以選擇以下 SSH 客戶端工具:

  • PuTTY:一個免費且輕量的 SSH 客戶端,支援基本的遠端連線、金鑰管理和終端操作。
  • MobaXterm:提供更豐富的功能,包括多標籤頁面、圖形化的 SFTP 檔案管理,以及內建的多種網路工具,非常適合開發者和系統管理員。
  • Windows Terminal (內建 OpenSSH 客戶端):Windows 10 以上版本已經內建 OpenSSH,只需在 PowerShell 或 Windows Terminal 中輸入 SSH 指令即可,無需額外下載軟體。

在 Windows 上啟用內建 SSH 客戶端的方法

  1. 開啟 PowerShell 或 Windows Terminal。
  2. 輸入 ssh,如果顯示指令列表,代表已經安裝完成。
  3. 如果未安裝,可以通過 設定 > 應用程式 > 選擇性功能,找到並安裝 OpenSSH Client

macOS 和 Linux 平台

對於 macOS 和大多數 Linux 發行版(例如 Ubuntu、Debian、Fedora),系統通常已經預裝了 SSH 客戶端,因此無需額外安裝。

確認 SSH 是否已安裝

  1. 打開終端機 (Terminal)。
  2. 輸入以下指令:
ssh -V
  1. 如果顯示版本號(例如 OpenSSH_8.6p1),表示 SSH 已經安裝。

透過 SSH 連線到遠端伺服器

連線到遠端伺服器的步驟非常簡單,以下是基本指令格式:

ssh [用戶名稱]@[伺服器 IP 地址]

範例:

ssh user@192.168.1.10
  • user 是你在伺服器上的用戶名。
  • 192.168.1.10 是伺服器的 IP 地址(可替換為網域名稱,例如 server.example.com)。

當你執行這個指令後,系統會提示輸入你的伺服器密碼,正確輸入後即可登入伺服器。

在伺服器終端機上,你可以執行各種指令,例如查看系統狀態 (top)、瀏覽文件 (ls)、或是修改設定 (nano config.txt)。

設置 SSH 金鑰驗證(提高安全性)

金鑰驗證 是 SSH 中最推薦的身份驗證方法,因為它比傳統的密碼驗證更安全,且支援免密碼登入。設定金鑰驗證大致分為三個步驟:

1. 生成 SSH 金鑰對

在客戶端電腦上使用以下指令生成一對 公私鑰 (Key Pair)

ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
  • -t rsa:指定使用 RSA 演算法生成金鑰。
  • -b 4096:金鑰長度為 4096 位元,安全性更高。
  • -C “your_email@example.com:為金鑰添加註解(通常是你的電子郵件),方便管理。

生成過程中,你可以設定金鑰的儲存路徑(通常預設在 ~/.ssh/id_rsa),並可以選擇為私鑰設置密碼 (Passphrase) 增加安全性。

2. 將公鑰上傳到伺服器

上傳公鑰到伺服器,使伺服器認可你的電腦,這樣你在連線時就不再需要手動輸入密碼:

ssh-copy-id user@192.168.1.10

這條指令會自動將你的公鑰 (~/.ssh/id_rsa.pub) 添加到伺服器上 ~/.ssh/authorized_keys 檔案中。

3. 測試無密碼登入伺服器

現在你可以嘗試無密碼登入伺服器:

ssh user@192.168.1.10

如果設定正確,系統不會再要求輸入密碼,直接登入伺服器,這樣既安全又方便。


SSH 的進階應用

檔案傳輸

SSH 不僅能遠端連線,還能安全地傳輸檔案,常用的方法有 SCPSFTP

1️⃣ SCP (Secure Copy Protocol)

SCP 是用於傳輸單個文件或目錄的簡單方法,語法類似於 cp 指令:

# 將本地的 file.txt 上傳到遠端伺服器的 /remote/path/
scp file.txt user@192.168.1.10:/remote/path/

2️⃣ SFTP (SSH File Transfer Protocol)

SFTP 提供類似 FTP 的圖形化介面,可以更方便地管理伺服器文件:

sftp user@192.168.1.10

連接後,你可以使用類似 FTP 的指令,例如 ls(列出文件)、get file.txt(下載文件)或 put file.txt(上傳文件)。

端口轉發 (Port Forwarding)

SSH 允許將本地端口或遠端端口進行轉發,實現安全的網路代理或服務訪問。

1️⃣ 本地端口轉發 (Local Port Forwarding)

ssh -L 8080:localhost:80 user@192.168.1.10
  • 將本地的 8080 端口,映射到遠端伺服器的 80 端口。
  • 你可以在瀏覽器中打開 localhost:8080,訪問伺服器上的網站。

2️⃣ 遠端端口轉發 (Remote Port Forwarding)

ssh -R 8080:localhost:80 user@192.168.1.10
  • 將遠端伺服器的 80 端口,映射到本地的 8080 端口。
  • 適合將內部服務 (如資料庫或 API) 暴露給特定的遠端使用者,避免直接開放在公網上。

補充:什麼是端口轉發?

端口轉發 (Port Forwarding) 就像是在你的電腦和伺服器之間搭建一座「隧道」,把特定的網路流量 (例如網頁、數據庫存取) 安全地導入到正確的位置。它的作用是:

  • 把你電腦的特定連線,安全地轉送到遠端伺服器上
  • 把伺服器上的服務,透過 SSH 隧道引導到你本地電腦上

你可以把它想像成:你有一個密封的管道 (加密的 SSH 隧道),這個管道一端在你的電腦,另一端連接到遠端伺服器的特定服務 (例如網站、資料庫),中間的資料都不會被其他人看到。

為什麼需要端口轉發?

  1. 安全訪問內部服務:有些伺服器上的服務 (例如公司內部網站、資料庫) 不能直接公開到網際網路,但你還是需要遠端連接到它,這時端口轉發就能派上用場。
  2. 繞過防火牆限制:在某些情況下,網路防火牆會阻止你連接到特定服務,透過 SSH 端口轉發,你可以把這些連線「偽裝」成一般的 SSH 流量,成功連接。
  3. 加密不安全的連線:如果有些應用程式沒有加密 (例如舊版的 FTP),你可以把它包裝在 SSH 隧道中,提供加密保護。

端口轉發的類型

SSH 主要提供兩種端口轉發方式:本地端口轉發遠端端口轉發

1. 本地端口轉發 (Local Port Forwarding)

本地端口轉發的意思是:你把自己電腦上的一個「端口 (Port)」設定成一個「入口」,所有進入這個入口的資料,都會被安全地轉送到遠端伺服器上的特定服務。

假設你要從本地電腦訪問伺服器上的內部網站 (伺服器上的網站服務在 80 端口),你可以這樣做:

ssh -L 8080:localhost:80 user@192.168.1.10
  • -L:代表本地端口轉發 (Local Port Forwarding)。
  • 8080:localhost:80:意思是:
    • 本地電腦的 8080 端口是你的「入口」。
    • 透過 SSH 隧道,將所有連接到這個入口的資料,轉送到遠端伺服器 (192.168.1.10) 上的 80 端口 (這是網站服務的標準端口)。
  • user@192.168.1.10:伺服器的登入資訊 (用戶名稱和 IP 地址)。

當你在瀏覽器輸入 http://localhost:8080 時,其實你訪問的是伺服器上的網站 (例如 http://192.168.1.10:80),但是所有的流量都經過 SSH 加密隧道,安全又方便。

2. 遠端端口轉發 (Remote Port Forwarding)

遠端端口轉發則是反過來,讓伺服器上的特定服務,透過 SSH 隧道「出口」到你的本地電腦上,適合讓遠端伺服器內部的服務暴露給本地網路使用。

假設你有一個資料庫服務 (例如 MySQL) 只在伺服器的內部網路開放,沒有公開到網際網路,但你在家裡工作時需要連接這個資料庫,這時你可以這樣設置:

ssh -R 8080:localhost:3306 user@192.168.1.10
  • -R:代表遠端端口轉發 (Remote Port Forwarding)。
  • 8080:localhost:3306:意思是:
    • 遠端伺服器上的 8080 端口作為「出口」,所有通過這個端口的資料會被安全地轉送到你本地電腦的 3306 端口 (MySQL 的預設端口)。

這樣你就可以在本地使用 localhost:8080 來安全地訪問遠端的 MySQL 資料庫,而不需要修改伺服器上的防火牆設定。

什麼時候用端口轉發?

  1. 遠端調試應用程式:例如你開發的網站服務只在伺服器上運行,你可以用本地端口轉發,讓測試網站顯示在你自己的電腦瀏覽器上。
  2. 存取遠端內部資源:例如公司內部的資料庫、CRM 系統,只有內網才能訪問,但你在家辦公時仍然需要用到。
  3. 架設安全的代理服務:如果你需要一個安全的網路代理 (Proxy),你可以利用遠端端口轉發,將所有的網路流量經由 SSH 隧道加密,避免被監控。

常見 SSH 連線問題與解決方案:詳細指南

在使用 SSH (Secure Shell) 連接遠端伺服器時,可能會遇到連線失敗或無法使用金鑰驗證的情況。

這些問題通常與伺服器設定、防火牆規則或檔案權限有關。以下將針對這些常見問題提供詳細的解決方法,幫助你快速恢復 SSH 連線。

SSH 連線失敗:可能的原因與解決方法

1️⃣ 確認伺服器上的 SSH 服務是否正常運行

當你無法連接到伺服器時,首先要確認伺服器上的 SSH 服務 (sshd) 是否正常運行。可以透過以下指令查看 SSH 服務的狀態:

sudo systemctl status sshd
  • 運行中 (active):顯示 active (running),表示 SSH 服務正常運行。
  • 未啟動 (inactive)失敗 (failed):如果顯示 inactivefailed,可以使用以下指令重新啟動服務:
sudo systemctl start sshd     # 啟動 SSH 服務
sudo systemctl enable sshd    # 設定開機自動啟動

如果服務無法啟動,建議查看錯誤日誌,找到具體的錯誤原因:

sudo journalctl -u sshd -xe

日誌檔案中可能包含如 配置錯誤 (Configuration Error)端口衝突 (Port Conflict) 等具體錯誤資訊,有助於快速定位問題。

2️⃣ 確認伺服器防火牆設定

防火牆可能會阻擋 SSH 連線,特別是 SSH 預設使用的 22 端口 未開放時,會導致連線被拒絕。可以使用以下指令查看防火牆狀態:

sudo ufw status

如果防火牆沒有開放 SSH 連線,請執行以下指令:

sudo ufw allow 22/tcp
sudo ufw reload  # 重新加載防火牆規則

對於使用 iptables 的伺服器,允許 SSH 連接的指令如下:

sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo iptables-save > /etc/iptables/rules.v4  # 永久保存規則

這樣可以確保伺服器接受來自 22 端口 的 SSH 請求,避免防火牆阻擋連線。

3️⃣ 測試 SSH 端口是否開放

可以使用 TelnetNetcat (nc) 測試伺服器的 22 端口是否開放:

telnet 192.168.1.10 22
# 或
nc -zv 192.168.1.10 22
  • 如果顯示 Connected,表示伺服器的 22 端口正常開放。
  • 如果顯示 Connection refused,可能是防火牆或 SSH 服務問題,需要進一步排查。

無法使用金鑰驗證登入:深入排查與解決方法

SSH 金鑰驗證 (Public Key Authentication) 是比密碼驗證更安全的登入方式,但如果設定不當,可能導致無法登入伺服器。

1️⃣ 確認公鑰文件的權限設置是否正確

伺服器上的公鑰通常儲存在 ~/.ssh/authorized_keys 檔案中。如果這個檔案或 .ssh 目錄的權限設定不正確,SSH 服務可能會拒絕金鑰驗證。可以用以下指令設定正確的權限:

chmod 700 ~/.ssh                  # 設置 .ssh 目錄權限
chmod 600 ~/.ssh/authorized_keys  # 設置公鑰文件權限
  • 700 (drwx——).ssh 目錄的權限設置為「僅擁有者可讀、寫、執行」,其他用戶無法進入此目錄。
  • 600 (-rw——-)authorized_keys 文件僅允許擁有者讀寫,這樣可以確保 SSH 服務安全地讀取公鑰文件。

2️⃣ 檢查 SSH 服務設定檔 (sshd_config)

SSH 服務的設定檔通常位於 /etc/ssh/sshd_config 中,需要確保相關金鑰驗證選項已經正確設定:

sudo nano /etc/ssh/sshd_config

確認以下設定項目是否啟用:

PubkeyAuthentication yes              # 啟用金鑰驗證
AuthorizedKeysFile .ssh/authorized_keys  # 指定公鑰文件位置
PasswordAuthentication no             # (可選) 禁用密碼驗證,強制使用金鑰
  • PubkeyAuthentication yes:確保伺服器支援金鑰驗證。
  • AuthorizedKeysFile:確認伺服器從正確的路徑讀取公鑰。
  • PasswordAuthentication no:如果只允許金鑰登入,建議關閉密碼登入以提升安全性。

修改完成後,重新啟動 SSH 服務,讓新的設定生效:

sudo systemctl restart sshd

進階問題排查:查看 SSH 連線日誌

當無法登入伺服器時,查看伺服器上的 SSH 日誌是找出問題的好方法。

1️⃣ 查看 SSH 日誌

根據不同的 Linux 發行版,SSH 的日誌可能儲存在不同的位置:

sudo tail -f /var/log/auth.log  # 適用於 Debian/Ubuntu 系統
sudo tail -f /var/log/secure    # 適用於 CentOS/RHEL 系統
  • tail -f:實時查看日誌,當你嘗試連線時,日誌會顯示出伺服器的回應,幫助你了解錯誤的具體原因。
  • 例如:可能看到類似 Permission denied (publickey)Authentication refused 的訊息,這可以協助你鎖定問題是否出在金鑰驗證或是權限設定上。

結論

SSH 是一個功能強大且靈活的工具,對於任何需要安全連線或遠端操作的人來說都是必備技能。

無論你是剛入門的初學者,還是已經有一定經驗的技術人員,熟練掌握 SSH 都將大大提升你的工作效率與安全性。現在就動手試試看,透過 SSH 與你的伺服器安全連線吧!