切換菜單
切換偏好設定選單
切換個人選單
尚未登入
若您做出任何編輯,會公開您的 IP 位址。

SSH連接故障排除指南(拒絕/超時/密鑰及常見修復)

出自md5.pw
這是此頁面最近一次修訂;沒有已批准修訂。

相信很多人在第一次使用shell軟件登錄自己新購買的伺服器湖或者在部署什麼服務時,不小心點了什麼操作導致了SSH無法連接成功。這時候,可能會出現不同的報錯情況,新手小白可能會不知所措。說實話,我也曾經遇到過這種情況,也曾經因為這種情況消磨了我對鼓搗伺服器的熱情。後面也是自己找了很多資料,才大體搞清了具體的問題所在,以及如何去解決對應的問題。

這篇文章我會帶大家針對VPS日常使用中最常見的SSH故障,提供從問題分析到如何解決的排查指南。


一、 快速診斷:你遇到的是哪種情況?

在動手敲代碼之前,我們需要先「望聞問切」。SSH報錯通常分為三大流派,它們代表了網絡通信中完全不同的三個失敗階段。請對照下表,定位你的問題屬於哪一類:

報錯提示 (終端輸出) 中文直譯 故障發生的階段 核心原因概括
Connection timed out 連接超時 網絡層 / 路由層 數據包在半路走丟了,或者被伺服器的防火牆直接丟棄。伺服器根本沒收到你的「敲門聲」。
Connection refused 拒絕連接 服務層 / 端口層 數據包成功到達了伺服器,但伺服器告訴你:「這個端口沒有SSH服務在運行」。
Permission denied

Authentication failed

權限被拒絕

身份驗證失敗

認證層 / 密鑰層 你成功敲開了門,但伺服器不認識你(密碼錯誤、密鑰不匹配、權限配置錯亂)。
Host key verification failed 主機密鑰驗證失敗 客戶端安全層 你的本地電腦發現這台伺服器的「指紋」變了(通常發生在VPS重裝系統之後),出於安全保護拒絕連接。

二、 深度排查 1:Connection timed out (連接超時)

「連接超時」是最讓人頭疼的報錯,因為它的原因往往游離在伺服器系統之外。它意味着你發送的TCP連接請求(SYN報文)如同泥牛入海,沒有收到任何回應。

1. 檢查伺服器是否「活着」 (宕機排查)

很多時候,超時僅僅是因為VPS關機了或者宿主機(母機)正在維護。

  • 行動: 登錄你的VPS控制面板(例如 KiwiVM 面板)。
  • 查看狀態: 確認伺服器的狀態是否顯示為 Running(運行中)。
  • 急救: 如果狀態是 Stopped,點擊 Start 開機。如果顯示 Running 但依然超時,嘗試點擊 Hard ResetForce Restart 進行強制重啟。

2. 檢查 IP 是否被網絡防火牆阻斷 (IP 被牆)

如果你的VPS位於海外,這是最常見的超時原因。本地運營商或主幹網防火牆可能攔截了發往該IP的數據包。

  • 行動: 使用多節點 Ping 測試工具(強烈推薦訪問 ping.peitdog.cn)。
  • 診斷: 在工具中輸入你的 VPS IP 地址。
    • 如果 海外節點全綠,國內節點全紅:確診你的 IP 已被國內網絡防火牆阻斷(被牆)。
    • 如果 全球節點全紅:說明伺服器處於宕機狀態,或者伺服器內部的防火牆攔截了所有 ICMP (Ping) 請求。
  • 急救: 如果 IP 被牆,如果是動態 IP 服務商可以嘗試重新獲取 IP;如果是固定 IP 服務商,通常需要購買更換 IP 的服務,或者通過其他海外節點進行中轉跳板連接。

3. 檢查系統級防火牆是否攔截了 SSH 端口

如果你在上次登錄時安裝了 ufw 或修改了 iptables 規則,但忘記放行 SSH 端口就啟用了防火牆,那麼你就會把自己「鎖在門外」。

  • 行動: 此時你無法通過 SSH 登錄,必須使用服務商提供的 VNC Console (網頁版控制台) 或 Serial Console (串行控制台)。以 KiwiVM 面板為例,找到 Root shell - interactiveVNC 選項進入系統。
  • 診斷與修復 (以 UFW 為例): 在 VNC 的黑框中登錄 Root 賬戶,輸入以下命令查看防火牆狀態:
ufw status

如果你發現列表中沒有允許 22/tcp (或你自定義的 SSH 端口),請立即放行:

ufw allow 22/tcp
ufw reload

如果是 iptables 把你鎖住了,可以通過以下命令緊急清空規則(注意:這會暴露所有端口,僅作緊急救援使用):

iptables -F
iptables -X
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT

三、 深度排查 2:Connection refused (拒絕連接)

當你看到「拒絕連接」時,其實應該鬆一口氣。這說明網絡是暢通的,IP 沒有被牆,數據包成功抵達了目標機器。只是目標機器的作業系統直接返回了一個 RST (復位) 數據包,無情地關上了門。

1. 端口號輸錯了

這是新手最容易犯的低級錯誤。你可能出於安全考慮,在 /etc/ssh/sshd_config 中把 SSH 端口從 22 改成了 28492,但在登錄時卻忘了指定新端口,使用的依然是默認端口。

  • 錯誤示範:ssh root@198.51.100.1 (默認連接 22 端口,被拒絕)
  • 正確寫法:ssh -p 28492 root@198.51.100.1

2. SSH 服務 (sshd) 崩潰或未隨系統啟動

如果是你重裝了系統或者強制重啟後出現此問題,極有可能是 SSH 守護進程(sshd)沒有正常運行。

  • 行動: 同樣需要登錄控制面板的 VNC Console。
  • 診斷: 檢查 SSH 服務的運行狀態:
systemctl status sshd

或者在 Debian/Ubuntu 系統上:

systemctl status ssh

急救:

如果狀態顯示為 inactive (dead)failed,嘗試手動啟動它:

systemctl start sshd

為了防止下次重啟再次失效,設置其開機自啟:

systemctl enable sshd

3. 配置文件語法錯誤導致服務啟動失敗

如果你剛修改過 /etc/ssh/sshd_config 文件(比如修改端口、禁用密碼登錄等),不小心多打了一個字母,保存並重啟系統後,sshd 服務會因為語法錯誤而徹底罷工。

  • 診斷: 在 VNC 中執行啟動命令時,如果提示失敗,可以查看詳細的系統日誌:
journalctl -xeu sshd.service

或者讓 sshd 幫我們檢查配置文件的語法錯誤:

sshd -t
  • 如果配置有錯,系統會精準地告訴你哪一行寫錯了(例如:line 15: Bad configuration option)。
  • 修復: 使用 nano /etc/ssh/sshd_config 進去把那一行的拼寫錯誤改回來,然後再次 systemctl start sshd

四、 深度排查 3:Permission denied / 密鑰錯誤 (權限被拒絕)

走到這一步,說明網絡通暢,SSH服務也在正常運轉,但這台伺服器的「保安」覺得你身份可疑,不讓你進。

1. Root 密碼真的輸錯了

人的記憶是不可靠的。特別是很多服務商在開通 VPS 時,會隨機生成一串諸如 a8F!k9Lz@ 這樣反人類的初始密碼。

  • 修復: 不要懷疑自己,直接去 VPS 控制面板(KiwiVM)尋找 Root password modification 或 Reset Root Password 選項。點擊重置後,系統會強制修改密碼並重啟 VPS。用新生成的密碼重新登錄即可。

2. 密鑰認證失敗:~/.ssh 目錄權限「潔癖」

如果你配置了更加安全的 SSH Key (密鑰對) 登錄,但依然提示 Permission denied (publickey),90% 的概率是因為 Linux 對密鑰文件的權限要求有着極其變態的「潔癖」。

如果別人能隨意讀取或修改你的密鑰文件,那麼密鑰登錄就失去了意義。因此,如果你的 .ssh 目錄或 authorized_keys 文件的權限設置過寬,SSH 服務會直接拒絕讀取它們。

  • 行動: 通過 VNC 控制台登錄(或使用密碼登錄,如果你還沒禁用密碼的話)。
  • 修覆核心權限: 嚴格執行以下權限鎖定命令:
# 设定当前用户根目录的权限 (不能开放给所有用户组写入)
chmod 750 ~

# 设定 .ssh 文件夹的权限:仅所有者可读写执行 (rwx------)
chmod 700 ~/.ssh

# 设定公钥记录文件的权限:仅所有者可读写 (rw-------)
chmod 600 ~/.ssh/authorized_keys

修復權限後,通常無需重啟 sshd,直接在本地重新嘗試連接即可。

3. 公鑰粘貼格式錯誤

在將本地的 .pub 公鑰內容複製到 VPS 的 ~/.ssh/authorized_keys 文件時,不小心在中間多加了一個換行符,或者複製漏了最後一個字符,都會導致指紋無法匹配。

  • 修復: 在 VNC 中使用 cat ~/.ssh/authorized_keys 查看。正常情況下,一個公鑰必須完完整整地佔據單獨的一行(通常以 ssh-rsassh-ed25519 開頭,以你的電腦用戶名結尾)。如果斷行了,使用 nano 編輯器將其退格拼接到同一行。

五、 特殊疑難雜症:Host key verification failed

這是一個非常經典的報錯。表現為你在本地終端輸入 ssh root@IP 後,彈出一大段充滿感嘆號的警告提示,包含 "WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!"。

原理解析:

每次你連接一台全新的 VPS 時,你的本地電腦都會悄悄把這台伺服器的唯一指紋記錄在本地的一個叫 known_hosts 的文件里。

如果你把這台 VPS 重裝了作業系統,它的伺服器指紋就變了。當你再次連接相同的 IP 時,你的本地電腦一對比:「哎?IP 沒變,但指紋不對!這可能是一個偽造的釣魚伺服器!」 於是出於保護機制,強制掐斷了連接。

修復 (本地電腦操作):

你只需要告訴你的本地電腦:「我知道它重裝了,把舊的指紋刪掉吧」。

如果你使用的是 Windows/Mac/Linux 的終端,直接執行以下命令(將 IP 替換為你的 VPS IP):

ssh-keygen -R 你的VPS_IP地址

系統會提示 Host 你的VPS_IP地址 has been removed。再次發起 SSH 連接,輸入 yes 接受新的指紋即可。


六、 終極救援原則:永遠相信 VNC

在這篇指南中,我們反覆提到了 VNC Console (或稱 KVM/Serial Console)。

請記住一條鐵律:只要你的 VPS 還在開機狀態,無論 SSH 怎麼崩潰、無論防火牆怎麼亂攔截,VNC 控制台永遠能讓你以物理機插顯示器的方式進入系統。

VNC 是不依賴於系統網絡配置的底層帶外管理工具。如果你嘗試了上述所有方法依然無果,請靜下心來:

  1. 打開服務商面板的 VNC。
  2. 輸入 root 和密碼(由於 VNC 是模擬物理鍵盤,可能不支持複製粘貼,且注意排查輸入法的大寫鎖定)。
  3. 使用 ping 8.8.8.8 測試外網連通性。
  4. 使用 ip addr 檢查網卡是否正常獲取了 IP 地址。
  5. 檢查系統日誌 tail -n 50 /var/log/auth.log 來尋找 SSH 拒絕登錄的蛛絲馬跡。

結語與下一步行動

SSH 故障排查是一個建立排錯邏輯的絕佳過程。當你能夠熟練地從網絡層、服務層、認證層逐一剝絲抽繭定位問題時,你就不再是一個只會複製粘貼命令的新手,而是初步具備了獨立解決問題的架構師思維。