Skip to main content

SSH 連線與網路排查實戰手冊

這份手冊在講什麼?​

這是一份把實際排查 QNAP NAS 遠端連線過程中碰到的概念,系統化整理成 Linux 工程師視角的知識手冊,涵蓋 SSH 原理、網路診斷工具、網路拓撲觀念,以及實戰排查決策樹與常用指令備忘錄。


1. SSH 原理與指令細節​

1.1 基本連線語法​

ssh -p 2266 admin-wmd-nas@wmd-316.myqnapcloud.com
  • -p <port>:指定連線通訊埠。標準預設為 22;基於安全隱匿原則,伺服器常會自訂其他通訊埠(如本次使用的 2266)。
  • [user]@:明確告知伺服器以哪一個帳號身分登入。如果未指定,SSH 會預設使用你當前本機的使用者名稱。

1.2 連線除錯旗標:-v、-vv、-vvv​

當 SSH 連線卡住或報錯時,使用詳細輸出(Verbose Mode)是定位問題的第一步:

# 輸出最高層級的詳細除錯訊息
ssh -vvv -p 2266 admin-wmd-nas@wmd-316.myqnapcloud.com
  • -v:顯示基本連線步驟、金鑰協商、認證方式。
  • -vv:顯示更詳細的加密演算法匹配、套接字(Socket)狀態。
  • -vvv:輸出底層通訊連線、封包傳遞與最詳盡的追蹤日誌。

1.3 金鑰快取清理:ssh-keygen -R​

當伺服器重灌或更換系統金鑰,導致 Host Key 衝突時,可從本機清除快取:

# 清除本機對該 IP 或網域的金鑰指紋紀錄
ssh-keygen -R 192.168.0.156
ssh-keygen -R wmd-316.myqnapcloud.com

2. 網路探測與通訊埠診斷工具:nc 與 dig​

在排查連線問題時,不需要每次都用完整的應用層客戶端(如 SSH、瀏覽器)去測,使用輕量的網路工具能更精確地定位是在 DNS、TCP 還是應用層出錯。

2.1 Netcat(nc):瑞士刀級的網路探針​

Netcat 用於讀取和寫入跨網路連線的資料,常作為快速檢查通訊埠是否開放的利器。

# 語法:nc [參數] <主機> <連接埠>
nc -zv wmd-316.myqnapcloud.com 2266
  • -z(Zero-I/O mode):只掃描連線狀態,不發送任何資料,完成三方交握後立即關閉。
  • -v(Verbose):顯示連線結果詳細資訊。
  • -w <秒數>:設定連線逾時時間(例如 -w 3 表示 3 秒沒回應就中斷)。

判斷依據:

  • 輸出 Connection to ... succeeded!:代表網路路由通暢,且目標設備確實開啟並轉發了該 Port。
  • 輸出 Connection refused:目標主機在線,但服務沒開或轉發目標錯誤。
  • 輸出 Operation timed out:外網被防火牆或路由器擋死,封包沒進去。

2.2 Domain Information Groper(dig):DNS 查詢工具​

用於向 DNS 伺服器查詢網域名稱解析後的 IP 位址。

# 查詢網域名稱對應的 A 紀錄(IPv4)
dig wmd-316.myqnapcloud.com

# 簡短模式(只輸出解析後的 IP)
dig +short wmd-316.myqnapcloud.com

排查重點:

  • 比對 dig +short 輸出的 IP 與 NAS 管理介面或路由器 WAN 顯示的公用 IP 是否完全一致。如果不一致,代表 DDNS 更新延遲或快取尚未過期。

3. 網路拓撲與路由概念:Private IP、NAT、DDNS 與 CGNAT​

完整原理請參考 網路拓撲與路由概念:Private IP、NAT、DDNS 與 CGNAT。

排查 SSH 遠端連線時,最常踩到的幾個網路觀念:

  • 私有 IP(RFC 1918):10.0.0.0/8、172.16.0.0/12、192.168.0.0/16 無法在公網路由。在外面執行 ssh admin@192.168.0.156 不會連到家裡的設備。
  • NAT 與 Port Forwarding:外部主動連入的流量預設會被路由器丟棄,必須設定 Port Forwarding,例如把外部 TCP 2266 轉發給 192.168.0.156:2266。
  • DDNS:家用寬頻多為動態 IP,需要靠 DDNS(如 myQNAPcloud)讓 wmd-316.myqnapcloud.com 持續指向當前的公用 IP。
  • CGNAT(大內網):路由器 WAN IP 若為 100.64.x.x(RFC 6598),Port Forwarding 會直接失效,nc 檢測必然 timed out,需改用 Tailscale、ZeroTier、Cloudflare Tunnel 或 FRP 等方式穿透。

4. 實戰排查決策樹與常用指令備忘錄​

4.1 連線問題排查流程圖​

[開始連線:ssh -p <port> user@domain]
│
├──> 出現 "Connection refused"
│ │
│ ├──> 檢查是否在不同網路卻使用 192.168.x.x 內網 IP
│ └──> 檢查 NAS 端 SSH Daemon 是否運行、Port 是否設錯
│
├──> 出現 "Operation timed out"
│ │
│ ├──> 用 nc -zv 測試 Port 是否暢通
│ ├──> 檢查家用路由器 Port Forwarding / UPnP 規則
│ └──> 檢查 ISP 是否為 CGNAT 或雙層 NAT
│
└──> 出現 "Permission denied"
│
├──> 預設 admin 是否已被停用 (需改用自建管理員)
└──> 檢查 SSH 控制台中的「編輯存取權限」白名單

4.2 常用指令快速備忘錄(Cheatsheet)​

# 1. SSH 帶 Port 與最詳盡除錯
ssh -vvv -p <PORT> <USER>@<HOST>

# 2. 清除特定 IP/域名的主機指紋
ssh-keygen -R <HOST>

# 3. 測試 TCP 通訊埠是否開放(零傳輸檢測)
nc -zv <HOST> <PORT>

# 4. 查詢網域名稱解析 IP
dig +short <DOMAIN>

# 5. Linux 主機端查看監聽中的 TCP 連接埠(在 NAS Shell 內)
netstat -tulpn | grep 2266
# 或使用現代工具
ss -tulpn | grep 2266

# 6. Linux 查看目前有效使用者與群組
whoami
id

小結​

  • SSH 出錯先用 -vvv 看卡在哪個階段:TCP 握手、Host Key 比對,還是認證。
  • Connection refused/timed out/Permission denied 分別對應不同層級的問題,別一律當成「連不上」。
  • 外網連不進來時,先用 nc -zv 與 dig +short 分離 DNS、TCP 與應用層問題。
  • 家用環境要特別留意 NAT、DDNS,以及 CGNAT(100.64.x.x)會讓 Port Forwarding 直接失效。
  • Permission denied 多半是預設 admin 帳號被停用,或帳號不在 SSH 存取權限白名單內。