適合遇到「用戶端已啟動,但要求失敗」的使用者。先區分用戶端記錄、核心錯誤記錄與存取記錄,再依序檢查本機監聽、DNS、遠端連線、TLS 與協定驗證。錯誤訊息是排查線索,不是最終結論;找出最內層原因後再決定要修改哪個欄位,通常比反覆重新安裝有效。
一、先分辨記錄來源,再重現一次要求
v2rayN 是用戶端,V2Ray 或 Xray 則是實際處理連線的核心。訂閱下載失敗、介面設定儲存失敗屬於用戶端事件;監聽連接埠失敗、代理交握失敗通常來自核心。Android 上的 v2rayNG 使用 Xray 核心,v2flyNG 使用 V2Fly 核心。不同核心與版本的記錄用詞可能不同,不能只靠整行文字搜尋答案。
核心記錄又分為存取記錄與錯誤記錄。存取記錄可用來確認要求是否進入入站、存取哪個目標,以及符合哪個出站;錯誤記錄則用來查看啟動與連線階段的異常。出現 accepted 通常只代表要求已被入站接受,不代表已成功連上遠端,也不代表網頁內容已經傳回。
上述連線流程用來區分排查階段,並非每個連線都會依相同順序解析網域名稱。DNS 可能在路由判斷時解析,也可能交由遠端處理。第一步應先找出失敗要求停在哪個階段,不要同時修改 DNS、路由與節點參數。
- 儲存目前設定,記下系統時間、選用的節點及實際啟用的核心。
- 開啟用戶端提供的記錄檢視畫面,確認看到的是核心執行輸出,而不只是訂閱更新訊息。
- 暫時停止其他應用程式的網路要求,存取一個固定目標,只重現一次失敗。
- 保留失敗前後連續的記錄,依時間、目標位址與連線識別碼比對同一次要求。
二、如何選擇 loglevel:日常用 warning,排查時暫用 debug
log.loglevel 控制錯誤記錄的詳細程度,不是連線速度設定,也不等同於存取記錄的開關。日常可使用 warning 減少雜訊;重現問題時,則短暫切換為 info 或 debug。找到問題後請恢復原本級別,避免記錄持續增加或暴露更多連線資訊。
| 級別 | 記錄內容 | 適用情境 |
|---|---|---|
debug | 除錯細節及更高嚴重程度的訊息 | 短時間重現複雜連線問題 |
info | 一般執行資訊、警告與錯誤 | 查看啟動、連線及處理過程 |
warning | 警告與錯誤 | 日常執行,減少一般資訊 |
error | 錯誤 | 只保留明確的失敗訊息 |
none | 關閉錯誤記錄輸出 | 不適合用於排查問題 |
以下是 V2Ray 風格設定中的頂層 log 物件片段,並非完整可執行的設定。使用圖形介面用戶端時,建議優先透過記錄設定調整;用戶端產生的設定檔可能會在下次啟動時遭到覆寫。輸出至檔案或主控台,還取決於記錄路徑設定與用戶端擷取輸出的方式。
{
"log": {
"loglevel": "debug"
}
}
三、connection refused 與連接埠占用:先確認位址在哪一端
connection refused 表示連線遭到主動拒絕,常見原因是目標連接埠沒有服務在監聽,或防火牆主動拒絕連線。先查看錯誤訊息中的 IP 與連接埠:若指向 127.0.0.1,請檢查本機入口;若指向節點伺服器,則檢查遠端服務。混淆這兩種情況,可能會造成修改節點後仍無法連上本機代理。
錯誤:connect: connection refused
原因:該次 TCP 連線遭目標端主動拒絕,不能只憑這行訊息就判定帳號失效。
解決方法:確認同一行中的目標位址與連接埠;若是本機位址,檢查核心是否已啟動;若是遠端位址,檢查節點連接埠及服務的監聽狀態。
錯誤:bind: address already in use
原因:核心無法繫結監聽位址,通常是該位址與連接埠已被其他程序占用。
解決方法:找出占用中的程序、關閉重複啟動的執行個體,或修改本機監聽連接埠,並同步更新應用程式的代理位址。
以下數字僅用於說明常見設定組合,不代表目前版本的固定預設值。有些設定會將 HTTP 與 SOCKS 合併至同一個混合入口;請以用戶端實際顯示的監聽項目為準。遠端使用 443 也不代表服務一定採用 TLS。
Windows 可使用以下命令查詢這兩個本機連接埠。輸出最末欄是 PID;請特別確認 TCP 項目是否處於 LISTENING 狀態。接著到工作管理員的「詳細資料」頁面確認程序名稱,不要只憑連接埠號碼就結束不熟悉的程序。
netstat -ano | findstr ":10808"
netstat -ano | findstr ":10809"
- 完全沒有監聽:先排除核心啟動錯誤,再測試瀏覽器或終端機。
- 有監聽但協定不符:HTTP 代理位址不能任意指向只接受 SOCKS 的連接埠。
- 連接埠改為 10810 後:若應用程式仍指向 10808,連線就會持續失敗;系統代理與終端機環境變數需要分別確認。
四、timeout 與 DNS 錯誤:從最內層原因判斷
i/o timeout 表示某次讀寫超過等待時間;context deadline exceeded 表示操作超過截止時間。這兩者都不能直接說明「節點已失效」。DNS 查詢、TCP 建立連線、TLS 交握或等待回應,都可能發生逾時。應沿著錯誤訊息找出最具體的子錯誤,確認逾時發生在哪個位址及階段。
錯誤:dial tcp ...: i/o timeout
原因:若前後文確認是在 TCP 撥號階段,表示未能在期限內建立連線,可能與路由、封包遺失、流量過濾或遠端無法連線有關。
解決方法:確認遠端位址與連接埠,分別在目前網路及另一個可用網路測試,避免只增加等待時間來掩蓋問題。
錯誤:no such host
原因:網域名稱解析沒有取得可用結果,可能是網域名稱拼錯、缺少 DNS 記錄或解析路徑異常。
解決方法:先確認錯誤中的網域是節點位址還是存取目標,再檢查相應的解析器與網域記錄。
錯誤:failed to find an available destination
原因:這是出站選擇或連線失敗的概括訊息,單憑這句無法判定是 DNS 故障。
解決方法:繼續查看後續巢狀錯誤原因;若出現解析錯誤就檢查 DNS,出現撥號逾時就檢查遠端連線狀態,出現連線遭拒則檢查監聽服務。
例如瀏覽器無法存取,但記錄只出現節點網域的解析錯誤,表示尚未建立與節點的連線,此時不應先修改目標網站的分流規則。反過來說,若節點已連線,只有特定目標網域無法存取,就應檢查該目標的解析與路由結果。
- 確認節點的
address是網域名稱還是 IP,並確認連接埠與伺服器設定一致。 - 使用系統工具查詢網域,初步確認本機解析是否正常;Windows 可在
nslookup後輸入實際的節點網域名稱。 - 系統查詢成功不代表核心的 DNS 解析一定正常。請繼續檢查
dns.servers、解析器是否可連線,以及相關路由。 - 每次只變更一個項目,並記錄修改前後的錯誤訊息,避免無法判斷是哪項設定生效。
五、TLS 交握失敗:檢查時間、憑證名稱與傳輸參數
TCP 連線成功只代表可以連上遠端連接埠。之後 TLS 仍可能因憑證、伺服器名稱或協定協商失敗而中斷。確認 streamSettings.security 與伺服器要求一致;使用一般 TLS 時,還要檢查 tlsSettings.serverName。伺服器位址與憑證名稱可以不同,但必須符合伺服器的部署方式。
錯誤:x509: certificate has expired or is not yet valid
原因:系統時間不正確,或伺服器憑證不在有效期限內。
解決方法:先校正系統日期、時間與時區;若時間正確,請由伺服器管理者檢查憑證續期及實際部署狀態。
錯誤:x509: certificate signed by unknown authority
原因:用戶端無法將憑證鏈驗證至受信任的根憑證,可能是伺服器缺少憑證鏈,或本機信任環境異常。
解決方法:檢查完整憑證鏈與系統憑證環境,不要將略過驗證當成日常解決方法。
錯誤:remote error: tls: handshake failure
原因:遠端拒絕 TLS 交握;這行訊息並未指出單一確切原因。
解決方法:對照伺服器設定,檢查 SNI、TLS 設定與連接埠;必要時比對伺服器同一時間的記錄。
TLS 成功後仍可能發生傳輸或驗證錯誤。WebSocket 的 path、要求中的 Host,以及 gRPC 的 serviceName 都必須與伺服器設定相符。websocket: bad handshake 常見原因包括路徑、Host、反向代理轉送或傳輸類型不符,不能一概視為憑證問題。
六、從記錄定位設定欄位:依故障階段修改
應依故障階段選擇要檢查的欄位。啟動時就出現監聽失敗,先檢查入站;遠端連線失敗,先檢查出站位址;要求走錯路徑,再檢查路由標籤。下表以常見的 V2Ray 風格 JSON 為例,實際結構請以所用核心及用戶端產生的設定為準。
| 觀察到的現象 | 優先檢查欄位 | 確認重點 |
|---|---|---|
| 啟動時繫結失敗 | inbounds[].listen、inbounds[].port | 位址是否為本機位址、連接埠是否遭占用 |
| 應用程式無法連上本機入口 | inbounds[].protocol | 應用程式使用的 HTTP 或 SOCKS 是否相符 |
| 遠端拒絕連線或撥號逾時 | outbounds[].settings 中的位址與連接埠 | 節點資訊、遠端監聽、網路路徑 |
| 網域名稱解析失敗 | dns.servers 與相關解析策略 | 網域記錄、解析器連線狀態、解析流量路徑 |
| 憑證名稱或 TLS 交握異常 | streamSettings、tlsSettings.serverName | 安全類型、SNI、憑證與系統時間 |
| 要求進入錯誤的出站 | routing.rules[].outboundTag、outbounds[].tag | 規則順序與標籤是否正確對應 |
VMess、VLESS、Trojan、Shadowsocks 的驗證欄位各不相同。只有進入協定驗證階段後,才需要檢查 UUID、密碼或加密方式;不要把所有錯誤都歸咎於「密碼錯誤」。反覆出現 EOF 也只代表讀取時連線已結束,需依它發生在交握前或資料傳輸後來判斷。
- 修改前:備份設定,保留錯誤訊息原文與發生時間。
- 修改:只修改與目前故障階段直接相關的項目;使用訂閱管理的節點時,也要留意更新可能會覆寫手動修改。
- 驗證:重新啟動核心使設定生效,並使用相同的應用程式及目標再次測試。
- 完成後:確認連線恢復後,調低記錄級別並清除不再需要的診斷檔案。
七、記錄排查常見問題
記錄是空白的,代表要求根本沒有進入代理嗎?
先確認核心正在執行、錯誤記錄級別不是 none,且目前檢視畫面確實顯示核心輸出。沒有異常時,錯誤記錄也可能不會新增內容。若要確認要求是否進入入口,可暫時查看存取記錄,並核對應用程式代理位址與實際監聽連接埠。
瀏覽器可以開啟網頁,終端機卻一直顯示連線失敗?
終端機不一定會讀取系統代理設定。請檢查目前終端機的代理環境變數是否指向正在監聽的位址,並確認協定。例如只有在 10809 確實是 HTTP 入口時,才能使用 http://127.0.0.1:10809。若記錄中沒有相應要求,應先檢查應用程式到本機入口之間的連線路徑。
v2rayNG 螢幕關閉後斷線,記錄中也沒有 TLS 錯誤,該怎麼辦?
先確認 Android VPN 連線是否仍在、用戶端程序是否遭停止,再檢查該應用程式的電池用量與背景執行權限。若核心已被系統結束,記錄可能會直接中斷;這與遠端憑證故障不同。調整背景限制後,鎖定螢幕進行測試並記下停止時間。
將 debug 記錄傳給他人前,應刪除哪些資訊?
移除訂閱網址、UUID、密碼、存取權杖,以及不想公開的伺服器位址、存取網域與個人路徑。保留核心類型、錯誤關鍵字、連接埠用途及前後文順序;位址可統一替換為「節點位址」或「目標位址」,不要只留下截掉內容的最後一行截圖。