SSH 連線排錯完整教學|Connection refused、Permission denied、Port 與 Key

SSH 連線排錯完整教學|Connection refused、Permission denied、Port 與 Key

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。

推薦 SSH 連線排錯順序:
網路可達性 → 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 遠端管理 Server,修改 UFW 前一定要先確認目前使用的 SSH Port 已經允許,否則可能直接把自己鎖在伺服器外。

只允許特定管理網段

如果只有內部管理網段需要 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/))

非常重要: 如果你是遠端修改 SSH,不要立刻關掉原本正常的 SSH 視窗。 先保留目前連線,再開第二個終端機測試新設定,確認可以重新登入後,再關閉舊連線。

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 判斷延遲發生在哪一個階段,再針對原因處理。