V2Ray 設定檔 JSON 結構解析:逐段看懂 inbounds、outbounds 與 routing

依序解析 log、dns、inbounds、outbounds 與 routing,說明用戶端產生的設定檔中各欄位的作用與引用關係,帶你看懂 tag 和路由規則的比對方式。

本文速覽

本文適合已匯入訂閱、想看懂核心設定的使用者。先透過一份只包含本機 SOCKS 入站、直連與阻斷出站的 JSON 認識基本結構,再逐段檢視日誌、DNS、連接埠、標籤與規則順序。看完後,就能判斷「核心啟動失敗」、「本機連接埠無法連線」和「規則未命中」各自該檢查哪些地方。

先分清用戶端設定與核心設定

v2rayN 是桌面用戶端,負責管理訂閱、伺服器項目、路由預設值及核心程序;V2Ray 或 Xray 才是讀取核心設定並處理連線的程式。用戶端儲存的介面偏好與訂閱群組資料,不等於交由核心載入的執行階段 JSON。排查時應找到這次啟動實際載入的檔案,不要只因副檔名是 .json 就直接修改。

Android 上的 v2rayNG 使用 Xray 核心,v2flyNG 使用 V2Fly 核心。本文說明的是 V2Ray 常見的設定結構,不能因此推論兩種核心的所有欄位都通用。例如 REALITY 是 Xray 相關功能,對應設定不能直接交給 V2Fly 使用。即使欄位名稱同樣是 streamSettings,傳輸方式名稱與可用選項仍應以目前使用的核心為準。

應用程式連線 本機入站 規則比對 選擇出站 連線目標

這是閱讀設定的主流程;需要解析網域名稱時,DNS 會在相應環節參與,日誌則會記錄整個過程。系統代理只影響遵循該設定的應用程式;設定中有 SOCKS 入站,不代表所有應用程式的流量都已進入核心。入口尚未連通時,繼續修改路由通常也不會改變結果。

完整 JSON 範例:一個入口、兩個出站、兩條規則

以下是用於說明結構的設定,不包含遠端代理伺服器。它會在 127.0.0.1:10808 提供 SOCKS 服務,阻斷前往 example.org 的精確網域請求,以及 TCP 25 連接埠的請求;其餘連線預設直連。請勿用它取代現有訂閱設定,否則原有的代理出站會遺失。

{
  "log": {
    "loglevel": "warning"
  },
  "dns": {
    "servers": [
      "1.1.1.1"
    ]
  },
  "inbounds": [
    {
      "tag": "socks-local",
      "listen": "127.0.0.1",
      "port": 10808,
      "protocol": "socks",
      "settings": {
        "auth": "noauth",
        "udp": true
      }
    }
  ],
  "outbounds": [
    {
      "tag": "direct",
      "protocol": "freedom",
      "settings": {
        "domainStrategy": "UseIP"
      }
    },
    {
      "tag": "block",
      "protocol": "blackhole",
      "settings": {}
    }
  ],
  "routing": {
    "domainStrategy": "AsIs",
    "rules": [
      {
        "type": "field",
        "inboundTag": [
          "socks-local"
        ],
        "domain": [
          "full:example.org"
        ],
        "outboundTag": "block"
      },
      {
        "type": "field",
        "network": "tcp",
        "port": "25",
        "outboundTag": "block"
      }
    ]
  }
}

頂層物件的鍵值排列順序通常不會決定處理順序;本文只是依閱讀需要排列。但陣列中的項目順序可能直接影響行為,尤其是 outbounds 的第一項與 routing.rules 的先後順序。不要為了「整理格式」而任意重排這兩個陣列。

log:透過日誌區分啟動錯誤與連線錯誤

log 用來控制日誌輸出,不負責選擇節點。範例只設定 loglevel,未指定日誌檔案;實際輸出位置取決於核心的啟動方式,用戶端也可能將輸出收集到自己的日誌面板。排查時先看啟動後出現的第一則錯誤,再查看觸發存取時新增的紀錄。

欄位或狀況具體意義下一步
loglevel: warning只保留警告與錯誤,適合一般使用時減少輸出。需要更多連線資訊時,可暫時改為 info。
loglevel: debug輸出更多除錯細節,日誌也會增加得更快。重現一次問題後恢復原本的層級,分享前請移除敏感資訊。
address already in use監聽位址與連接埠已被其他程序占用。確認 10808 是否已由另一個核心執行個體監聽。
欄位解析或載入設定時發生錯誤核心尚未進入正常處理連線的階段。檢查欄位名稱、資料類型,以及目前使用的核心是否支援該選項。

如果核心一啟動就結束,先修正設定或連接埠衝突,不要先更換 DNS。如果核心運作正常,只有特定請求失敗,再檢查對應目標、路由結果與連線錯誤。日誌可能包含存取的網域、伺服器位址及本機路徑,請勿將完整的執行設定與日誌直接公開。

dns:解析伺服器與路由策略是不同設定

dns.servers 用來指定核心內建 DNS 使用的解析伺服器。範例中的 1.1.1.1 是一般 DNS 伺服器位址,通常透過 UDP 53 連接埠查詢;這裡沒有設定加密 DNS,也不代表查詢會自動經由代理。解析伺服器是否可連線,仍須在實際網路環境中測試。

最容易混淆的是兩個同名欄位:routing.domainStrategy 決定路由比對階段如何處理網域名稱;freedom 出站中的 settings.domainStrategy,則決定建立直連時如何解析目標。兩者位於不同物件中,列舉值與作用也不相同。

路由比對階段

位置
routing.domainStrategy
範例值
AsIs
作用
不會為路由比對主動解析目標網域。
其他常見值
IPIfNonMatch、IPOnDemand

AsIs 不代表整個連線過程都不會進行 DNS 查詢。

直連出站階段

位置
freedom.settings.domainStrategy
範例值
UseIP
作用
透過內建 DNS 將目標網域解析為 IP,再建立連線。
解析來源
本例的 dns.servers

不要把路由用的 IPIfNonMatch 填在這個欄位。

IPIfNonMatch 會在網域未命中規則時嘗試解析,再比對 IP 規則;IPOnDemand 則會在比對過程需要 IP 時觸發解析。兩者都不是「強制所有流量走代理」的設定。如果設定中沒有 IP 規則,先維持簡單策略,避免只為了解釋一條網域規則,就引入額外的解析行為。

inbounds:確認應用程式連到哪個入口

inbounds 是一個陣列,每個項目都描述一個接收連線的入口。本例的 listen 限定為本機迴路位址,port 是數字 10808,protocol 則是 socks。這三個欄位共同決定應用程式要連到哪裡,以及使用哪種協定連線。

  1. 確認監聽位址:127.0.0.1 僅供本機存取。改成 0.0.0.0 會擴大監聽範圍,排查問題時不應直接暴露未設定驗證的入口。
  2. 確認協定:SOCKS 連接埠不等於 HTTP 代理連接埠。讓只支援 HTTP 代理的程式連到本例的 10808,不能據此判斷節點是否可用。
  3. 確認實際連接埠:10808 是本文指定的數值,不是所有用戶端共用的固定值。v2rayN 可在「設定」→「參數設定」中確認本機監聽相關選項,最後仍應以執行設定與日誌為準。
  4. 確認 UDP:udp: true 允許這個 SOCKS 入站處理 UDP,但應用程式仍須使用 SOCKS UDP 機制,後續出站與網路也必須支援相應流量。

tag: socks-local 是入口的內部名稱,不是網域,也不是訂閱中的節點名稱。它不會改變監聽協定,而是讓其他設定可以引用這個入口。本例第一條規則的 inboundTag 使用陣列格式,因為一條規則可以接受多個入口標籤。

"inboundTag": [
  "socks-local"
]

變更入口標籤後,也要同步更新引用它的規則。如果只把入站的 socks-local 改成 local-socks,卻保留原本的規則,該規則就無法比對這個入口的流量。

outbounds:標籤、協定與預設出站

outbounds 定義連線接下來如何送出。本例中的 freedom 代表直連,blackhole 代表阻斷;兩者都不是遠端代理協定。實際訂閱產生的設定可能還會有 VMess 或 VLESS 出站,並包含伺服器位址、連接埠、使用者識別資料及傳輸參數。

項目本文範例閱讀重點
tagdirect、block供規則引用的名稱,大小寫與拼寫都必須一致。
protocol: freedom直連出站從執行核心的裝置直接連線至目標。
protocol: blackhole阻斷出站用來拒絕指定流量,不會自動改送至其他出站。
VMess、VLESS本例未設定需要有效的伺服器與驗證參數,不能只更改協定名稱。
streamSettings本例不需要描述傳輸方式與安全層,設定必須與伺服器端一致。

在本例這種未設定其他預設分派機制的情況下,未命中路由規則的連線會使用 outbounds 的第一項,因此預設為直連。將 block 移至第一項會改變預設處理方式;更改標籤名稱則不會自動改變陣列順序。

結論:先確認預設出站,再分析例外規則

開啟執行設定後,先記下 outbounds 第一項的 tag,再逐條檢查 routing.rules 的 outboundTag。這比只搜尋「proxy」可靠,因為標籤名稱是由產生設定的來源所定義。

如果實際設定使用 proxy 作為代理出站標籤,路由中的 outboundTag: proxy 就必須能找到對應的出站項目。在本例新增一條指向 proxy 的規則,不會憑空建立代理連線;應先保留並確認用戶端產生的有效代理出站設定。

routing:規則由上而下比對,分清條件的「且」與「或」

routing.rules 通常由上而下依序檢查;命中一條規則後,就會使用該規則指定的出站,不再繼續比對後面的普通規則。因此,條件較明確的規則應排在涵蓋範圍較廣的規則之前。設定中有某條規則,不代表它一定有機會執行。

同一條規則中的不同條件欄位通常是「且」的關係;同一欄位陣列中的多個候選值,通常則是「或」的關係。本例第一條規則同時要求入口為 socks-local,目標網域為 example.org;兩者都符合時,才會交由 block 處理。

送入本機 SOCKS 的請求比對過程結果
網域 example.org,TCP 443符合第一條規則的入口與精確網域條件。block
網域 www.example.org,TCP 443不符合精確網域條件,也不是目標連接埠 25。預設 direct
其他網域,TCP 25不符合第一條規則,但符合第二條規則。block
其他網域,TCP 443兩條規則都不符合。預設 direct

以上推演的前提是應用程式確實將網域名稱傳給 SOCKS 入站。如果應用程式已先解析網域,只傳送 IP,第一條網域規則可能無法使用。嗅探可在部分協定中辨識網域資訊,但不保證能還原原始網域;本例未啟用嗅探,建議先用明確指定網域的請求測試規則。

設定檢查步驟與常見問題

閱讀設定時一次只修改一個變數,並記錄修改前後的日誌。先確認核心能啟動,再確認入口可連線,最後檢查規則與出站;如果同時修改連接埠、DNS、標籤與傳輸參數,就很難判斷成功或失敗的原因。

  1. 檢查語法與類型:連接埠 10808 是數字,udp 是布林值 true,inbounds 與 outbounds 則是陣列。
  2. 核對所有引用:逐一搜尋 inboundTag 與 outboundTag,確認對應的入口或出站中確實有同名的 tag。
  3. 確認應用程式使用正確入口:測試本例時,請明確指定 SOCKS 位址,避免瀏覽器的系統代理設定影響判斷。
  4. 推演路由:從第一條規則開始,依序檢查目標網域、目標連接埠、網路類型與入口標籤。
  5. 恢復由用戶端管理:確認原理後,將長期修改套用至用戶端支援的路由或設定選項,再重新產生執行設定並驗證。

如果裝置已安裝支援 SOCKS 的 curl,且核心已載入本例設定、連接埠也未被占用,就可以執行以下命令。socks5h 會要求 SOCKS 服務處理目標網域;本例會因精確網域規則而阻斷請求,這是預期的測試結果,不代表遠端代理故障。

curl --proxy socks5h://127.0.0.1:10808 --connect-timeout 10 https://example.org/

修改 JSON 後,為什麼重新啟動 v2rayN 又恢復原狀?

用戶端可能會重新產生執行檔案。先保留修改紀錄,再到「設定」→「路由設定」檢查相關規則,或使用目前版本明確支援的自訂設定入口;不要把暫存的執行檔案當成永久設定來源。

outboundTag 設為 proxy,為什麼啟動時仍然報錯?

在 outbounds 陣列中找到 tag 為 proxy 的項目,確認拼寫與大小寫完全一致。如果找不到,應還原有效的代理出站設定,而不是只替 freedom 更名。

DNS 改成 1.1.1.1,為什麼網域規則還是沒有命中?

先檢查應用程式是否有傳送網域名稱,再確認規則順序以及 full、domain 前綴。更換解析伺服器不會自動補回應用程式已遺失的網域資訊,也不會改變規則優先順序。

VLESS 出站可以直接取代 VMess 的 protocol 欄位嗎?

不可以。這兩種協定的驗證欄位與協定參數不同,傳輸方式與安全層也必須符合伺服器端設定。請重新匯入正確的訂閱或連線資料,再確認目前執行的核心支援哪些欄位。

想了解更多設定概念,可參閱路由分流技術參考;若要透過用戶端介面確認解析設定,請依照教學中的 DNS 設定步驟操作。看懂核心結構後,再逐項對照用戶端介面,能減少把訂閱、入口和路由誤當成同一項設定的情況。

下載並安裝用戶端v2rayN · v2rayNG