SSH 是 Linux 系統最常用的遠端管理方式,但新手經常遇到 Connection refused、Permission denied、Port 22 阻擋、防火牆設定或 SSH Key 權限錯誤等問題。本文提供完整排錯步驟,包含實務案例與回應範例,並詳細解釋每個指令結果,讓新手能自行演練與理解 SSH 連線問題。
SSH 基本概念與連線流程
SSH(Secure Shell)是一種加密的遠端登入協定,通常透過 TCP Port 22 與伺服器建立安全連線。連線流程包含四個步驟:
1. Client 發起連線請求
2. Server 回應 SSH daemon
3. Client 驗證身份(密碼或 SSH Key)
4. 建立加密通道完成登入
若任何一環節失敗,將導致無法連線,常見錯誤包括 Connection refused、Permission denied、Timeout、No route to host 等。
SSH 連線排錯步驟與指令
可使用以下方式測試 SSH 連線問題,並查看回應以判斷問題原因:
| 測試方式 | 指令範例 | 備註 |
|---|---|---|
| 確認 SSH 服務狀態 | | 確認 sshd 是否啟動,未啟動會顯示 inactive |
| 檢查 Port 22 是否監聽 | | 顯示 sshd 是否監聽 0.0.0.0:22 |
| UFW 防火牆開放 SSH | | 檢查防火牆是否允許 Port 22 |
| firewalld 防火牆開放 SSH | | 更新 firewalld 規則後需 reload |
| 測試 Port 是否開啟 | | 回應 Connection refused 或成功可判斷是否可達 |
| 檢查 SSH Key 權限 | | 權限不正確會導致 Permission denied |
| 查看 SSH Log | | 可查看連線被拒原因,如密碼錯誤或 Fail2ban 封鎖 |
| 檢查 SELinux 狀態 | | 若 Enforcing,可能封鎖 SSH,必要時調整 policy |
| Client 端連線測試 | | 可查看連線流程與失敗原因 |
實務案例與終端回應範例
# 案例一:SSH 服務未啟動
systemctl status sshd
# 回應:
# ● sshd.service - OpenSSH server daemon
# Loaded: loaded (/lib/systemd/system/sshd.service; disabled)
# Active: inactive (dead)
# 解釋: sshd 沒有啟動,需 systemctl start sshd
# 案例二:Port 22 被防火牆阻擋
nc -zv server-ip 22
# 回應:
# nc: connect to server-ip port 22 (tcp) failed: Connection refused
# 解釋: 防火牆或服務未監聽,需開放防火牆或啟動 sshd
# 案例三:密碼或 SSH Key 驗證失敗
ssh user@server-ip
# 回應:
# Permission denied (publickey,password)
# 解釋: 密碼或 Key 錯誤,檢查帳號、密碼或 authorized_keys
# 案例四:SSH 設定檔錯誤
vim /etc/ssh/sshd_config
# 將 Port 改為非 22,未 restart sshd
ssh user@server-ip -p 22
# 回應:
# ssh: connect to host server-ip port 22: Connection refused
# 解釋: 設定檔改動需重新啟動 sshd
# 案例五:IP 被 Fail2ban 封鎖
fail2ban-client status sshd
# 回應:
# Status for the jail: sshd
# Banned IP list: your-ip
# 解釋: IP 被封鎖,需要解除封鎖或等待 timeout
FAQ 常見問題
SSH 出現 Connection refused 是什麼原因?
通常是 SSH 服務未啟動或 Port 22 被防火牆阻擋,使用 systemctl status sshd 或 nc -zv server-ip 22 可確認服務與網路狀態。
SSH 出現 Permission denied 怎麼辦?
身份驗證失敗,可能密碼或 SSH Key 錯誤,確認帳號正確,檢查 ~/.ssh/authorized_keys 與檔案權限。
SSH 連線很慢怎麼解決?
可在 /etc/ssh/sshd_config 關閉 DNS 解析:UseDNS no,避免延遲,也可確認網路穩定性。
SSH Key 權限不正確怎麼辦?
私鑰檔案權限需 chmod 600 ~/.ssh/id_rsa,否則 SSH 會拒絕連線,顯示 Permission denied。
SELinux 封鎖 SSH 如何處理?
使用 getenforce 查看狀態,若 Enforcing 可調整 policy 或暫時關閉,以允許 SSH 連線。
Fail2ban 封鎖 IP 怎麼解決?
查看 fail2ban-client status sshd,若 IP 在封鎖列表,可解除封鎖或等待 timeout,避免連線被拒。
