適用於 v2rayNG 點選啟動後立即停止、提示載入設定失敗,或匯入自訂 config 後無法執行的情況。先保留一份完整的啟動日誌,再依序檢查解析、欄位、監聽與出站設定。一般訂閱節點優先在編輯頁面修正欄位;只有自訂設定才需要直接檢查 JSON,不必一開始就重新安裝用戶端。
先開啟日誌,分辨啟動失敗與連線失敗
在 v2rayNG 主畫面開啟左上角側邊選單,進入「日誌」。先停止服務並清除舊日誌,再回到主畫面選取出錯的節點並啟動一次;接著返回「日誌」,保留這次啟動的完整紀錄。不同版本的入口位置可能不同,請以介面中的「日誌」項目為準。不要只截取最後一行「啟動失敗」,真正的原因往往就在上方。
-
備份原始設定
記下目前的節點名稱與設定類型。手動維護的 JSON 請先另存副本;訂閱節點則記下所屬群組,避免後續更新覆蓋暫時修改的內容。
-
記錄環境資訊
在側邊選單的「關於」頁面記下用戶端版本;如果啟動日誌有顯示 Xray 版本,也一併記錄。用戶端版本與核心版本是不同的編號。
-
單次重現問題
停止服務並清除日誌後,只啟動一次。若出現 Android VPN 授權提示,請先確認授權,避免將取消授權誤判為設定錯誤。
-
追查錯誤原因
從
failed to load config或failed to start開始往下讀。若有多層原因,繼續找出具體欄位、連接埠或 JSON 解析提示。
如果日誌已進入接收要求的階段,之後才出現 connection refused、i/o timeout 或憑證交握錯誤,通常是連線階段的問題,不代表核心未啟動。此時反覆調整 JSON 標點,無法解決遠端連接埠無法連線或憑證不相符的問題。
前三個階段失敗,優先檢查本文提到的設定與連接埠;後兩個階段失敗,再檢查路由、DNS、節點連線狀態與 TLS。日誌用語會隨 Xray 版本變動,以下列出的是常見錯誤片段,不必與整行文字完全相同。
第一類:JSON 語法錯誤,先檢查括號與資料型別
剛貼上自訂設定就無法啟動,請先檢查 JSON。物件的鍵必須使用英文雙引號,字串也必須使用雙引號;物件或陣列最後一個項目後不要多加逗號。為避免解析器差異,排查時請使用不含註解的標準 JSON。
錯誤:invalid character '}' looking for beginning of object key string
原因:物件結尾前可能多了一個逗號,解析器仍在等待下一個鍵。解法:檢查錯誤位置前一個項目,移除末尾逗號,並確認沒有多寫成對的大括號。
錯誤:unexpected EOF
原因:物件、陣列或字串尚未結束,內容就已遭截斷。解法:重新確認複製範圍,補上真正缺少的內容,而不是只在檔案結尾機械式地加上括號。
錯誤:cannot unmarshal string into Go struct field
原因:欄位型別與核心預期不符。解法:連同後方的欄位路徑一起查看,依欄位要求改為數字、布林值、陣列或物件。
以下是用來說明語法的局部物件,不是可直接匯入的完整代理設定。port 使用數字,listen 使用字串,最後一個項目後不加逗號。發現型別錯誤時,請逐一修正欄位,不要把所有數字都改成字串。
{
"listen": "127.0.0.1",
"port": 10808,
"protocol": "socks"
}
第二類:欄位拼寫錯誤,JSON 合法不代表設定有效
語法檢查通過後,請確認欄位名稱、層級與列舉值。頂層通常是 inbounds 和 outbounds 兩個陣列,而不是單數形式;傳輸設定使用 streamSettings,其中 network 的值也必須是核心支援的名稱。鍵名的大小寫不可任意更改。
- 層級錯誤:將
streamSettings放進settings中,不代表已為目前的出站設定傳輸層。 - 列舉值錯誤:WebSocket 的網路值應使用
ws,不要自行縮寫成websoket。 - 欄位混用:不要將分享連結中的參數名稱直接當成 JSON 鍵名。例如,連結參數與核心設定中的 TLS 欄位並非一一對應。
- 版本差異:新設定欄位可能需要較新版的核心。更新用戶端後,仍須確認實際執行的核心版本,不能只看下載日期。
錯誤:unknown transport protocol: websoket
原因:傳輸協定名稱不是可辨識的列舉值。解法:依伺服器端要求修正 streamSettings.network;伺服器端使用 WebSocket 時,應填入 ws。
請留意:解析器可能會忽略部分未知欄位,而不會直接回報「欄位拼錯」。因此,「沒有語法錯誤」不代表參數已生效。一般節點請回到主畫面,開啟該節點的編輯頁面,逐項檢查位址、連接埠、協定與傳輸設定;不要只為了修正一個欄位,就把整個節點改成自訂 JSON。
第三類:inbound 監聽衝突,檢查位址與連接埠
日誌出現 bind: address already in use,代表本機監聽端點已被占用。這是裝置上的連接埠衝突,不是節點伺服器拒絕連線。請先停止其他代理服務,再檢查自訂設定中是否重複宣告相同的監聽位址、連接埠與傳輸協定。
這些數字僅用來說明排查方式,不代表所有版本的預設值。一般設定可在側邊選單的「設定」中尋找本機 SOCKS 連接埠選項,修改後停止並重新啟動服務;實際名稱以目前版本為準。自訂 JSON 則請檢查實際 inbounds 中的 listen 和 port,不要假設通用設定會覆蓋自訂設定。
錯誤:listen tcp 127.0.0.1:10808: bind: address already in use
原因:該 TCP 監聽端點已被其他服務占用。解法:停止占用該端點的服務,或改用確認未被占用的較高連接埠;接著同步修改手動設定此代理連接埠的應用程式。
結論:只修改本機連接埠,不要改節點連接埠
看到日誌中的 listen 與 bind,請先處理本機入站設定。不要順手把遠端伺服器連接埠也改成 10818;遠端連接埠必須與伺服器實際監聽的連接埠一致。
0.0.0.0 表示通用監聽,可能與相同連接埠上的特定 IPv4 位址監聽發生衝突。兩個入站設定是否衝突,還取決於 TCP、UDP 與位址族,不能只看連接埠數字。也不要為了避開問題而任意開啟區域網路存取,這會擴大本機代理的可存取範圍。
第四類:outbound 參數缺漏,依協定檢查必填項目
出站設定決定連線至哪台伺服器、使用哪種協定以及如何驗證身分。VMess 與 VLESS 的常見 JSON 出站設定會在 settings.vnext 中定義伺服器,並在 users 中定義使用者;Trojan 通常使用 settings.servers。混用不同協定的欄位,即使 JSON 語法正確,也可能在建構出站時失敗。
| 協定 | 優先檢查的設定路徑 | 常見問題 |
|---|---|---|
| VMess | settings.vnext[].address / port / users[].id | 位址空白、缺少連接埠、使用者 ID 格式錯誤 |
| VLESS | settings.vnext[].users[].id / encryption | UUID 格式不正確;一般設定中的 encryption 應為 none,並須符合目前核心的要求 |
| Trojan | settings.servers[].address / port / password | 誤用 vnext 結構,或缺少密碼與伺服器位址 |
錯誤:invalid UUID
原因:使用者 ID 無法以該核心接受的格式解析。解法:從原始節點資料重新複製完整 ID,檢查空格、截斷與全形字元;不要隨機產生新 ID 來取代伺服器端帳號。
錯誤:failed to build outbound handler
原因:這是出站建構失敗的概括提示,單看這句無法判斷缺少哪個參數。解法:繼續查看巢狀錯誤原因,依具體協定檢查伺服器清單、使用者參數與傳輸層設定。
連線位址、TLS 的伺服器名稱與 WebSocket 的 Host 用途不同,不能只因為看起來都是網域名稱就互相替換。VLESS 搭配 REALITY 時,還需要核對與伺服器端相符的公鑰、伺服器名稱及其他相關參數;欄位名稱與支援情況以實際核心版本為準。缺少參數時,請向設定提供者確認,不要照抄其他節點的值。
修改後重新啟動,保留可還原的排查紀錄
每次只修改一類問題,接著停止服務、重新啟動並查看新日誌。先修正語法,再處理欄位與參數,最後確認監聽成功。若一次同時修改連接埠、DNS、協定與路由,即使連線恢復,也很難判斷究竟是哪項修改有效。
- 一般訂閱節點:先在訂閱群組選單中執行更新,再檢查匯入結果。若只有一個節點失敗,請保留該節點的日誌,不要刪除整個群組。
- 自訂設定:保留修改前後的副本,記錄變更的欄位與時間。不要直接覆寫唯一可用的設定檔。
- 已知可用的節點:在同一台裝置上進行比較。如果該節點能啟動,請優先檢查出錯的節點,不要立刻重設所有設定。
- 仍然無法啟動:提供用戶端與核心版本、已遮蔽敏感資訊的完整錯誤原因鏈、設定來源類型及最近一次修改內容。只有一張「無法連線」的截圖,不足以找出 config 錯誤。
如果核心已啟動,但 Android VPN 尚未建立,請檢查系統授權,以及其他正在使用 VPN 的應用程式。Android 的同一使用者環境通常只能維持一個作用中的 VPN。這類問題應依系統 VPN 狀態處理,不必反覆更換 UUID 或關閉憑證驗證。