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

以最精簡可用設定為例,依序解析 log、inbounds、outbounds、routing、dns 的欄位用途與彼此引用關係。

本文摘要

適合已接觸訂閱、準備閱讀核心設定的使用者。先執行僅監聽本機的 SOCKS 入站設定,以直連與拒絕兩種出站驗證設定結構,再了解標籤引用、規則順序及 DNS 的作用範圍。範例不含遠端代理節點;完成測試後,再將伺服器提供的協定參數加入出站設定,避免混淆 JSON 語法、節點連線與分流問題。

一、先儲存一份可獨立測試的 config.json

以下採用 V2Ray 傳統 JSON 設定格式,適用於支援此格式的 V2Fly 核心。先執行 v2ray version 確認實際執行的程式,再查看 v2ray help。V2Fly 與 Xray 的欄位雖有部分相同,但擴充功能和命令列參數並不完全一致;請勿直接將其他核心的設定視為通用格式。

將以下內容以 UTF-8 編碼儲存為 config.json。此設定會在 127.0.0.1:10808 提供 SOCKS 入口,拒絕連線至 example.org 及其子網域,其他請求則預設直連。此處的「可用」是指入口、路由和出站連線都能運作,不代表已具備連線遠端代理的能力。

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

二、log:先確認錯誤訊息要去哪裡看

log 負責輸出記錄,不處理代理或分流。範例只設定 loglevel,未指定記錄檔路徑;從終端手動啟動時,直接查看程序輸出即可。如果透過服務啟動,請查看該服務的記錄,而不是到任意目錄尋找預設記錄檔。

欄位或值用途使用建議
loglevel: warning只保留警告、錯誤等較高層級的訊息適合日常執行,一般連線不一定會產生記錄
loglevel: info提供更多執行資訊適合短時間檢查連線與設定行為
loglevel: debug提供更詳細的診斷資訊重現問題後,恢復原本的層級
access / error分別指定存取記錄與錯誤記錄的位置設為檔案路徑時,先確認目錄已存在且程序有寫入權限

啟動失敗時,先查看第一則明確的錯誤訊息:解析錯誤通常會指出欄位或位置;address already in use 表示監聽連接埠已被占用;權限錯誤則應檢查設定檔和記錄目錄。反覆修改節點位址,無法解決本機連接埠衝突。

三、inbounds:應用程式連線至本機入口

inbounds 描述核心如何接收請求。範例中的 protocol: socks 是應用程式與本機核心之間使用的 SOCKS 協定,並非遠端伺服器協定。瀏覽器或終端機必須明確設定使用此入口;單純啟動程序不會自動變更系統代理,也不會接管所有應用程式的流量。

本機 SOCKS 入站

標籤
socks-local
監聽位址
127.0.0.1
監聽連接埠
10808
協定
socks

僅接受本機連線;測試用的應用程式必須選擇 SOCKS 代理,而非 HTTP 代理。

預設直連出站

標籤
direct
協定
freedom
協定設定
{}
陣列位置
第 1 項

未符合任何規則時使用此出站;此設定會直接連線至目標,不經遠端代理伺服器。

listen 決定哪些裝置能連入,port 則指定入口連接埠。此處使用迴送位址,其他區域網路裝置無法透過這台電腦的內部網路位址連線。請勿為了疑難排解而隨手改成 0.0.0.0,卻仍保留未設定驗證的狀態;這會擴大監聽範圍。

settings.auth 設為 noauth,代表本機 SOCKS 不需要使用者名稱與密碼;udp: false 則表示此範例不提供 SOCKS UDP 轉送。本篇只以 TCP 請求驗證流程,不能據此判定遊戲、語音或其他 UDP 應用程式是否可用。

四、outbounds:分清協定參數與出站標籤

outbounds 描述請求離開核心的方式。範例中的 freedom 代表直連,blackhole 用來拒絕或丟棄請求。兩者都不是遠端節點,因此不需要填寫伺服器位址、使用者識別碼或傳輸安全參數。

  1. 先看 protocol。它決定 settings 可使用哪些協定欄位。請勿將 SOCKS 入站的驗證欄位複製到 VMess 出站。
  2. 再看 settings。此欄位放置對應協定的連線參數。新增實際代理節點時,應以伺服器提供的資訊和目前核心的文件為準,不要猜測預設值。
  3. 最後看 tag。這是設定內部引用的名稱。範例中的 direct 和 blocked 都是自訂標籤,並非系統保留的協定名稱。
  4. 確認 streamSettings。需要時,可在出站物件中設定傳輸方式和傳輸安全參數;它與協定的 settings 是同一層級的欄位,不應任意巢狀放置。

VMess 與 VLESS 是不同的代理協定,不能只修改 protocol 就完成轉換。使用 VLESS 時,也要確認實際核心版本及其支援範圍。尤其是 Xray 特有的傳輸擴充功能,不能因欄位看起來相似,就原封不動地搬進 V2Fly 設定。

結論:保留直連基準,再加入實際節點

先確認 10808 入口可通過直連測試,再新增代理出站並用規則指向它。如此一來,新增設定失敗時,就能優先檢查協定與伺服器參數,不必同時懷疑入口設定。

五、routing:依規則順序將請求交給出站

請求進入核心後,路由模組會依據目標網域、目標 IP、連接埠、入站標籤等條件選擇出站。範例的處理流程如下;此設定沒有虛擬網卡,也不會自動設定系統代理。

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

範例規則要求請求來自 socks-local,且目標網域符合 domain:example.org,接著交由 blocked 處理。同一條規則中的這兩項條件必須同時符合;若 domain 陣列列出多個網域,符合其中一個即可滿足網域條件。

設定項目引用對象或意義常見錯誤
inboundTag比對入站物件的 tag把協定名稱 socks 誤當成入站標籤
outboundTag指向出站物件的 tag填入不存在的標籤,或大小寫不一致
domain:example.org比對此網域及其子網域誤以為只會比對完全相同的主機名稱
full:example.org只比對完整網域名稱預期此設定也會涵蓋所有子網域
rules 陣列由上而下檢查,符合規則後選擇對應出站將涵蓋範圍較大的規則放在特殊規則之前

若沒有符合任何規則,預設使用 outbounds 的第一個項目。本文第一項是 direct,因此一般請求會直連;若將代理出站移至第一項,未符合規則的請求也會改走該出站。排查「為什麼所有網站都走同一個出口」時,除了檢查規則,也要確認陣列的第一個項目。

domainStrategy: AsIs 表示路由階段會依現有的目標資訊進行比對,不會為了符合 IP 規則而主動解析網域。如果應用程式傳給 SOCKS 的已是 IP,單靠這條網域規則就無法還原原始網域。本例未設定嗅探,因此測試時必須讓應用程式將網域交給 SOCKS 入口。

六、dns:設定解析伺服器不等於接管系統 DNS

頂層 dns 設定的是核心內建的 DNS 模組。範例列出 1.1.1.1 與 8.8.8.8 兩台伺服器,但加入這段設定不會變更作業系統的 DNS,也不代表所有應用程式的查詢都會自動進入核心。

因此,此範例的 DNS 區段主要用來展示結構,不保證每次測試都會呼叫它。路由的 domainStrategy 與直連出站的 settings.domainStrategy 屬於不同層級:前者影響規則的比對方式,後者影響直連出站如何處理目標位址。不要只因為欄位名稱相同,就認為修改其中一個能改變所有解析流程。

結論:先確認由哪個環節解析網域

網域規則未命中時,先使用 socks5h://127.0.0.1:10808 重試,讓 curl 將目標網域交給 SOCKS。確認請求的傳遞方式後,再決定是否調整 DNS 或路由策略。

七、測試設定並驗證兩種請求

使用支援 test 和 run 子命令的 V2Fly 版本時,可在設定檔所在目錄執行以下命令。Windows 若要從目前目錄呼叫程式,請將程式名稱寫成 .\v2ray.exe;其他版本則先依本機說明確認參數。啟動前,請避免桌面用戶端同時占用 10808。

v2ray version
v2ray help
v2ray test -c config.json
v2ray run -c config.json

test 成功只表示目前核心接受這份設定,不代表網路連線正常。請保持核心執行,並在另一個終端機執行以下命令。Windows 可使用 curl.exe,避免終端機別名覆蓋命令名稱。

curl --connect-timeout 10 --max-time 20 --proxy socks5h://127.0.0.1:10808 -I https://example.com/
curl --connect-timeout 10 --max-time 20 --proxy socks5h://127.0.0.1:10808 -I https://example.org/
  1. 第一組驗證直連。只要目前網路能連上目標,第一個命令就應收到 HTTP 回應標頭。實際狀態碼由目標網站決定,不必固定為 200。
  2. 第二組驗證拒絕連線。第二個請求應無法取得正常的 HTTPS 回應。實際錯誤會因 curl 和核心版本而異,不能只根據某一句錯誤訊息判斷結果。
  3. 確認時間限制。命令將連線逾時設為 10 秒、總逾時設為 20 秒,避免長時間等待;這不是延遲測量,也不代表效能評估。
  4. 逐項調整設定。先將拒絕規則的 outboundTag 改為 direct,重新測試並重新啟動。若第二個請求恢復回應,就能確認標籤引用與規則確實有參與處理。

修改磁碟上的 JSON 後,不要假設執行中的程序會自動重新載入。依照本文的手動執行方式,應先停止舊程序,再測試設定並重新啟動。如果在 v2rayN 使用訂閱節點,用戶端可能會重新產生執行設定;請區分用戶端產生的檔案和自行維護的自訂設定,修改前先保留副本。

八、常見設定問題與處理方式

設定測試通過了,為什麼瀏覽器還是沒走這個入口?

設定測試不會設定系統代理。先執行本文的 curl 命令確認入口正常,再檢查瀏覽器設定的代理類型和連接埠。此設定中的 10808 是 SOCKS 連接埠,不能直接填入只接受 HTTP 代理的設定欄位。

為什麼設定了 blocked,網站還是能開啟?

先確認請求確實經過 127.0.0.1:10808,再使用 socks5h 傳送網域。接著檢查 inboundTag 是否為 socks-local,以及前面是否已有更早符合的規則。修改後重新啟動程序再測試。

啟動時顯示 10808 已被占用,該怎麼處理?

關閉舊的核心程序,或將入站的 port 改為未占用的 10818,並同步將測試命令的連接埠改為 10818。請勿只修改應用程式端的連接埠,卻保留核心原本的監聽連接埠;兩端必須一致。

訂閱連結可以直接放進 outbounds 嗎?

不行。訂閱是用戶端取得節點資訊的管道,outbounds 則需要核心能辨識的結構化物件。請先在 v2rayN 匯入訂閱,再查看它為目前節點產生的設定;分享疑難排解片段前,請移除訂閱網址、伺服器驗證資訊及其他敏感參數。

最後依序確認:JSON 可解析、核心可啟動、入站可連線、規則可命中、出站可連到目標。每次只調整一個層級,並保留可正常運作的基準設定檔。日後即使加入 VMess、VLESS 或更複雜的 DNS 分流,也能將問題範圍縮小到特定欄位,不必反覆整份替換設定來試錯。

選擇用戶端與平台

依裝置作業系統選擇安裝套件。桌面端使用 v2rayN;Android 裝置可依核心需求選擇 v2rayNG 或 v2flyNG。先按照教學完成基本連線,再回到本文核對設定結構與規則引用。

下載v2rayN依作業系統選擇用戶端