Ubuntu SSH 設定完全指南|安裝、安全性強化、故障排除

目次

1. 前言

在 Ubuntu 上設定 SSH 對於遠端管理伺服器來說至關重要。SSH(Secure Shell)是一種提供安全加密通信的協議,廣泛用於遠端存取伺服器、執行命令以及傳輸文件。

本篇文章將詳細介紹如何在 Ubuntu 上設定 SSH,從基本安裝步驟到進階的安全強化措施,幫助您建立安全可靠的 SSH 環境。

1.1 為什麼要在 Ubuntu 上設定 SSH?

1.1.1 什麼是 SSH?

SSH(Secure Shell)是一種用於在網路上進行安全通信的協議。通常,SSH 用於遠端登入伺服器、文件傳輸、通道轉發(Port Forwarding)等功能。與傳統的 Telnet 和 FTP 不同,SSH 透過加密技術來保護傳輸內容,提高安全性。

1.1.2 什麼時候需要在 Ubuntu 上使用 SSH?

以下是一些常見的遠端管理 Ubuntu 的使用場景:

  • 管理雲端伺服器:在 AWS、GCP、Vultr 等雲端服務上,通常需要使用 SSH 遠端連接伺服器。
  • 在區域網路(LAN)環境中遠端操作:使用 SSH 存取公司內部伺服器或開發機器,進行遠端作業。
  • 管理 IoT 設備:例如遠端控制 Raspberry Pi 等嵌入式設備。

在 Ubuntu 的預設設定中,SSH 伺服器是關閉的。因此,若要使用 SSH,必須手動安裝並進行適當的設定。

2. SSH 的基本設定

要在 Ubuntu 上使用 SSH,必須先安裝 SSH 伺服器(OpenSSH),並進行適當的設定。本節將詳細說明 SSH 的安裝方式、基本設定、防火牆(UFW)配置以及連線方法。

2.1 安裝與啟動 OpenSSH

2.1.1 什麼是 OpenSSH?

OpenSSH(Open Secure Shell)是一款實作 SSH 協議的開源軟體。它不僅提供遠端連接功能,還支援安全檔案傳輸(SCP 和 SFTP)以及通道轉發(Port Forwarding)等功能。

2.1.2 安裝 OpenSSH

由於 Ubuntu 預設不會安裝 SSH 伺服器,因此需要執行以下指令來安裝 OpenSSH。

sudo apt update && sudo apt install -y openssh-server

這個指令會先更新軟體包列表,然後安裝 OpenSSH 伺服器。

2.1.3 啟動 SSH 伺服器並設為開機自動啟動

安裝完成後,執行以下指令來啟動 SSH 伺服器,並設定為開機自動啟動:

sudo systemctl enable --now ssh

其中,enable 參數用於確保系統重新啟動後,SSH 服務會自動啟動。

2.1.4 檢查 SSH 是否正常運作

要確認 SSH 伺服器是否正在運作,可以執行以下指令:

systemctl status ssh

如果顯示以下類似的輸出,表示 SSH 伺服器正在正常運作:

● ssh.service - OpenBSD Secure Shell server
   Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
   Active: active (running) since Fri 2025-02-28 12:00:00 UTC; 5min ago

如果顯示 inactive (dead)failed,可以手動啟動 SSH 服務:

sudo systemctl start ssh

2.2 設定防火牆(UFW)

Ubuntu 預設使用 ufw(Uncomplicated Firewall)作為防火牆,為了允許 SSH 連線,需要進行適當的設定。

2.2.1 檢查 UFW 的狀態

首先,確認防火牆的狀態:

sudo ufw status

如果 UFW 尚未啟用,則輸出如下:

Status: inactive

如果 UFW 已啟用,則輸出類似如下:

Status: active
To                         Action      From
--                         ------      ----
22/tcp                     ALLOW       Anywhere

2.2.2 允許 SSH 連線

允許 SSH 預設使用的 22 號連接埠:

sudo ufw allow ssh

或明確指定連接埠:

sudo ufw allow 22/tcp

2.2.3 啟用 UFW

如果 UFW 尚未啟用,可以使用以下指令啟用:

sudo ufw enable

⚠️ 請注意: 啟用防火牆後,所有未明確允許的連線都將被封鎖,因此請務必先確認 SSH 連線已被允許!

2.2.4 確認防火牆設定

再次確認 UFW 設定是否正確:

sudo ufw status verbose

預期輸出:

Status: active
To                         Action      From
--                         ------      ----
22/tcp                     ALLOW       Anywhere
22/tcp (v6)                ALLOW       Anywhere (v6)

2.3 SSH 的基本連線方式

確認 SSH 伺服器正常運作後,可以嘗試從客戶端電腦進行 SSH 連線。

2.3.1 從 Linux/macOS 連線

在 Linux 或 macOS 上,打開終端機並輸入以下指令:

ssh 使用者名稱@伺服器的IP位址

範例:

ssh user@192.168.1.100

首次連線時,可能會看到類似以下的警告訊息:

The authenticity of host '192.168.1.100 (192.168.1.100)' can't be established.
ECDSA key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.
Are you sure you want to continue connecting (yes/no)?

輸入 yes 並按下 Enter 鍵,即可完成連線。

2.3.2 從 Windows 連線

在 Windows 上,可以使用 PowerShellPuTTY 來進行 SSH 連線。

使用 PowerShell
Windows 10 及更新版本內建 SSH 客戶端,直接執行以下指令即可連線:

ssh 使用者名稱@伺服器的IP位址

使用 PuTTY

  1. 官方網站 下載並安裝 PuTTY
  2. 開啟 PuTTY,並在 Host Name (or IP address) 欄位輸入伺服器的 IP 位址
  3. Connection type 中選擇 SSH,然後點擊 Open
  4. 輸入使用者名稱與密碼,即可連線

3. 強化 SSH 的安全性

SSH 是一個非常方便的遠端連線工具,但如果不加以保護,可能會成為駭客攻擊的目標。例如,攻擊者可能會使用暴力破解(Brute Force Attack)或連接埠掃描(Port Scanning)來試圖入侵您的伺服器。因此,為了確保 SSH 連線的安全性,建議進行以下的安全設定。

3.1 禁止 root 使用者登入

預設情況下,Ubuntu 允許 root 使用者透過 SSH 登入,但 root 擁有最高的管理權限,容易成為攻擊目標。因此,建議禁止 root 直接登入,並使用普通使用者帳號進行管理。

3.1.1 設定方法

  1. 開啟 SSH 設定檔:
sudo nano /etc/ssh/sshd_config
  1. 找到以下這一行,並將 PermitRootLogin 設為 no
PermitRootLogin no
  1. 儲存檔案後,重新啟動 SSH 服務:
sudo systemctl restart ssh
  1. 確認設定是否生效:
sudo grep PermitRootLogin /etc/ssh/sshd_config

如果輸出為 PermitRootLogin no,表示設定已成功生效。

3.2 停用密碼登入,改用公私鑰驗證

SSH 支援 密碼驗證公私鑰驗證。密碼驗證容易受到暴力破解攻擊,而公私鑰驗證則更加安全。建議關閉密碼驗證,改用公私鑰方式進行 SSH 登入。

3.2.1 產生 SSH 金鑰

在本機電腦(客戶端)上,執行以下指令來建立 SSH 金鑰:

ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa

這將會產生兩個檔案:

  • 私鑰(id_rsa → 儲存在本機電腦(請勿洩漏)。
  • 公鑰(id_rsa.pub → 需上傳至伺服器。

3.2.2 傳送公鑰至伺服器

執行以下指令,將公鑰上傳到伺服器:

ssh-copy-id 使用者名稱@伺服器的IP位址

如果 ssh-copy-id 指令無法使用,可以手動將公鑰複製到伺服器:

cat ~/.ssh/id_rsa.pub | ssh 使用者名稱@伺服器的IP位址 "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys"

3.2.3 停用密碼登入

編輯 SSH 設定檔:

sudo nano /etc/ssh/sshd_config

找到以下這一行,將 PasswordAuthentication 設為 no

PasswordAuthentication no

儲存檔案後,重新啟動 SSH 服務:

sudo systemctl restart ssh

3.3 限制 SSH 存取的使用者

如果伺服器上有多個使用者帳戶,建議只允許特定的使用者存取 SSH,以提升安全性。

3.3.1 設定方法

  1. 編輯 SSH 設定檔:
sudo nano /etc/ssh/sshd_config
  1. 新增以下行,僅允許指定的使用者登入 SSH(請將 user1user2 替換為實際使用者名稱):
AllowUsers user1 user2
  1. 儲存檔案後,重新啟動 SSH 服務:
sudo systemctl restart ssh

3.4 變更 SSH 連接埠

SSH 預設使用 22 號連接埠,但這也是攻擊者最常掃描的連接埠。為了減少攻擊風險,可以修改 SSH 連接埠號碼。

3.4.1 修改連接埠

  1. 編輯 SSH 設定檔:
sudo nano /etc/ssh/sshd_config
  1. 找到以下行,將 22 修改為其他連接埠號,例如 2200
Port 2200
  1. 儲存檔案後,重新啟動 SSH 服務:
sudo systemctl restart ssh

3.4.2 更新防火牆設定

如果變更了 SSH 連接埠,請確保防火牆允許新的連接埠號:

sudo ufw allow 2200/tcp

然後確認防火牆狀態:

sudo ufw status

3.5 使用 Fail2Ban 防止暴力破解攻擊

Fail2Ban 是一款能夠自動偵測並封鎖 SSH 惡意登入嘗試的工具。

3.5.1 安裝 Fail2Ban

sudo apt install fail2ban -y

3.5.2 設定 Fail2Ban

sudo nano /etc/fail2ban/jail.local

新增以下內容:

[sshd]
enabled = true
port = 2200
maxretry = 3
findtime = 600
bantime = 3600

3.5.3 啟動 Fail2Ban

sudo systemctl restart fail2ban

4. 進階 SSH 設定

當 SSH 的基本設定與安全性強化完成後,您還可以進一步調整 SSH 的設定,以提升便利性與安全性。本節將介紹 Ubuntu 22.10 之後的 ssh.socket 管理、SSH 通道轉發(Port Forwarding)、多連接埠監聽,以及限制特定 IP 連線等進階設定。

4.1 使用 ssh.socket 管理 SSH(適用於 Ubuntu 22.10 及更新版本)

在 Ubuntu 22.10 及更新版本中,SSH 伺服器的管理從 ssh.service 變更為 ssh.socket。這種機制允許 SSH 在收到連線請求時才啟動,以節省系統資源。

4.1.1 檢查 ssh.socket 的狀態

執行以下指令檢查 ssh.socket 是否已啟用:

sudo systemctl status ssh.socket

如果顯示如下,表示 ssh.socket 已啟用:

● ssh.socket - OpenSSH Server Socket
   Loaded: loaded (/lib/systemd/system/ssh.socket; enabled; vendor preset: enabled)
   Active: active (listening) since Fri 2025-02-28 12:00:00 UTC

4.1.2 啟用或停用 ssh.socket

如果 ssh.socket 未啟用,請使用以下指令啟用:

sudo systemctl enable --now ssh.socket

如果想要回到傳統的 ssh.service,可以停用 ssh.socket,然後啟用 ssh.service

sudo systemctl disable --now ssh.socket
sudo systemctl enable --now ssh.service

4.2 SSH 通道轉發(Port Forwarding)

SSH 通道轉發允許您透過 SSH 加密通訊,安全地存取內部網路服務或在遠端伺服器上建立代理(Proxy)。

4.2.1 本地端口轉發(Local Port Forwarding)

如果您想透過 SSH 連線到遠端伺服器,並安全地存取該伺服器內的服務,可以使用本地端口轉發。例如:

ssh -L 3306:localhost:3306 user@server-ip

這個指令會將本地端的 3306 端口(MySQL)映射到遠端伺服器的 3306 端口,使得本機應用程式可以安全地存取遠端資料庫。

4.2.2 遠端端口轉發(Remote Port Forwarding)

遠端端口轉發允許您將本機服務映射到遠端伺服器,供外部存取。例如:

ssh -R 8080:localhost:80 user@server-ip

這個指令會將遠端伺服器的 8080 端口映射到本機 80 端口,使遠端使用者可以透過伺服器的 8080 端口存取您的本機 Web 服務。

4.2.3 動態端口轉發(Dynamic Port Forwarding)

動態端口轉發可將 SSH 用作 SOCKS 代理,允許匿名存取網路資源。例如:

ssh -D 1080 user@server-ip

這樣,所有透過本機 1080 端口的流量都將被加密並經由 SSH 伺服器轉發。

4.3 監聽多個 SSH 端口

預設情況下,SSH 只會監聽一個端口(通常是 22)。但您可以設定 SSH 同時監聽多個端口,以適應不同的網路環境。

4.3.1 設定多端口監聽

  1. 編輯 SSH 設定檔:
sudo nano /etc/ssh/sshd_config
  1. 找到 Port 22,並新增另一個端口,例如 2200
Port 22
Port 2200
  1. 儲存檔案後,重新啟動 SSH 服務:
sudo systemctl restart ssh

4.3.2 設定防火牆

確保新的 SSH 端口已開放:

sudo ufw allow 2200/tcp

然後檢查防火牆設定:

sudo ufw status

4.4 限制 SSH 連線來源 IP

為了提升 SSH 的安全性,可以限制 SSH 連線只允許來自特定 IP 地址的存取。

4.4.1 使用 /etc/hosts.allow 設定允許的 IP

編輯 /etc/hosts.allow,並新增以下內容:

sshd: 192.168.1.100

這樣就只允許 IP 為 192.168.1.100 的設備透過 SSH 連線。

4.4.2 使用 /etc/hosts.deny 阻擋所有其他 IP

編輯 /etc/hosts.deny,新增以下內容:

sshd: ALL

這樣可以確保所有未在 /etc/hosts.allow 中列出的 IP 均無法連線。

總結

本節介紹了 SSH 的進階設定,包括:

  • Ubuntu 22.10 之後的 ssh.socket 管理方式
  • SSH 通道轉發(Port Forwarding)
  • 設定 SSH 監聽多個端口
  • 限制 SSH 連線來源 IP

透過這些進階設定,您可以進一步強化 SSH 伺服器的安全性,並提升使用上的靈活性。

5. SSH 疑難排解(Troubleshooting)

即使 SSH 設定正確,有時仍可能發生無法連線的問題。本節將介紹 SSH 連線時常見的錯誤及其解決方法,以幫助您快速排除問題。

5.1 無法連線到 SSH

當您嘗試使用 SSH 連線伺服器時,如果遇到 Connection refused超時 錯誤,可能有以下幾種原因。

5.1.1 SSH 服務未啟動

首先,檢查 SSH 服務是否正在運作:

sudo systemctl status ssh

解決方案:

  • 如果狀態顯示 inactive (dead)failed,請執行以下指令啟動 SSH 服務:
sudo systemctl start ssh
  • 為確保 SSH 服務在開機時自動啟動,可以執行:
sudo systemctl enable ssh

5.1.2 連接埠未開啟或被防火牆阻擋

如果 SSH 連接埠已更改,請確保您使用的是正確的連接埠:

ssh -p 2200 user@server-ip

確認 SSH 伺服器正在監聽適當的連接埠:

sudo netstat -tulnp | grep ssh

或者使用:

ss -tulnp | grep ssh

5.1.3 檢查防火牆(UFW)設定

確認 UFW 是否允許 SSH 連線:

sudo ufw status

如果 SSH 未被允許,請執行:

sudo ufw allow 22/tcp

若 SSH 連接埠已變更,請使用新的連接埠號碼:

sudo ufw allow 2200/tcp

5.2 認證錯誤(Authentication Failure)

如果 SSH 顯示「Permission denied」或無法登入,可能是因為帳戶密碼錯誤或公私鑰設定有誤。

5.2.1 使用者名稱或密碼錯誤

確認您輸入的 SSH 使用者名稱是正確的:

ssh user@server-ip

5.2.2 公私鑰驗證設定錯誤

如果使用 SSH 金鑰登入,請確認伺服器上的 ~/.ssh/authorized_keys 包含正確的公鑰:

cat ~/.ssh/authorized_keys

並確保與本機 ~/.ssh/id_rsa.pub 一致。

5.2.3 設定檔權限不正確

SSH 會檢查 .ssh 目錄的權限,若設定不正確,可能會導致無法登入。

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

同時,檢查 /home/使用者名稱 的目錄權限是否正確:

chmod 755 /home/使用者名稱

5.3 SSH 連線不穩定或頻繁斷線

如果 SSH 連線經常中斷,可能與伺服器的連線超時設定有關。

5.3.1 調整 ClientAliveInterval 設定

編輯 SSH 設定檔 /etc/ssh/sshd_config,新增或修改以下參數:

ClientAliveInterval 60
ClientAliveCountMax 3

然後重新啟動 SSH:

sudo systemctl restart ssh

5.3.2 調整客戶端 SSH 設定

如果 SSH 仍然頻繁斷線,可以在本機 ~/.ssh/config 中新增以下設定:

Host *
    ServerAliveInterval 60
    ServerAliveCountMax 3

5.4 查看 SSH 日誌記錄

當 SSH 連線發生問題時,檢查日誌記錄可以幫助找出問題所在。

5.4.1 即時監控 SSH 日誌

執行以下指令即時監控 SSH 相關日誌:

sudo journalctl -u ssh -f

5.4.2 檢查過去的 SSH 日誌

如果想要檢視過去的 SSH 連線記錄,可以使用以下指令:

sudo cat /var/log/auth.log | grep ssh

若想要篩選出所有 SSH 失敗的登入嘗試,則可以使用:

sudo grep "Failed password" /var/log/auth.log

總結

本節介紹了 SSH 連線時的常見問題與解決方法:

  • 確認 SSH 服務是否啟動
  • 檢查防火牆與連接埠設定
  • 處理 SSH 認證失敗問題
  • 解決 SSH 連線超時與頻繁斷線
  • 使用日誌記錄來診斷 SSH 問題

SSH 連線問題通常與設定錯誤或網路環境有關,透過上述的疑難排解步驟,可以快速找出並解決 SSH 連線問題。

6. FAQ(常見問題)

本節整理了一些關於 SSH 設定與使用的常見問題,提供解決方法與最佳實踐,幫助您更安全、更高效地使用 SSH。

6.1 SSH 連線經常超時該怎麼辦?

SSH 連線若在短時間內自動斷開,可能是因為伺服器或客戶端的超時設定。

6.1.1 伺服器端設定調整

修改 /etc/ssh/sshd_config,調整以下參數:

ClientAliveInterval 60
ClientAliveCountMax 3

然後重新啟動 SSH 服務:

sudo systemctl restart ssh

6.1.2 客戶端設定調整

在本機 ~/.ssh/config 檔案中新增:

Host *
    ServerAliveInterval 60
    ServerAliveCountMax 3

6.2 如果忘記 SSH 密碼,該如何重設?

6.2.1 伺服器具有物理存取權限時

  1. 重啟伺服器並進入 recovery mode(恢復模式)。
  2. 選擇「Root Shell」,然後執行以下指令來重設密碼:
passwd 使用者名稱
  1. 輸入新密碼後重新啟動伺服器。

6.2.2 無法存取伺服器(例如 VPS)

  • 使用 VPS 提供的 Web 控制台來登入並變更密碼。
  • 如果已啟用公私鑰驗證,可以透過 SSH 金鑰登入並變更密碼。

6.3 如何在 Windows 上使用 SSH?

6.3.1 使用 PowerShell

Windows 10 及更新版本內建 SSH 客戶端,直接執行以下指令即可連線:

ssh 使用者名稱@伺服器的IP位址

6.3.2 使用 PuTTY

  1. PuTTY 官方網站 下載並安裝 PuTTY。
  2. 開啟 PuTTY,輸入伺服器 IP 並選擇 SSH 連線類型。
  3. 點擊「Open」並輸入帳號密碼即可連線。

6.4 如何在 WSL(Windows Subsystem for Linux)上設定 SSH 伺服器?

6.4.1 安裝 SSH 伺服器

在 WSL 環境中執行以下指令安裝 OpenSSH 伺服器:

sudo apt update && sudo apt install openssh-server

6.4.2 啟動 SSH 伺服器

由於 WSL 預設不使用 systemd,需要手動啟動 SSH 服務:

sudo service ssh start

6.5 SSH 設定完成後,還需要做哪些安全強化措施?

6.5.1 啟用 Fail2Ban 防暴力破解

安裝並設定 Fail2Ban 來防止 SSH 暴力破解攻擊:

sudo apt install fail2ban -y
sudo nano /etc/fail2ban/jail.local

新增以下設定:

[sshd]
enabled = true
port = 22
maxretry = 3
findtime = 600
bantime = 3600

儲存後重新啟動 Fail2Ban:

sudo systemctl restart fail2ban

6.6 如何查看 SSH 連線日誌?

要即時查看 SSH 日誌,可執行:

sudo journalctl -u ssh -f

若要檢視過去的 SSH 連線記錄:

sudo cat /var/log/auth.log | grep ssh

6.7 如何讓 SSH 更加方便使用?

6.7.1 設定 .ssh/config 簡化登入

在本機 ~/.ssh/config 新增設定,簡化 SSH 連線:

Host myserver
    HostName 192.168.1.100
    User user
    Port 2200
    IdentityFile ~/.ssh/id_rsa

這樣之後只需執行 ssh myserver 即可連線。

6.7.2 使用 ssh-agent 快速登入

使用 ssh-agent 可省略輸入私鑰密碼:

eval $(ssh-agent -s)
ssh-add ~/.ssh/id_rsa

總結

本節整理了一些 SSH 的常見問題與最佳實踐,包括:

  • 如何解決 SSH 連線超時問題
  • 忘記 SSH 密碼時的解決方案
  • 如何在 Windows 和 WSL 上使用 SSH
  • SSH 伺服器的額外安全強化措施
  • 如何查詢 SSH 日誌
  • 提升 SSH 連線的便利性

透過這些技巧,您可以讓 SSH 連線更安全、更方便,提升遠端管理的效率。

相關文章

侍エンジニア塾