- 1 1. 前言
- 2 2. SSH 的基本設定
- 3 3. 強化 SSH 的安全性
- 4 4. 進階 SSH 設定
- 5 總結
- 6 5. SSH 疑難排解(Troubleshooting)
- 7 總結
- 8 6. FAQ(常見問題)
- 9 總結
- 10 相關文章
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 上,可以使用 PowerShell 或 PuTTY 來進行 SSH 連線。
使用 PowerShell
Windows 10 及更新版本內建 SSH 客戶端,直接執行以下指令即可連線:
ssh 使用者名稱@伺服器的IP位址
使用 PuTTY
- 從 官方網站 下載並安裝 PuTTY
- 開啟 PuTTY,並在
Host Name (or IP address)
欄位輸入伺服器的 IP 位址 - 在
Connection type
中選擇SSH
,然後點擊Open
- 輸入使用者名稱與密碼,即可連線
3. 強化 SSH 的安全性
SSH 是一個非常方便的遠端連線工具,但如果不加以保護,可能會成為駭客攻擊的目標。例如,攻擊者可能會使用暴力破解(Brute Force Attack)或連接埠掃描(Port Scanning)來試圖入侵您的伺服器。因此,為了確保 SSH 連線的安全性,建議進行以下的安全設定。
3.1 禁止 root 使用者登入
預設情況下,Ubuntu 允許 root 使用者透過 SSH 登入,但 root 擁有最高的管理權限,容易成為攻擊目標。因此,建議禁止 root 直接登入,並使用普通使用者帳號進行管理。
3.1.1 設定方法
- 開啟 SSH 設定檔:
sudo nano /etc/ssh/sshd_config
- 找到以下這一行,並將
PermitRootLogin
設為no
:
PermitRootLogin no
- 儲存檔案後,重新啟動 SSH 服務:
sudo systemctl restart ssh
- 確認設定是否生效:
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 設定方法
- 編輯 SSH 設定檔:
sudo nano /etc/ssh/sshd_config
- 新增以下行,僅允許指定的使用者登入 SSH(請將
user1
、user2
替換為實際使用者名稱):
AllowUsers user1 user2
- 儲存檔案後,重新啟動 SSH 服務:
sudo systemctl restart ssh
3.4 變更 SSH 連接埠
SSH 預設使用 22 號連接埠,但這也是攻擊者最常掃描的連接埠。為了減少攻擊風險,可以修改 SSH 連接埠號碼。
3.4.1 修改連接埠
- 編輯 SSH 設定檔:
sudo nano /etc/ssh/sshd_config
- 找到以下行,將
22
修改為其他連接埠號,例如2200
:
Port 2200
- 儲存檔案後,重新啟動 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 設定多端口監聽
- 編輯 SSH 設定檔:
sudo nano /etc/ssh/sshd_config
- 找到
Port 22
,並新增另一個端口,例如2200
:
Port 22
Port 2200
- 儲存檔案後,重新啟動 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 伺服器具有物理存取權限時
- 重啟伺服器並進入
recovery mode
(恢復模式)。 - 選擇「Root Shell」,然後執行以下指令來重設密碼:
passwd 使用者名稱
- 輸入新密碼後重新啟動伺服器。
6.2.2 無法存取伺服器(例如 VPS)
- 使用 VPS 提供的 Web 控制台來登入並變更密碼。
- 如果已啟用公私鑰驗證,可以透過 SSH 金鑰登入並變更密碼。
6.3 如何在 Windows 上使用 SSH?
6.3.1 使用 PowerShell
Windows 10 及更新版本內建 SSH 客戶端,直接執行以下指令即可連線:
ssh 使用者名稱@伺服器的IP位址
6.3.2 使用 PuTTY
- 從 PuTTY 官方網站 下載並安裝 PuTTY。
- 開啟 PuTTY,輸入伺服器 IP 並選擇
SSH
連線類型。 - 點擊「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 連線更安全、更方便,提升遠端管理的效率。