SSH 連線排錯是 Linux Server 維運中非常常見的工作。 當你從 Windows、macOS 或另一台 Linux 電腦連線到 Ubuntu Server 時,可能會遇到 Connection refused、Connection timed out、Permission denied、No route to host 等錯誤。
不同 SSH 錯誤代表的問題層級並不相同。例如 Connection refused 通常要先檢查目標 Port 與 SSH 服務;Permission denied 則應把重點放在帳號、SSH Key 與身份驗證。 如果能按照固定流程排查,就不需要一直修改 SSH 設定或直接重裝 OpenSSH。
網路可達性 → TCP Port → SSH Server → Firewall → SSH 設定 → 帳號 → SSH Key → Fail2ban → Server Log
SSH 是什麼?常見錯誤有哪些?
SSH(Secure Shell)是一套用於遠端管理與安全資料傳輸的工具與協定。
Ubuntu 使用 OpenSSH 作為常見的 SSH 實作,OpenSSH Server 的 daemon 是 sshd。
它負責接受 Client 的 SSH 連線,完成主機金鑰、加密協商與使用者身份驗證。([Ubuntu 官方文件](https://ubuntu.com/server/docs/how-to/security/openssh-server/))
| 錯誤訊息 | 常見原因 | 優先檢查 |
|---|---|---|
| Connection refused | 目標 Port 沒有服務接受連線,或主機端主動拒絕 | SSH Service、監聽 Port、Firewall |
| Connection timed out | 封包可能遭到 Firewall、路由或上游設備丟棄 | 網路、路由、Firewall、VPN |
| No route to host | 路由或網路配置異常 | IP、Gateway、Route |
| Permission denied | 使用者身份驗證失敗 | 帳號、密碼、SSH Key |
| Host key verification failed | Client 儲存的 Server Host Key 與目前不一致 | known_hosts |
第一步:確認網路與 SSH Port
確認伺服器是否可達
ping 192.168.1.100
Ping 只能作為輔助測試。即使 Ping 不通,也不代表 SSH 一定無法使用,因為 ICMP 可能被 Firewall 封鎖。
測試 TCP Port 22
nc -zv 192.168.1.100 22
如果 SSH 使用其他 Port,例如 2222:
nc -zv 192.168.1.100 2222
也可以直接使用 SSH:
ssh user1@192.168.1.100
指定 Port:
ssh -p 2222 user1@192.168.1.100
使用 verbose 模式查看連線過程
ssh -v user1@192.168.1.100
如果資訊仍然不足,可以使用:
ssh -vvv user1@192.168.1.100
-vvv 可以提供更詳細的除錯資訊,協助判斷問題發生在 DNS、TCP、SSH 握手、Host Key 或身份驗證階段。
第二步:確認 Ubuntu SSH Server
如果可以透過 KVM、Console、虛擬機器主控台或其他方式登入 Ubuntu Server,先確認 OpenSSH Server 是否正常執行。
確認 SSH 服務
sudo systemctl status ssh
在 Ubuntu 上,OpenSSH Server 主要由 ssh.service 管理,可以使用
systemctl 查看、啟動或重新啟動 SSH 服務。Ubuntu 官方目前的 OpenSSH Server 文件也使用
ssh.service 進行服務管理。
sudo systemctl start ssh
sudo systemctl restart ssh
sudo systemctl enable ssh
Ubuntu 26.04 另外提供 sshd.service 作為 ssh.service 的 alias,
因此在 Ubuntu 26.04 中兩種名稱都可以使用;本文為了保持一致,統一使用 ssh.service。
參考: Ubuntu OpenSSH Server 官方文件
啟動 SSH Server
sudo systemctl start ssh
設定開機自動啟動
sudo systemctl enable ssh
確認 SSH 是否監聽 Port
sudo ss -lntp | grep ':22'
如果沒有任何輸出,代表目前沒有看到程序監聽 TCP 22 Port。 此時需要繼續確認 SSH 設定與服務狀態。
確認實際 SSH Port
sudo sshd -T | grep '^port '
如果結果是:
port 22
表示 sshd 實際使用 Port 22。
如果是 2222,Client 就必須使用 -p 2222 連線。
第三步:檢查 UFW 防火牆
Ubuntu 常用 UFW 管理主機 Firewall。 如果 SSH Server 正常監聽,但從外部仍無法連線,就應檢查 UFW 是否允許目前使用的 SSH Port。Ubuntu 官方文件也提供 UFW 的 Firewall 設定方式。([Ubuntu 官方文件](https://ubuntu.com/server/docs/security-firewall/))
查看 UFW 狀態
sudo ufw status numbered
允許 SSH Port 22
sudo ufw allow 22/tcp
也可以使用服務名稱:
sudo ufw allow ssh
如果 SSH 使用 Port 2222
sudo ufw allow 2222/tcp
只允許特定管理網段
如果只有內部管理網段需要 SSH,可以進一步限制來源:
sudo ufw allow proto tcp from 192.168.1.0/24 to any port 22
實際網段請依你的網路環境修改。
第四步:檢查 SSH 設定檔
Ubuntu 的 OpenSSH Server 設定主要位於:
/etc/ssh/sshd_config
同時可以使用:
/etc/ssh/sshd_config.d/
放置模組化設定。 Ubuntu 官方特別提醒,OpenSSH 的設定讀取順序會影響最後實際採用的值,因此排查時不能只看主設定檔。([Ubuntu 官方文件](https://ubuntu.com/server/docs/how-to/security/openssh-server/))
編輯設定
sudo nano /etc/ssh/sshd_config
常見 SSH 設定
Port 22
PermitRootLogin no
AllowUsers user1
如果要停用密碼登入:
PasswordAuthentication no
但是只有在確認 SSH Key 已經可以正常登入後,再停用密碼驗證。
修改設定後一定先測試
sudo sshd -t
如果沒有錯誤輸出,再套用新設定:
sudo systemctl restart ssh.service
Ubuntu 官方明確建議修改 SSH 設定後先使用 sshd -t 驗證,再重新啟動 SSH Server。([Ubuntu 官方文件](https://ubuntu.com/server/docs/how-to/security/openssh-server/))
Permission denied 與 SSH Key 排錯
常見錯誤
Permission denied (publickey)
這通常代表 TCP 與 SSH Server 已經可以到達,但身份驗證階段失敗。
確認帳號
ssh user1@192.168.1.100
先確認登入帳號是否正確。 不要誤把 Client 本機帳號、Server 一般使用者與 root 帳號混在一起。
建立 Ed25519 SSH Key
ssh-keygen -t ed25519
建立後,可以使用:
ssh-copy-id user1@192.168.1.100
或手動將公開金鑰內容加入 Server:
~/.ssh/authorized_keys
檢查 Server 的 SSH Key 權限
ls -ld ~/.ssh
ls -l ~/.ssh/authorized_keys
如果權限不正確,可以依一般設定修正:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
同時確認檔案擁有者是正確的 Server 使用者。
檢查 Client 私鑰
例如使用:
~/.ssh/id_ed25519
Linux 或 macOS Client 可以設定:
chmod 600 ~/.ssh/id_ed25519
如果出現:
WARNING: UNPROTECTED PRIVATE KEY FILE!
通常表示私鑰權限過於寬鬆,需要先修正檔案權限。
指定 SSH 私鑰
ssh -i ~/.ssh/id_ed25519 user1@192.168.1.100
當一台 Client 管理多台 Server 時,建議另外建立 ~/.ssh/config,將不同主機與對應 Key 設定清楚。
Fail2ban 封鎖排查
如果伺服器使用 Fail2ban,短時間內出現大量失敗登入可能觸發封鎖。 這時即使帳號、密碼或 SSH Key 本身正確,也可能暫時無法連線。
查看 Fail2ban
sudo fail2ban-client status
查看 SSH Jail
sudo fail2ban-client status sshd
實際 Jail 名稱要以你的系統輸出為準,不一定每台 Server 都叫 sshd。
解除指定 IP
sudo fail2ban-client set sshd unbanip 192.168.1.50
解除前應先確認該 IP 是否確實是可信任的管理來源。
使用 Log 與 ssh -vvv 進行詳細排錯
Ubuntu 查看 SSH Log
sudo journalctl -u ssh.service -n 100 --no-pager
即時監看:
sudo journalctl -fu ssh.service
部分 Ubuntu 環境也會將驗證相關訊息寫入:
sudo tail -f /var/log/auth.log
Client 端詳細除錯
ssh -vvv user1@192.168.1.100
你可以從輸出的最後幾段判斷問題發生在哪個階段。
| 看到的訊息 | 可能方向 |
|---|---|
| Connecting to… | 開始建立 TCP 連線 |
| Connection refused | 服務或 Port 相關問題 |
| Connection timed out | 網路或 Firewall |
| Offering public key | 正在嘗試使用 SSH Key |
| Permission denied | 身份驗證失敗 |
查看 SSH 最終設定
sudo sshd -T | less
這個方法很適合排查主設定檔與 sshd_config.d 多個檔案共同作用後的實際結果。
五個常見 SSH 實務案例
案例一:Connection refused
ssh user1@192.168.1.100
ssh: connect to host 192.168.1.100 port 22:
Connection refused
先到 Server 執行:
sudo systemctl status ssh
sudo ss -lntp | grep ':22'
sudo ufw status
依序確認 SSH 是否啟動、Port 是否正在監聽,以及主機 Firewall 是否允許。
案例二:Connection timed out
ssh: connect to host 192.168.1.100 port 22:
Connection timed out
此時應優先檢查:
- Server 是否在線
- 路由是否正常
- UFW 或其他 Firewall
- 雲端 Security Group
- VPN、NAT 或上游網路設備
案例三:Permission denied
Permission denied (publickey)
此時通常已經進入 SSH 身份驗證階段。 建議檢查:
ls -ld ~/.ssh
ls -l ~/.ssh/authorized_keys
ssh -vvv user1@192.168.1.100
同時查看 Server 的 SSH Log,確認是帳號、Key 還是權限問題。
案例四:修改 SSH Port 後無法登入
假設把:
Port 22
改成:
Port 2222
除了 SSH 設定,還必須同步確認 Firewall:
sudo ufw allow 2222/tcp
接著:
sudo sshd -t
sudo systemctl restart ssh.service
Client 使用:
ssh -p 2222 user1@192.168.1.100
案例五:Fail2ban 封鎖管理 IP
sudo fail2ban-client status sshd
確認管理 IP 是否被封鎖,再決定是否需要解除封鎖。 如果最近短時間內反覆輸入錯誤密碼,也應先確認為什麼觸發封鎖。
SSH 安全設定建議
完成基本 SSH 連線後,可以再進行安全強化。
1. 不使用 root 直接登入
PermitRootLogin no
建議使用一般帳號登入,再透過 sudo 執行管理工作。
2. 使用 SSH Key
ssh-keygen -t ed25519
SSH Key 可以作為主要身份驗證方式,再搭配適當的帳號與 Firewall 控制。
3. 限制 SSH 使用者
AllowUsers user1
只允許實際需要遠端登入的帳號。
4. 限制 SSH 來源
sudo ufw allow proto tcp from 192.168.1.0/24 to any port 22
如果 SSH 只需要從特定管理網段使用,限制來源通常比單純修改 Port 更有實際意義。
5. 修改 SSH Port 不是主要安全措施
把 Port 22 改成其他數字,可以減少部分自動化掃描與雜訊,但不能取代 SSH Key、Firewall、帳號權限與系統更新。
6. 修改 SSH 設定前先備份
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup
修改完成後:
sudo sshd -t
確認沒有語法錯誤後,再重新載入或重新啟動服務。 Ubuntu 官方也建議在修改 OpenSSH 設定後先驗證設定,因為設定錯誤可能導致 SSH Server 無法啟動。([Ubuntu 官方文件](https://ubuntu.com/server/docs/how-to/security/openssh-server/))
FAQ 常見問題
SSH 出現 Connection refused 是什麼原因?
通常代表目標主機可以到達,但指定的 TCP Port 沒有正常接受連線,常見原因包括 SSH 服務沒有啟動、Port 設定不同,或主機端 Firewall 主動拒絕。可以先檢查 systemctl status ssh 與 ss -lntp。
SSH 出現 Connection timed out 怎麼辦?
先檢查網路、路由、VPN、Firewall、NAT、雲端 Security Group 或其他中間網路設備。Timeout 與 Connection refused 的排查方向不同。
SSH 出現 Permission denied 怎麼辦?
確認使用者名稱與身份驗證方式,再檢查 SSH Key、authorized_keys、檔案權限及 Server SSH Log。
Ubuntu 使用 ssh 還是 sshd?
Ubuntu 的 OpenSSH Server daemon 是 sshd,而 Ubuntu 官方目前使用 ssh.service 作為服務管理名稱。Ubuntu 26.04 也提供 sshd.service 作為 ssh.service 的 alias,因此兩者都能使用;本文統一使用 ssh.service。([Ubuntu 官方文件](https://ubuntu.com/server/docs/how-to/security/openssh-server/)) ([Ubuntu 26.04 Release Notes](https://documentation.ubuntu.com/release-notes/26.04/summary-for-lts-users/))
修改 sshd_config 後可以直接 restart 嗎?
不建議。應先執行 sudo sshd -t 確認設定沒有語法錯誤,再重新啟動或載入 SSH。遠端操作時也應保留目前的 SSH 工作階段並使用第二個終端機測試。([Ubuntu 官方文件](https://ubuntu.com/server/docs/how-to/security/openssh-server/))
SSH Key 權限錯誤怎麼辦?
Server 端先確認 ~/.ssh 與 authorized_keys 的權限與擁有者;Client 端則檢查私鑰是否過度開放。Linux 或 macOS Client 常見私鑰權限可以設定為 chmod 600 ~/.ssh/id_ed25519。
SSH Port 改成 2222 就比較安全嗎?
不能把改 Port 當成主要安全措施。它主要可以減少部分自動化掃描與雜訊;真正重要的是 SSH Key、Firewall、帳號限制、Fail2ban 與系統更新。
SELinux 阻擋 SSH 要直接關掉嗎?
不建議直接關閉 SELinux。應先確認 audit 或 system log 中真正被拒絕的操作,再依 SELinux policy 正確調整。
SSH 很慢可以直接設定 UseDNS no 嗎?
不要把 UseDNS no 當成所有 Linux 的通用解法。現代 OpenSSH 與不同 Linux 發行版的 DNS 行為會有所不同,應先使用 ssh -vvv 判斷延遲發生在哪一個階段,再針對原因處理。
