本文速覽

適合已能匯入訂閱,但看到產生的設定檔仍不知如何下手的使用者。本文依序說明請求經過入站、路由與出站的流程,提供核心可讀取的本機直連範例,並解釋 VLESS、VMess 參數應放在哪一層,以及修改後如何定位 JSON 語法、連接埠占用與規則順序問題。

先看懂設定檔的外層結構

V2Ray 與 Xray 的執行設定通常使用 JSON。最常見的頂層物件包括 loginboundsoutboundsroutingdns。其中真正決定請求如何進入、如何選擇路徑,以及從哪裡離開的,是 inbounds、routing、outbounds 這三個區塊。

可以把一次連線理解為固定的資料鏈:瀏覽器或其他應用程式先連線到本機監聽連接埠,核心辨識目標位址,再依路由規則選擇一個出站。訂閱節點主要填入 outbounds,客戶端的路由模式主要產生 routing,而系統代理設定則負責讓應用程式將流量交給 inbounds。

應用程式發起請求進入本機連接埠辨識目標位址依規則分流選擇對應出站
10808
SOCKS 入站範例連接埠
10809
HTTP 入站常用連接埠
127.0.0.1
僅監聽本機位址
3 層
入站、路由、出站

以下範例不包含遠端節點,而是將 SOCKS 請求直接從本機送出。適合用來驗證 JSON 結構、連接埠監聽與路由載入是否正常。核心可以讀取並執行這份設定,但不會提供遠端代理功能。

{
  "log": {
    "loglevel": "warning"
  },
  "inbounds": [
    {
      "tag": "socks-in",
      "listen": "127.0.0.1",
      "port": 10808,
      "protocol": "socks",
      "settings": {
        "auth": "noauth",
        "udp": true
      },
      "sniffing": {
        "enabled": true,
        "destOverride": ["http", "tls"]
      }
    }
  ],
  "outbounds": [
    {
      "tag": "direct",
      "protocol": "freedom"
    },
    {
      "tag": "blocked",
      "protocol": "blackhole"
    }
  ],
  "routing": {
    "domainStrategy": "AsIs",
    "rules": [
      {
        "type": "field",
        "ip": ["geoip:private"],
        "outboundTag": "direct"
      }
    ]
  }
}

inbounds:本機應用程式如何進入核心

inbounds 是陣列,因此一份設定可以同時監聽多個入口。例如 SOCKS 監聽 10808,HTTP 監聽 10809。系統代理通常指向 HTTP 入口,支援 SOCKS 的應用程式也可以單獨連線至 127.0.0.1:10808。實際連接埠由客戶端產生的設定決定,不應假設所有安裝內容都相同。

listen 決定監聽範圍。設定為 127.0.0.1 時,只有本機程式可以連線;設定為區域網路位址或監聽所有位址,則會改變可存取範圍。一般桌面使用維持本機監聽即可。若出現「連線被拒絕」,應先確認核心正在執行,再確認應用程式填寫的連接埠與實際入站連接埠一致。

SOCKS 本機入口

監聽位址
127.0.0.1
監聽連接埠
10808
協定
socks
UDP
true

適合支援 SOCKS5 設定的瀏覽器、下載工具與命令列程式。

HTTP 本機入口

監聽位址
127.0.0.1
監聽連接埠
10809
協定
http
用途
系統代理

連接埠應以客戶端執行記錄與產生的設定檔為準。

驗證 SOCKS 入口時,可以先觀察核心記錄是否出現「監聽 127.0.0.1:10808」這類訊息,再讓支援 SOCKS5 的工具連線至該位址。若使用網域規則,測試工具應將網域交由代理端解析,避免本機提前解析成 IP,導致網域比對條件遺失。

outbounds:遠端協定參數與出口標籤

outbounds 同樣是陣列。第一個出站通常作為預設出口,後續出站則可用於直連、阻擋或其他節點。每個出站由 tagprotocolsettings 與可選的 streamSettings 組成。routing 不會直接填寫伺服器位址,而是透過 outboundTag 選擇此處定義的出站。

VLESS 與 VMess 的帳號資訊通常放在 settings.vnext 中,包括伺服器位址、連接埠與使用者識別碼。TCP、WebSocket、TLS 等傳輸與安全參數位於 streamSettings。兩層參數不可混放:即使遠端帳號正確,傳輸路徑錯誤仍會在握手階段連線失敗。

VLESS + TCP + TLS

出站協定
vless
傳輸方式
tcp
安全層
tls
使用者加密
none
常見連接埠
443

位址、使用者識別碼、伺服器名稱與安全參數必須與伺服器端設定一致。

VMess + WebSocket + TLS

出站協定
vmess
傳輸方式
ws
路徑
/ws
安全層
tls
常見連接埠
443

WebSocket 路徑、Host 與 TLS 伺服器名稱需要逐項核對。

{
  "tag": "proxy-main",
  "protocol": "vless",
  "settings": {
    "vnext": [
      {
        "address": "edge.example.com",
        "port": 443,
        "users": [
          {
            "id": "00000000-0000-4000-8000-000000000001",
            "encryption": "none"
          }
        ]
      }
    ]
  },
  "streamSettings": {
    "network": "tcp",
    "security": "tls",
    "tlsSettings": {
      "serverName": "edge.example.com"
    }
  }
}

上方的位址與使用者識別碼僅用於展示欄位位置,不能用來連線至真實節點。實際設定應由訂閱或伺服器端參數產生。手動核對時,先看 protocol,再看 addressport,接著核對使用者識別碼,最後檢查 network、TLS 伺服器名稱與 WebSocket 路徑。

freedom 表示直接連線至目標,常用標籤為 direct;blackhole 用於終止符合條件的連線,常用標籤為 blocked。兩者不需要遠端伺服器參數。設定中同時保留 proxy、direct、blocked 三類出站後,routing 才能分別完成代理、直連與阻擋。

結論:先核對協定層,再核對傳輸層

記錄出現驗證或使用者識別碼錯誤時,請檢查 settings;出現 TLS、WebSocket 路徑或連線關閉錯誤時,請檢查 streamSettings。依層次定位比反覆更換連接埠更有效。

routing:依順序比對規則,不要從名稱推測

routing.rules 是有順序的規則陣列。核心會從第一條開始往後檢查,命中後使用該規則的 outboundTag,通常不會再由後面的規則覆寫結果。因此,更具體的規則應放在前面,較寬泛的兜底規則則放在後面。

type: "field" 表示依欄位條件進行比對。常見條件包括 domainipportnetworkinboundTagprotocol。同一條規則放入多種不同類型的條件時,通常需要同時符合;同一欄位中的多個值則表示符合其中任一項即可。

規則位置 比對條件 出站標籤 作用
第 1 條 domain: domain:example.net blocked 阻擋指定網域
第 2 條 ip: geoip:private direct 區域網路與私有位址直連
第 3 條 domain: geosite:cn direct 符合對應網域集合
未命中 無明確條件 預設出站 通常使用第一個 outbound
{
  "routing": {
    "domainStrategy": "IPIfNonMatch",
    "rules": [
      {
        "type": "field",
        "domain": ["domain:example.net"],
        "outboundTag": "blocked"
      },
      {
        "type": "field",
        "ip": ["geoip:private"],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "domain": ["geosite:cn"],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "network": "tcp,udp",
        "outboundTag": "proxy-main"
      }
    ]
  }
}

domainStrategy: "AsIs" 主要依請求中已有的網域或 IP 處理;IPIfNonMatch 會在網域規則未命中時嘗試解析 IP,再讓 IP 規則參與判斷。選擇策略時要考量 DNS 設定與 sniffing 結果,不要簡單地把解析次數較多的選項視為較快。

最後一條 network: "tcp,udp" 是寬泛的兜底規則。若將它移到第一條,絕大多數 TCP 與 UDP 請求都會直接命中 proxy-main,後面的私有位址直連規則便會失效。這也是「規則看似都存在,但分流沒有生效」的常見原因。

結論:路由異常先查第一條命中的規則

將目標網域、解析結果與規則順序放在一起檢查。只確認某條規則存在還不夠,它必須排在較寬泛的規則之前,並引用實際存在的 outbound 標籤。

客戶端產生的設定檔該修改哪裡

v2rayN 7.x 會根據節點、路由與核心選項產生執行設定。直接修改執行期間的檔案可能只對目前程序有效,下次切換節點、更新訂閱或重新啟動核心時就會重新產生。需要長期保留的修改,應盡量從客戶端對應的介面完成。

查看基本選項可進入「設定」→「參數設定」;調整節點參數可在「伺服器」清單選取目標後進入編輯介面;路由相關內容應在「設定」→「路由設定」中管理。不同小版本的選單名稱可能略有調整,但修改目標仍分別對應入站、節點出站與路由規則三個層次。

  1. 先複製目前可用的設定檔或匯出客戶端設定,保留可回復的基準。
  2. 一次只修改一個欄位,例如只調整監聽連接埠,儲存後立即重新啟動核心。
  3. 先確認 JSON 可以載入,再測試本機連接埠,最後測試特定網域的路由結果。
  4. 若修改路由,請記錄目標網域、命中的規則與最終 outboundTag。
  5. 更新訂閱後重新核對自訂設定,確認客戶端沒有以訂閱欄位覆蓋本機調整。

v2rayNG 使用 Xray 核心時也會產生相應的執行設定,欄位概念與桌面端相近;v2flyNG 使用 v2fly 核心時,應以該核心實際支援的協定與欄位為準。部分 Xray 擴充參數不能直接複製到 v2fly 核心設定中,看到未知欄位錯誤時,應先確認核心家族。

載入失敗與分流異常的排查順序

設定問題可以分成三類:JSON 無法解析、核心可以啟動但入站無法使用,以及核心與入站正常但路由結果不符合預期。依此順序檢查,可以避免將語法錯誤誤判為節點故障。

儲存後核心立即退出,先看哪裡?

先查看核心記錄最前面的錯誤行。若提示 invalid character、unexpected token 或缺少分隔符號,請檢查雙引號、逗號與方括號。JSON 最後一項後不能保留逗號。

10808 連接埠無法連線怎麼辦?

確認 inbounds 中的 listen 為 127.0.0.1、port 為 10808,並查看記錄是否提示 address already in use。若連接埠被占用,改為 10810 後還要同步修改應用程式中的 SOCKS 位址。

節點可用,但指定網域無法直連?

檢查網域是否已被 sniffing 辨識,再確認寬泛的代理規則是否排在直連規則之前。將具體的 domain 規則移到 network 兜底規則上方,重新啟動核心後再次建立連線。

記錄提示找不到 outboundTag?

逐字核對 routing 中的 outboundTag 與 outbounds 中的 tag。proxy-main、proxy_main 與 Proxy-Main 會被視為不同名稱;刪除出站時,也要同步清除引用它的規則。

網域規則存在,IP 規則卻沒有參與比對?

檢查 domainStrategy。需要在網域未命中後繼續解析 IP 時,可以使用 IPIfNonMatch,並確認 DNS 能夠回傳結果。修改後應中斷舊連線再測試,避免沿用既有工作階段。

通過連接埠測試後,再觀察遠端握手記錄。VLESS 與 VMess 的位址、連接埠、使用者識別碼、傳輸方式與安全層必須組成完整配對。只修改其中一個欄位,可能讓 TCP 建立連線成功,卻在 TLS、WebSocket 或協定驗證階段中斷。

驗證 routing 時不要只看網頁是否開啟。更可靠的方法是開啟核心存取記錄,確認目標網域或 IP 對應的 outboundTag。修改規則後關閉舊連線並重新發出請求,因為已建立的長連線不會自動切換至新的出站。

看懂設定的關鍵不是記住所有欄位,而是維持清楚的層次:inbounds 解決「流量如何進入」,outbounds 解決「流量從哪裡離開」,routing 解決「這個請求選擇哪個出口」。遇到錯誤時沿著實際請求方向逐層檢查,通常能將問題縮小到一個連接埠、一條規則或一組協定參數。