本文重點

適合點選 v2rayNG 連線按鈕後立即停止,或日誌持續出現錯誤的 Android 使用者。先確認問題發生在讀取設定、本機監聽還是連線至遠端,再沿著錯誤訊息找出具體欄位。本文整理日誌擷取步驟、常見錯誤對照與設定片段;每次只修改一處,避免原本容易定位的問題變成多處故障。

先釐清:核心未啟動,還是啟動後連線失敗

v2rayNG 是 Android 用戶端,本文以其使用的 Xray 核心日誌為排查範圍。點選連線後出現 VPN 圖示,只能表示 Android 端已建立相應的服務狀態,不能單憑圖示判斷節點可用。反過來說,網頁無法開啟也不一定是核心啟動失敗:若本機監聽已建立,直到首次連線才發生逾時,通常應檢查遠端連線路徑。

故障階段日誌線索優先檢查項目
讀取設定failed to read config files、invalid characterJSON 語法、設定來源
建立設定failed to build 後方的具體欄位原因協定名稱、欄位型別、核心支援狀況
建立本機監聽bind: address already in use監聽位址與本機連接埠
發出遠端請求i/o timeout、connection refused伺服器位址、遠端連接埠與線路
安全或傳輸交握x509:、bad handshake憑證網域、TLS 與傳輸參數

同一則日誌可能以 > 串起多層原因。前面的「啟動失敗」是結果,後續關於字元、連接埠或憑證的描述才更接近根本原因。閱讀時先保留完整錯誤鏈,再從末尾往前找出具體對象,不要只截取最醒目的紅色訊息。

擷取一份乾淨日誌:從點選連線開始

先保留目前的節點與自訂設定,再擷取日誌。v2rayNG 不同版本的翻譯與選單位置可能略有差異;常見入口是主畫面左上角選單中的「日誌」,日誌等級則可在「設定」中調整。若找不到同名選項,請以目前版本的介面為準,不要照搬桌面版 v2rayN 的「參數設定」路徑。

  1. 記錄環境資訊

    在 Android「設定」→「應用程式」→「v2rayNG」的應用程式資訊中記下用戶端版本,並記錄 Android 版本、節點協定,以及是否使用自訂設定。若日誌顯示核心版本,也請一併保留。

  2. 停止連線

    回到 v2rayNG 主畫面,點選連線按鈕停止服務。暫時停止其他 VPN 應用程式,避免 Android VPN 服務切換造成額外干擾。

  3. 調整日誌等級

    前往「設定」→「日誌等級」,先選擇 info;若線索不足,再暫時改為 debug。若使用完整自訂 JSON,也要檢查其中的 log.loglevel。

  4. 重現一次問題

    開啟「日誌」,使用清除功能移除舊記錄,再回到主畫面重新連線一次。若服務持續運作,開啟一個網頁,接著返回日誌查看同一時段的記錄。

  5. 保留前後文

    複製首次失敗前後的完整記錄。分享前請遮蔽訂閱網址、UUID、密碼與伺服器資訊,但保留欄位名稱、錯誤順序,以及同一位址之間的對應關係。

debug 提供詳細資訊,info 記錄一般流程,warning 提示異常,error 表示某項操作失敗。這些等級不是「節點好壞」的評分。單次請求出錯不代表整個核心已停止,而沒有錯誤記錄也可能只是日誌等級設得太高。排查完成後,請將詳細日誌等級調回原值,避免留下不必要的記錄。

JSON 語法錯誤:先修正格式,再檢查節點

剛匯入自訂設定就無法啟動時,應優先檢查解析錯誤。JSON 的屬性名稱與字串必須使用英文雙引號;使用中文引號、漏逗號或多餘的尾逗號都會造成問題。為方便移轉與排錯,範例採用嚴格 JSON,不依賴特定載入器對註解的擴充支援。

錯誤:invalid character '}' looking for beginning of object key string

原因:物件的最後一個屬性後仍有逗號,解析器正在等待下一個屬性名稱,卻遇到了右大括號。

解法:檢查錯誤位置前一個屬性,刪除尾逗號;也要檢查相鄰物件,不要直接刪除右大括號。

錯誤:unexpected end of JSON input

原因:內容提早結束,常見原因包括複製不完整、缺少右括號,或字串沒有結尾引號。

解法:從原始設定重新匯入,檢查結尾的引號、方括號與大括號是否成對,避免憑感覺連續補上括號。

例如以下局部片段中,"warning" 後面多了一個逗號。錯誤可能指向下一行的右大括號,而不是逗號本身,因此定位時要多往前檢查一行。

{
  "log": {
    "loglevel": "warning",
  }
}

修正後的片段如下。這只示範 log 的寫法,並非可獨立連線的完整設定;請在原始檔案中替換對應物件,不要覆蓋原有的入站、出站與路由設定。

{
  "log": {
    "loglevel": "warning"
  }
}

連接埠占用:檢查本機監聽,不要改伺服器連接埠

bind 錯誤發生在本機監聽階段,與連線至遠端失敗是兩種不同問題。以下數字僅供排查示範,不代表所有 v2rayNG 安裝的預設值;請以「設定」中顯示的本機連接埠及實際日誌為準。

10808
範例:本機 SOCKS 監聽連接埠
10809
範例:本機 HTTP 監聽連接埠
443
範例:節點遠端服務連接埠

錯誤:bind: address already in use

原因:目標位址上的監聽連接埠已被其他程序使用,也可能是自訂設定中的兩個入站項目重複使用同一個連接埠。

解法:先停止相關服務再重試;若仍然失敗,請檢查完整設定中的 inbounds,核對各項目的 listen、port 與協定。

若日誌明確指出 127.0.0.1:10808 綁定失敗,可以嘗試將本機 SOCKS 連接埠改為未占用的 10818,再重新啟動。其他依賴該 SOCKS 連接埠的應用程式也要同步修改。只修改節點編輯頁中的遠端連接埠,不但無法釋放本機監聽,還可能破壞原本正確的節點參數。

結論:先確認位址屬於哪一端,再修改連接埠

若錯誤中出現 127.0.0.1 且包含 bind,先檢查手機上的本機監聽;若錯誤中出現伺服器位址並包含連線逾時,再檢查遠端連線。不要同時修改兩端設定。

欄位拼寫與核心支援:JSON 格式正確還不夠

JSON 能夠解析,只代表格式正確,不代表 Xray 接受所有值。例如 streamSettings 中的 network 必須使用核心支援的傳輸識別字,WebSocket 對應 ws,不能隨意寫成 websocket。用戶端介面顯示的協定名稱也不一定等同於設定中的字串。

以下是 WebSocket 與 TLS 的結構範例,僅供核對欄位層級。網域與路徑都是示範值,實際使用時必須與伺服器設定一致;這段物件本身不是完整的出站設定。

{
  "streamSettings": {
    "network": "ws",
    "security": "tls",
    "tlsSettings": {
      "serverName": "example.com"
    },
    "wsSettings": {
      "path": "/tunnel",
      "headers": {
        "Host": "example.com"
      }
    }
  }
}

另外請留意,未知欄位不一定會造成啟動錯誤;有些載入流程會直接忽略它,導致預期啟用的設定沒有生效。相反地,若將新參數交給不支援該參數的舊版核心,可能會在建立設定時失敗。更新前請記錄用戶端與核心資訊,並保留原始設定;更新後先測試原有節點,不要同時更換協定與整套路由。

傳輸與憑證錯誤:通常發生在啟動之後

若核心已建立本機監聽,只有開啟網頁時才出現以下錯誤,就不要再只檢查 JSON 逗號。請先確認節點位址與遠端連接埠,再核對 TLS、安全參數與傳輸設定。以下是常見錯誤片段,完整前綴與包裝文字會因核心版本而異。

錯誤:websocket: bad handshake

原因:WebSocket 交握未收到預期回應,常見原因是路徑、Host、遠端連接埠或反向代理轉送設定不符。

解法:依照服務端提供的資訊檢查 path、Host 與 TLS 是否啟用;不要只因看到「交握」就修改 UUID。

錯誤:x509: certificate has expired or is not yet valid

原因:憑證有效期限不符,可能是伺服器憑證已過期,也可能是手機時間錯誤。

解法:先在 Android 系統「日期與時間」中啟用自動設定,並確認目前日期;若時間正確但仍出現錯誤,請服務提供者檢查憑證。

錯誤:connection refused

原因:連線遭到主動拒絕,可能是目標連接埠沒有服務在監聽,或中間設備回傳了拒絕回應。

解法:核對錯誤中顯示的目標位址與連接埠,再確認伺服器的監聽狀態。只修改本機 SOCKS 連接埠無法解決遠端拒絕連線。

錯誤:i/o timeout

原因:某項網路操作未能在期限內完成,僅憑這句訊息無法判斷問題出在 DNS、網路線路還是伺服器。

解法:保留錯誤前方的操作對象,區分網域解析、撥號連線與交握;使用相同設定,分別透過 Wi-Fi 與行動網路測試比較。

TLS 的 serverName 用於與伺服器名稱相關的交握及憑證驗證;WebSocket 的 Host 則用於 HTTP 層請求。兩者可能相同,也可能依伺服器部署方式而異。不要為了消除錯誤就直接關閉憑證驗證,這會掩蓋網域或憑證設定問題。

修復後重新測試:保留記錄,不要連續盲目修改

每次完成一項修改後,先停止服務、清除舊日誌,再重新連線。先確認核心能持續運作,再發出一次網頁請求,最後檢查該次請求是否出現新錯誤。若更新訂閱會重新產生節點,手動修改可能被覆蓋,因此請記錄修改原因,而不只是記下「現在可以用了」。

日誌裡全是 warning,需要全部修正嗎?

不必把每則警告都當成啟動失敗。先依時間找出本次連線對應的錯誤鏈,再確認服務是否停止、請求是否失敗。只處理與目前症狀有關的警告,避免引入額外變數。

訂閱匯入成功,為什麼還是無法啟動?

匯入成功只代表用戶端接受了訂閱內容,不保證目前使用的核心支援產生的每項參數。請先選取一個節點重現問題,檢查日誌中的協定或欄位錯誤,再核對用戶端版本與節點需求。

沒有 JSON 行號,要怎麼找出錯誤位置?

若使用自訂設定,請先在本機編輯器格式化副本,再搜尋日誌提到的欄位。若是一般節點設定,請回到節點編輯頁核對相應參數;不要為了找行號而隨意改寫整份設定。

重新安裝用戶端會比較快嗎?

先備份設定並複製日誌。連接埠衝突、伺服器憑證或錯誤的訂閱參數,不會因重新安裝而自動修復;只有確認應用程式資料異常,且已保留好復原資料後,再考慮清除資料或重新安裝。

最後請保留一份簡短的排查記錄:用戶端版本、使用的核心資訊、首次出現的完整錯誤、唯一修改項目與重新測試結果。之後即使再次遇到相同錯誤,也能判斷是舊問題復發,還是故障已進入下一個階段。