· 進階設定 · 約 12 分鐘

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

從 log、dns 到 inbounds、outbounds、routing,逐段說明 V2Ray 設定 JSON 的欄位用途與流量路徑,並附常見範例。

本文摘要

閱讀設定檔前,先確認核心與設定格式,再依「入口接收、規則判斷、出口連線」的順序檢查。本文適合需要閱讀 v2rayN 產生的設定、排查分流錯誤或學習手動撰寫設定的使用者,並以僅含本機 SOCKS 入口、直連與阻斷出口的完整範例說明欄位關聯;範例不包含遠端代理節點,無法用來確認代理服務是否可用。

先釐清:用戶端設定、訂閱與核心設定

v2rayN 是桌面用戶端,負責管理節點、訂閱、路由與核心執行;實際接收流量並建立連線的是核心。用戶端儲存的介面偏好、訂閱網址與群組記錄,不等於核心啟動時讀取的 JSON。直接修改用戶端產生的暫存設定,可能在切換節點、更新訂閱或重新啟動核心後遭到覆寫。

本文採用 V2Ray 常見的傳統 JSON 設定結構。V2Ray 的不同設定格式,以及 Xray 的擴充欄位,不能只憑副檔名混用。尤其是 VLESS、傳輸層與安全層相關參數,應以目前執行的核心及其版本文件為準;同樣是 JSON,不代表欄位完全相容。

資料類型主要內容適合檢查的問題
用戶端設定訂閱群組、目前使用的節點、系統代理開關是否選對節點,應用程式是否透過用戶端連線
訂閱或分享連結節點位址、連接埠、協定與傳輸參數節點資訊是否完整,訂閱是否成功更新
核心設定 JSONlog、dns、inbounds、outbounds、routing入口監聽、出口參照與規則順序是否正確

在 v2rayN 中,可先前往「設定」→「參數設定」確認本機監聽相關設定,再到「設定」→「路由設定」查看分流規則;不同版本的選單名稱可能有所調整,請以實際介面為準。核心名稱、啟動參數與設定檔位置,優先從啟動記錄確認;不要把訂閱檔當成完整的執行設定。

流量路徑:inbounds 接收、routing 選擇、outbounds 執行

應用程式提出請求 入口接收 規則比對 出口連線 回傳回應

inbounds 是入口陣列,用來描述核心在哪裡、透過什麼協定接收請求。例如,應用程式連線至本機 127.0.0.1:10808 的 SOCKS 服務後,流量才會進入這個入口。只啟動核心,不會讓所有程式自動使用它;系統代理、應用程式個別代理與 TUN 是不同的連線方式。

outbounds 是出口陣列,可包含遠端代理、直連與阻斷等出口。routing 則依據網域、IP、連接埠或入口標籤等條件選擇出口。標籤 tag 是設定內部的識別名稱,不是協定名稱,也不會自動建立同名出口。

結論:先核對標籤參照,再排查網路

出口名稱拼寫不一致或預設出口位置錯誤,都可能讓規則行為與預期不同。先確認每個 outboundTag 對應到哪個實際出口,再測試節點連線。

完整範例:本機 SOCKS、直連與網域阻斷

以下是用來理解結構的完整傳統 JSON 範例:只在本機監聽 SOCKS,阻斷精確網域 example.com,其他透過此入口送入的請求則直接連線。範例不含 VMess 或 VLESS 伺服器參數,因此即使成功瀏覽網頁,也只能證明本機入口與直連路徑可用。

10808
範例 SOCKS 監聽連接埠
2 個
出口:直連與阻斷
1 條
精確網域阻斷規則
{
  "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": {}
    },
    {
      "tag": "block",
      "protocol": "blackhole",
      "settings": {}
    }
  ],
  "routing": {
    "domainStrategy": "AsIs",
    "rules": [
      {
        "type": "field",
        "domain": [
          "full:example.com"
        ],
        "outboundTag": "block"
      }
    ]
  }
}

JSON 物件使用大括號,陣列使用方括號,字串則使用英文雙引號。為減少解析差異,範例不使用註解或尾隨逗號。語法正確只是第一步,欄位名稱、欄位型別與協定參數仍須由核心驗證。

入口與出口:監聽位址不等於伺服器位址

入口的 listen 是本機繫結位址;遠端代理伺服器的位址則屬於相應出口的協定設定。把伺服器網域填入本機監聽位址,無法建立代理連線,反而可能導致入口無法繫結。127.0.0.1 僅允許本機存取;改成 0.0.0.0 則會開放至所有 IPv4 網路介面,需一併評估驗證機制、防火牆與區域網路的存取範圍。

本機 SOCKS 入口

tag
socks-local
listen
127.0.0.1
port
10808
protocol
socks
auth
noauth

僅供本機測試;應用程式端也須選擇 SOCKS 協定與相同連接埠。

直連出口

tag
direct
protocol
freedom
settings
空物件
陣列位置
第一個出口
作用
由本機直接連線至目標

本例中,未命中阻斷規則的連線會使用此出口。

udp: true 表示 SOCKS 入口允許 UDP 轉送,不代表所有應用程式的 UDP 流量都會經由此入口。應用程式須支援 SOCKS5 UDP 關聯,後續出口與網路路徑也須支援 UDP。只在系統中設定 HTTP 代理,不會自動將 UDP 請求送入這個 SOCKS 入口。

實際新增 VMess 或 VLESS 出口時,還需要伺服器位址、連接埠、使用者識別碼與相符的傳輸設定。VMess 常見設定使用 settings.vnext;VLESS 也有對應的使用者與伺服器結構,但兩者的驗證方式不同,不能只修改 protocol 字串。啟用 TLS 時也須確認伺服器名稱;伺服器連接埠為 443,不代表設定必然已啟用 TLS。

路由規則:順序、網域比對與預設出口

範例中的 full:example.com 只會精確比對這個網域,不會自動涵蓋 www.example.com。若要涵蓋網域及其子網域,傳統路由規則可使用 domain:example.com。請勿將這種網域比對誤認為 URL 比對:路由通常無法依網頁路徑 /account 區分同一網站的不同頁面。

欄位或寫法含義檢查重點
full:example.com完整網域比對不含子網域,也不含 URL 路徑
domain:example.com網域及子網域比對涵蓋範圍比精確網域更廣
ip: ["192.168.0.0/16"]目標 IP 網段比對網域目標是否觸發解析,取決於路由策略
port: "443"目標連接埠比對連接埠無法證明應用層協定或加密狀態
inboundTag: ["socks-local"]依入口限制規則範圍入口標籤必須存在且拼寫一致

domainStrategy: "AsIs" 表示路由階段不會為了 IP 規則主動解析網域。這不代表整個連線過程都不會進行 DNS 查詢:出口實際連線至目標時,仍可能需要解析。使用 IPIfNonMatch 時,網域規則未命中後可解析 IP,再嘗試比對;使用 IPOnDemand 時,遇到需要 IP 的規則就可能觸發解析。

規則排序應由具體到廣泛。若第一條規則已將某個入口的所有流量導向直連,後續針對同一入口的網域阻斷規則就不會執行。使用 geoip:、geosite: 規則時,也須確認相應資料檔可用;資料缺失與網路無法連線是兩種不同錯誤。

結論:為每條規則設計可重現的請求

先用精確網域測試阻斷,再用另一個網域確認預設出口。每次只調整一條規則,並確認應用程式交給入口的是網域,而非本機解析後的 IP。

DNS 與記錄:定義解析器不代表接管所有查詢

dns.servers 用來為核心內建 DNS 指定上游解析器,範例使用 1.1.1.1。一般 IP 位址的寫法通常代表傳統 DNS 查詢,而非加密 DNS。能否連線以及查詢如何送出,也會受到網路與相關設定影響;不能只憑這個欄位判斷解析路徑。

應用程式也可能先透過作業系統 DNS 取得 IP,再將 IP 傳給 SOCKS。此時核心收到的目標不是原始網域,前述網域規則就可能無法命中。嗅探可在適用的協定中協助辨識網域,但無法保證還原所有請求的原始網域,也不會因為設定內建 DNS 就自動具備這項能力。

  1. 先確認輸入內容。請求記錄顯示的是網域還是 IP?使用 SOCKS 的應用程式是否啟用了由代理端解析網域?
  2. 再確認失敗階段。網域解析失敗、連線逾時與 TLS 交握失敗發生在不同階段,不能一概歸因於 DNS。
  3. 短暫提高記錄層級。將 loglevel 從 warning 改為 info 或 debug,重現一次問題後再恢復,避免持續記錄大量連線細節。
  4. 視需要設定記錄檔。access 與 error 可指定存取記錄與錯誤記錄的路徑;目標資料夾必須存在,執行帳戶也須具備寫入權限。

驗證步驟:先檢查語法,再確認實際流量

建議將範例另存為 config.json,先在獨立測試環境驗證,不要覆蓋用戶端目前使用的設定。支援相應命令的 V2Ray 可使用以下方式測試設定;不同發行版本的命令列入口可能不同,若出現未知命令,請先執行 v2ray help 查看本機支援的參數。

v2ray test -c config.json

設定測試通過,不代表連接埠一定能成功繫結、遠端一定可連線,或路由符合預期。啟動核心後,再使用明確指定代理協定的請求進行驗證。以下命令適用於已安裝 curl 的環境;Windows 終端機可使用 curl.exe,避免命令別名造成差異。

curl --socks5-hostname 127.0.0.1:10808 --connect-timeout 10 https://example.com/

--socks5-hostname 會將目標網域交給 SOCKS 代理處理,適合驗證本例的網域規則。預期結果是此請求無法正常取得網頁,同時記錄中應能看到請求進入核心。實際錯誤訊息取決於核心與 curl 版本,不能只看一則錯誤就判斷是哪條規則生效。

  1. 驗證阻斷。保留完整設定中的 full:example.com 規則,執行上述命令並查看記錄。
  2. 驗證直連。將測試副本的 rules 改為空陣列 [],重新啟動核心後再執行相同請求;若網路本身可連線至目標,應由第一個直連出口建立連線。
  3. 確認入口。若記錄中完全沒有請求,請檢查監聽位址、連接埠與應用程式設定,不要繼續修改路由。
  4. 還原環境。關閉獨立測試核心,還原原始設定,再啟動用戶端,避免多個程序爭用同一個連接埠。

常見問題:啟動成功,但分流沒有變化

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

許多設定是 v2rayN 根據節點與路由設定動態產生的。請在用戶端的對應設定中修改,或依目前版本支援的自訂設定方式管理獨立檔案。先確認啟動記錄實際載入的是哪個檔案,再判斷修改是否生效。

JSON 格式正確,為什麼核心仍然報錯?

通用 JSON 解析器只會檢查括號、逗號、字串等語法,無法辨識協定欄位。欄位型別錯誤、參照不存在的出口、缺少規則資料檔,或目前核心不支援某個參數,都可能導致設定無法通過核心檢查。

系統代理已開啟,為什麼部分應用程式沒有記錄?

部分應用程式不遵循系統代理,或使用自己的代理設定。請先用明確指定 SOCKS 的請求驗證入口,再檢查特定應用程式。若要測試 TUN,請先記錄系統代理模式下的結果,避免同時變更連線方式與路由規則。

如何將範例改成「預設走代理」?

先新增參數完整且與目前核心相容的遠端代理出口,再透過明確的預設規則或出口順序指定預設路徑。只把 direct 標籤改成 proxy 不會改變協定行為;使用 freedom 的出口仍然是直連。

閱讀設定時,可固定檢查三個問題:應用程式是否進入預期入口、請求是否命中預期規則,以及選定的出口是否具備正確參數。將解析、路由與連線分開驗證,通常比同時調整多個選項更容易找出原因。

v2rayN 用戶端下載

依作業系統與處理器架構選擇用戶端。初次設定建議先依照教學完成節點匯入與本機代理驗證,再調整路由與自訂 JSON。

查看下載選項 查看教學
下載v2rayN依平台選擇用戶端