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
排查 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 存取權限白名單內。