設定參考 · 系統查閱手冊

V2Ray 設定檔完整參考

從 JSON 頂層結構開始,逐段說明 inbounds、outbounds、routing、dns 與 policy 的處理關係、關鍵參數與排錯範圍。

第一次設定用戶端時,建議先依照入門指南完成訂閱匯入、節點選擇與連線驗證;本頁用於了解用戶端產生的設定、檢查進階參數,以及在日誌出現異常時定位具體設定區段。

本頁目錄

01

JSON 頂層結構與設定讀取順序

先確認資料型別、標籤引用與處理鏈,再討論個別協定參數。

頂層物件不是執行步驟清單

V2Ray 設定檔以一個 JSON 物件作為根節點,常見頂層欄位包括 logdnsinboundsoutboundsroutingpolicystats。這些欄位在檔案中的先後位置不會改變處理順序。核心載入設定時會先解析整個物件,再建立監聽入口、出站物件、路由器與名稱解析器。把 routing 寫在 inbounds 前面,不會讓路由先於入站執行;真正決定關聯的是標籤與規則引用。

inboundsoutbounds 都是陣列,因為一個程序可以同時監聽多個本機連接埠,也可以保留多個出口。陣列中的每個物件通常都帶有 tag。路由規則透過 inboundTagoutboundTagbalancerTag 引用這些標籤。標籤應在同一份設定中保持唯一,並使用簡短且穩定的名稱,例如 socks-inproxydirectblock。修改標籤後必須同步檢查所有引用,否則設定可能能夠解析,卻在建立路由時提示找不到目標。

一份易讀的最小結構

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

這份範例只建立本機 SOCKS 入口與兩個基本出口,未設定遠端代理連線。它適合用來觀察結構層級:協定專屬參數放在對應物件的 settings 中,傳輸層參數通常放在 streamSettings 中,連線重用等擴充能力則有自己的子物件。不要把其他層級的欄位平移到 settings,因為即使 JSON 語法正確,核心也可能忽略不屬於該物件的欄位,或直接回報反序列化錯誤。

物件、陣列與資料型別

設定錯誤往往不是協定問題,而是 JSON 資料型別不相符。連接埠通常是數字,因此寫成 10808,不應任意寫成字串 "10808";布林開關使用 truefalse,不能寫成加引號的文字。規則中的網域與 IP 條件大多採用陣列,即使只有一項也應保留方括號。物件屬性之間需要逗號,最後一個屬性後不能保留多餘逗號。中文全形引號、不可見空格,以及從富文字複製而來的彎引號,也會讓解析器在看似正常的位置報錯。

用戶端產生設定時,往往會把訂閱節點、路由預設與本機連接埠合併成最終檔案。v2rayN 適合在 Windows、macOS 與 Linux 上查看和調整這類桌面設定;Android 上的 v2rayNG 與 v2flyNG 通常由介面儲存設定,再於啟動時產生執行設定。介面中的名稱不一定與底層欄位完全相同,例如「繞過區域網路」最後可能呈現為一條 geoip:private 直連規則。需要核對時,應以用戶端實際匯出的執行設定與日誌為準,而不要把介面截圖當成完整設定。

建立可維護的閱讀方法

閱讀較長的設定時,可以先列出所有入站與出站標籤,再沿著路由規則逐條追蹤目標標籤,最後檢查 DNS 與傳輸參數。不要從某個深層欄位開始猜測整個連線行為。一個請求先進入某個入站,帶有目標網域、目標 IP、連接埠與可能的協定識別結果;路由器依條件選出出站;出站再按照協定與傳輸設定連線至目標。DNS 可能在規則比對或出站連線階段參與其中,policy 則會影響連線統計、閒置逾時與工作階段行為。依照這條鏈路閱讀,就能區分「設定可載入」與「連線可完成」。

02

inbounds 入站:本機監聽與流量入口

入站決定哪些應用程式可以接入、使用哪種本機協定,以及請求帶著哪些識別資訊進入路由器。

listen、port 與暴露範圍

入站物件首先需要確認的是 listenport。桌面用戶端為本機應用程式提供代理時,通常監聽 127.0.0.1,表示只有目前裝置可以連線。將監聽位址改為涵蓋外部網路介面的位址,會改變入口的可達範圍,也需要同時考量本地網路邊界、系統防火牆與身分驗證。僅為瀏覽器、終端機或本機軟體提供代理時,沒有必要擴大監聽範圍。

連接埠必須未被其他程序占用。同一份設定中的兩個入站也不能在相同位址監聽同一個連接埠。常見用戶端會分別建立 SOCKS 與 HTTP 入站,或使用支援混合入口的實作。系統代理通常使用 HTTP 入口,而明確支援 SOCKS 的應用程式可以直接填寫 SOCKS 連接埠。應用程式把 HTTP 請求送到 SOCKS 連接埠時,日誌可能出現無法識別交握、連線關閉或請求格式錯誤;這類情況不是遠端節點故障,而是本機入口協定填寫錯誤。

SOCKS 入站與 UDP

{
  "tag": "socks-in",
  "listen": "127.0.0.1",
  "port": 10808,
  "protocol": "socks",
  "settings": {
    "auth": "noauth",
    "udp": true,
    "ip": "127.0.0.1"
  },
  "sniffing": {
    "enabled": true,
    "destOverride": ["http", "tls"],
    "routeOnly": true
  }
}

auth 控制 SOCKS 入口的驗證方式;僅監聽迴路位址時,經常使用 noauthudp 決定是否接收 SOCKS UDP 請求。開啟這個選項不代表所有應用程式都會自動把 UDP 交給代理,應用程式本身還需要支援 SOCKS UDP,遠端協定與傳輸鏈也必須能處理對應流量。ip 用於 UDP 關聯返回位址時,應與實際可達方式相符。本機入口填寫迴路位址較直觀;如果入口面向其他裝置,則需要重新檢查該位址能否被請求方存取。

HTTP 入站與系統代理

{
  "tag": "http-in",
  "listen": "127.0.0.1",
  "port": 10809,
  "protocol": "http",
  "settings": {
    "allowTransparent": false
  },
  "sniffing": {
    "enabled": true,
    "destOverride": ["http", "tls"],
    "routeOnly": true
  }
}

HTTP 入站處理一般代理請求與 CONNECT 通道請求,適合瀏覽器及遵循系統代理設定的軟體。它與網站伺服器使用的 HTTP 服務並不是同一回事:應用程式必須明確知道這是代理連接埠。終端機指令、開發工具與背景服務不一定會讀取桌面系統代理,因此瀏覽器可以連線,並不能證明所有程式都會經過此入站。遇到「網頁正常但命令列直連」的情況,應先檢查目標程式的代理選項或環境變數,再檢查 V2Ray 設定。

sniffing 的作用與限制

流量探測用於從部分連線中還原目標網域,讓網域路由規則有機會生效。以 TLS 連線為例,應用程式可能先在本機完成網域解析,再向某個 IP 位址發起連線;如果入站只看到 IP,單純的網域規則可能無法比對。啟用 sniffing 後,核心可以從交握資訊辨識目標網域。destOverride 指定允許辨識的協定類型,routeOnly 表示辨識結果主要用於路由判斷,而不強制替換最終連線目標。

探測不是通用解密,也不能保證每條連線都有可辨識的網域。非標準協定、加密交握變化、應用程式自行封裝或直接存取 IP 時,都可能只保留 IP 條件。設定路由時應同時考量網域規則與 IP 規則,不要把所有判斷都寄託在探測結果上。若某個應用程式啟用探測後表現異常,可以對特定入站關閉探測,或拆分為獨立入站標籤,讓路由規則分別處理各個入口。

多個入站如何協作

多個入站最有價值的用途是區分流量來源。例如為瀏覽器保留 http-in,為開發工具保留 socks-in,再透過 inboundTag 為兩類入口設定不同路由。這比單純依網域猜測應用程式來源更穩定。每個入口都應有清楚的標籤,連接埠也應在用戶端介面、系統代理與應用程式設定之間保持一致。修改 v2rayN 的本機連接埠後,舊的系統代理值或終端機環境變數不一定會同步更新;排錯時要同時核對監聽日誌與應用程式端設定。

入口類型 常見用途 優先檢查項目
SOCKS 支援 SOCKS 的瀏覽器、終端機與開發工具 協定類型、連接埠、UDP 支援
HTTP 系統代理與支援 HTTP 代理的軟體 CONNECT 支援、系統代理連接埠
獨立入口 依應用程式類別套用不同路由 標籤唯一性與 inboundTag 規則
03

outbounds 出站:協定、伺服器與傳輸層

出站描述請求最終從哪裡離開,以及連線至遠端時採用的協定、身分參數與傳輸方式。

出站標籤與三種基本去向

一份實用設定通常至少包含代理、直連與阻擋三種出站。代理出站連線至訂閱或手動設定中的遠端伺服器;freedom 出站直接存取目標;blackhole 出站終止符合條件的流量。它們分別可以使用 proxydirectblock 等標籤。標籤本身沒有特殊含義,真正的行為由 protocol 決定,但穩定的命名有助於閱讀路由規則。

陣列順序可能影響未命中路由規則時使用的預設出口。為避免依賴模糊的預設值,建議將主要代理出站放在清楚的位置,並為區域網路、阻擋清單與需要直連的目標寫出明確規則。用戶端可能在產生設定時加入額外出站,例如 DNS 專用出口或鏈式代理中間出口。手動編輯前要先確認這些標籤是否被其他物件引用,不要只憑名稱刪除。

VLESS 出站範例

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

address 是遠端伺服器位址,可以是網域,也可以是 IP;port 是遠端監聽連接埠。users 中的 id 是身分識別碼,必須與伺服器設定一致。VLESS 的 encryption 通常依協定要求填寫指定值,這不等同於傳輸層的 TLS。只有在伺服器明確啟用對應流控方式時,才填寫 flow,不能照抄其他節點的設定。

streamSettings 描述連線如何承載協定資料。network 必須與伺服器一致;security 決定是否啟用 TLS 或其他安全層;serverName 用於憑證名稱與交握目標。遠端位址、交握名稱與實際憑證名稱可能各自負責不同用途,不能因為它們經常相同,就認為任何時候都可以互換。allowInsecure 控制憑證驗證行為,正常設定應保留驗證。憑證名稱不相符時,應檢查節點參數、系統時間、伺服器名稱與中間網路,而不是直接關閉驗證來掩蓋問題。

REALITY 連線參數如何對應

{
  "streamSettings": {
    "network": "tcp",
    "security": "reality",
    "realitySettings": {
      "serverName": "www.example.com",
      "fingerprint": "chrome",
      "publicKey": "example-public-key",
      "shortId": "0123456789abcdef",
      "spiderX": "/"
    }
  }
}

REALITY 設定通常位於 realitySettingsserverNamepublicKeyshortId 與伺服器設定之間存在嚴格的對應關係,任何一項抄錯都可能在交握階段失敗。fingerprint 表示用戶端交握指紋選項,應使用核心與伺服器方案支援的值。範例中的公鑰僅用於說明欄位格式,不能用於實際連線。

遇到 REALITY 節點無法連線時,應先區分網路無法到達、時間異常、參數不相符與路由錯誤分流。先確認遠端位址與連接埠可達,再核對伺服器名稱、公鑰、短識別碼與流控參數,最後檢查目標伺服器位址是否被某條直連或阻擋規則錯誤處理。只盯著協定名稱反覆切換設定,通常無法找到真正的問題。

直連、阻擋與 DNS 專用出站

[
  {
    "tag": "direct",
    "protocol": "freedom",
    "settings": {
      "domainStrategy": "UseIP"
    }
  },
  {
    "tag": "block",
    "protocol": "blackhole",
    "settings": {
      "response": {
        "type": "none"
      }
    }
  }
]

freedom 表示由目前裝置直接連線至目標。其 domainStrategy 決定出站連線至網域時是否以及如何解析,但它與頂層 routing.domainStrategy 並不是同一個控制點:前者作用於直連出站建立連線的階段,後者作用於路由比對階段。blackhole 用於終止命中的連線,適合明確的阻擋規則。阻擋後應用程式通常只會看到連線失敗,因此必須透過路由日誌確認是否命中了 block

訂閱節點與手寫設定的界線

v2rayN、v2rayNG 與 v2flyNG 會把訂閱內容轉換為各自支援的節點模型,再產生底層出站設定。訂閱更新可能覆蓋節點協定參數,因此不宜直接在自動產生的檔案中長期維護伺服器欄位。需要調整本機路由、DNS 或入站時,優先使用用戶端提供的自訂設定、路由預設或覆寫入口。若用戶端不支援某個欄位,應先確認所用核心家族是否認得該欄位,再決定是否使用完整自訂設定。

桌面情境首選 v2rayN,是因為它同時提供節點管理、路由設定與執行日誌入口,方便對照本章欄位。安裝套件應從安裝套件頁面依平台選擇。Android 情境可在 v2rayNG 與 v2flyNG 之間依核心需求選擇,兩者產生設定的細節可能不同,匯入同一份訂閱後也應以各自的執行日誌為準。

04

routing 路由:規則比對與分流順序

路由不會改變協定本身,而是依據請求特徵,將流量交給已定義的出站。

規則由上而下比對

routing.rules 是有順序的陣列。請求抵達路由器後,規則通常會由上而下檢查,第一個符合的規則決定目標出站。因此,範圍較小、意圖明確的規則應放在前面,涵蓋範圍大的規則放在後面。例如區域網路直連應位於廣泛代理規則之前,特定網域阻擋應位於通用網域代理規則之前。若把所有連接埠代理規則放在最前面,後面的區域網路直連規則就沒有機會生效。

規則的 type 通常使用 field,接著透過 domainipportnetworkprotocolinboundTag 等條件描述目標。一條規則同時包含多種條件時,必須滿足這些條件的組合才會命中;同一欄位中的多個值通常表示任一項符合。把彼此無關的條件塞進同一條規則,容易讓規則比預期更嚴格。更清楚的做法是拆成多條規則,並讓每條規則維持單一目的。

常用的基本分流結構

{
  "routing": {
    "domainStrategy": "IPIfNonMatch",
    "domainMatcher": "hybrid",
    "rules": [
      {
        "type": "field",
        "ip": ["geoip:private"],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "domain": ["geosite:private"],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "protocol": ["bittorrent"],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "domain": [
          "domain:example.net",
          "full:status.example.org"
        ],
        "outboundTag": "proxy"
      }
    ]
  }
}

geoip:private 用於比對常見私有位址範圍,適合避免存取路由器、印表機與區域網路服務時繞經遠端。geosite:private 處理相應的私有網域集合。GeoIP 與 GeoSite 是不同的資料來源:前者依 IP 範圍分類,後者依網域集合分類。資料檔過舊可能導致分類結果落後,更新方法可參閱GeoIP 與 GeoSite 資料檔更新方法

domain: 比對指定網域及其子網域,full: 只比對完整主機名稱,keyword: 依關鍵字比對。精確服務應優先使用 full:,整個網站及其子網域則可使用 domain:。關鍵字範圍較寬,容易意外命中名稱相似但無關的網域,適合範圍明確且經日誌驗證的情境。規則中的一般字串在不同核心設定語境下可能有不同預設解讀,手寫設定時使用前綴可減少歧義。

domainStrategy 如何影響網域與 IP 規則

AsIs 表示路由階段盡量依原始目標處理。請求以網域進入時,網域規則可以參與比對;請求只有 IP 時,網域規則通常無法憑空還原名稱。IPIfNonMatch 表示網域規則未命中時,再解析網域並嘗試套用 IP 規則。IPOnDemand 則可能在遇到需要 IP 的規則時更早觸發解析。不同策略會影響 DNS 查詢時機、路由命中與連線耗時,不應只依名稱選擇。

如果希望優先使用網域集合、以 IP 地理規則作為補充,IPIfNonMatch 通常較容易理解:先檢查網域,未命中時解析並繼續檢查 IP。若設定了大量 IP 規則且需要盡早取得位址,可以評估 IPOnDemand。若完全不希望路由器為比對規則主動解析,則使用 AsIs,同時確保入站探測或應用程式請求能提供足夠的目標資訊。

依連接埠、網路與入站標籤分流

{
  "type": "field",
  "inboundTag": ["socks-in"],
  "network": "tcp",
  "port": "443",
  "outboundTag": "proxy"
}

連接埠可以寫單一值或範圍,例如 80,44310000-20000。連接埠只描述目標服務的連接埠,不能代表特定網站或應用程式;大量服務共用 443 連接埠,因此只依連接埠分流通常範圍很大。network 可用於區分 TCP 與 UDP,inboundTag 則依請求進入的本機入口分流。為不同軟體建立獨立入口,再使用入站標籤處理,往往比猜測程序名稱更通用。

規則未命中與錯誤命中

沒有規則命中時,請求會使用預設出站。預設行為必須透過設定結構與核心實作確認,不要假設一定直連或一定代理。排錯時先開啟適當等級的執行日誌,記錄請求目標、入站標籤與最終出站標籤。若規則未命中,檢查請求帶的是網域還是 IP、網域探測是否生效、Geo 資料是否存在,以及規則前綴是否正確。若錯誤命中,則從陣列頂端往下尋找第一條能涵蓋該目標的規則。

調整路由後,應使用少量明確目標分別驗證:一個區域網路位址、一個預計直連的網域、一個預計代理的網域,以及一個阻擋目標。不要以「大多數網頁都能開啟」作為分流正確的依據,因為預設出口可能掩蓋規則錯誤。節點測速也只能說明特定測試請求的連線結果,不能取代逐條驗證。有關系統代理與終端機走向不同的問題,可繼續閱讀瀏覽器與命令列終端機分開排查

05

dns 設定:解析路徑、伺服器選擇與路由協作

DNS 不只是伺服器位址清單,也牽涉網域規則、IP 規則與最終出站連線。

先區分系統解析與內建解析

應用程式發起連線時,網域可能先由應用程式或作業系統解析,也可能以網域形式交給本機代理。前一種情況下,入站看到的目標可能已經是 IP;後一種情況下,V2Ray 的內建 DNS 與路由策略才有機會直接參與解析。啟用 TUN 模式時,更多系統流量可能進入用戶端處理鏈,但具體請求是否由內建 DNS 處理,仍取決於用戶端產生的入口、DNS 劫持與路由設定。

因此,設定了 dns.servers 並不代表裝置上所有名稱查詢都會自動使用它。瀏覽器自身的安全 DNS、應用程式內建解析器、系統快取與終端機工具都可能形成獨立路徑。排查解析異常時,要先回答三個問題:查詢由誰發起、送往哪台伺服器、取得的位址最後是否被路由規則採用。只更換 DNS 伺服器而不確認路徑,容易出現設定已修改但現象沒有變化。

基本 DNS 物件範例

{
  "dns": {
    "hosts": {
      "domain:internal.example": "192.0.2.10"
    },
    "servers": [
      {
        "address": "1.1.1.1",
        "domains": ["geosite:geolocation-!cn"],
        "skipFallback": true
      },
      {
        "address": "223.5.5.5",
        "domains": ["geosite:cn"],
        "expectIPs": ["geoip:cn"]
      },
      "localhost"
    ],
    "queryStrategy": "UseIP"
  }
}

hosts 提供靜態網域對映,適合受控測試與固定的內部位址,不適合取代持續變動的公共解析。範例位址僅用於說明結構。servers 可以包含簡單位址,也可以使用物件形式附加網域範圍、預期 IP 範圍與回退控制。清單順序與比對條件共同決定查詢去向。設定多台伺服器並不是讓所有伺服器簡單地同時競爭;具體行為會受到網域條件、回退邏輯與核心實作影響。

domains 用於指定某台伺服器優先處理的網域集合,語法與路由網域規則相近。expectIPs 用於檢查返回位址是否符合預期分類,並非通用的位址篩選器替代方案。若返回結果不符合條件,解析器可能嘗試其他伺服器。資料檔缺失或過期時,基於 Geo 分類的預期判斷也會失去準確性。skipFallback 會影響該伺服器是否參與回退,設定前要理解目前的伺服器分組,而不是對每個項目一律開啟。

queryStrategy 與位址族選擇

queryStrategy 控制查詢所使用的位址族策略。常見含義包括同時考慮可用位址、只使用 IPv4 或只使用 IPv6,具體可用值應與目前核心支援保持一致。位址族選擇必須符合裝置的網路條件:如果本地網路沒有可用的 IPv6 路徑,卻強制只查詢 IPv6,網域本身可能解析成功,但後續連線仍會失敗;反過來,網路只在特定位址族上可達時,也不能單純依賴預設結果。

雙協定堆疊環境中的失敗,也可能來自「解析得到多個位址,但應用程式或出站優先嘗試了無法到達的位址」。這時需要同時觀察 DNS 返回、出站選擇與連線日誌。不要把每次逾時都歸因於 DNS;解析日誌已經給出位址而連線階段逾時,表示問題已進入出站網路或遠端服務階段。相反地,日誌顯示網域查詢失敗、沒有可用記錄,或所有預期條件都不符合時,才應集中檢查 DNS 區段。

DNS 查詢使用哪個出站

DNS 伺服器本身也是連線目標,可能被路由規則交給直連或代理出站。如果 DNS 伺服器以網域表示,還可能產生「解析 DNS 伺服器網域所需的前置解析」問題。為降低循環依賴,基本 DNS 伺服器位址通常使用可直接連線的 IP,或透過明確的專用出站與路由規則處理。使用基於 HTTPS 的解析端點時,還要考量端點網域、憑證名稱與其自身的解析路徑。

可以為 DNS 查詢設定獨立的出站標籤,再透過協定條件或入站標籤進行路由。但這種設計應保持路徑清楚:請求進入內建 DNS,DNS 查詢經指定出站送往伺服器,結果返回路由器用於比對,最終業務流量再經由業務出站。若把 DNS 查詢錯誤地送入一個必須依賴同一 DNS 結果才能連線的代理出站,就可能形成啟動階段的循環等待。用戶端預設通常會處理基本依賴,手動覆寫時不要刪除不熟悉的 DNS 路由。

快取、Fake DNS 與 TUN 情境

系統快取、應用程式快取與內建解析快取可能同時存在。修改 DNS 後立即重複存取同一網域,舊結果不一定會立刻消失。驗證時可以重新啟動目標應用程式與用戶端,或使用尚未查詢過的新網域觀察完整過程。TUN 模式可能使用 Fake DNS 將網域對映至保留位址,再於流量進入時還原網域,以便進行網域路由。這類保留位址不應被視為真實遠端 IP,也不應直接用來判斷 GeoIP 分類。

Fake DNS 適合解決只向系統提交 IP 流量時缺少網域資訊的問題,但它要求 DNS 接管、對映表與 TUN 入站保持一致。出現應用程式取得位址卻無法連線時,應檢查對映是否被同一個執行個體識別、請求是否繞過 TUN,以及保留位址是否被其他規則提前直連。有關 TUN 的系統接管邏輯與用戶端入口,可參閱TUN 模式全域接管流量原理詳解

06

policy 策略:工作階段逾時、統計與系統層級控制

policy 不負責選擇節點,而是為連線生命週期與統計資訊設定執行邊界。

levels 與使用者等級引用

policy.levels 以使用者等級為鍵,為對應等級的連線設定策略。部分入站或出站協定的使用者物件可以帶有 level,執行時會查找同名策略。等級不是速度評分,也不是權限高低的自動排序;它只是一個用來引用策略集合的數字鍵。若使用者沒有明確設定等級,通常會使用預設等級,但具體預設行為仍應配合目前設定與核心實作確認。

同一等級可以統一控制交握時間、連線閒置時間、上下載統計等項目。不要為了「看起來完整」而建立大量未被引用的等級。對於用戶端產生的單一使用者出站,通常只需了解預設等級是否啟用了統計或修改了逾時。伺服器多使用者情境會更常使用等級區分,但本頁重點是用戶端設定閱讀,因此更應留意策略是否意外縮短正常連線。

策略物件範例

{
  "policy": {
    "levels": {
      "0": {
        "handshake": 4,
        "connIdle": 300,
        "uplinkOnly": 2,
        "downlinkOnly": 5,
        "statsUserUplink": false,
        "statsUserDownlink": false,
        "bufferSize": 4
      }
    },
    "system": {
      "statsInboundUplink": true,
      "statsInboundDownlink": true,
      "statsOutboundUplink": true,
      "statsOutboundDownlink": true
    }
  },
  "stats": {}
}

handshake 用於限制建立連線階段的等待時間。設定過短時,網路波動、名稱解析或遠端交握稍慢就可能被提前終止;設定過長則會讓無法到達的連線更久才回報失敗。connIdle 描述連線在沒有資料傳輸時可以維持的時間。長連線應用程式、訊息推播、遠端終端機與持續傳輸工具對閒置時間更敏感,不能只依網頁瀏覽體驗調整。

uplinkOnlydownlinkOnly 處理只剩單向資料後的連線保留時間。它們用於連線生命週期管理,不代表頻寬限制。bufferSize 會影響每條連線的資料緩衝策略,盲目增大可能提高記憶體使用量,盲目減小也可能影響吞吐量。大多數用戶端使用者應保留核心或用戶端提供的預設值,只有在日誌與可重現測試顯示問題和連線生命週期有關時才進行調整。

統計開關需要成對理解

statsUserUplinkstatsUserDownlink 控制使用者維度的統計,policy.system 中的項目則控制入站與出站維度的統計。僅寫入 "stats": {} 不一定會自動收集所有指標;對應的 policy 開關也需要啟用。反過來,啟用統計但沒有任何介面或 API 讀取這些值,只會產生額外的記錄工作。桌面用戶端是否顯示流量統計,也取決於它如何啟動核心與讀取統計介面。

統計值適合觀察目前執行個體中的流量方向,不應被視為訂閱額度、計費記錄或遠端伺服器流量的權威來源。用戶端重新啟動、設定重新載入與核心切換,都可能讓本地統計重新開始。排查「介面沒有流量數字」時,先確認用戶端是否設計為讀取底層統計,再檢查 stats 物件與 system 開關,不要直接修改協定參數。

policy 與逾時錯誤的關係

日誌中的 timeout 可能發生在名稱解析、TCP 連線、TLS 或 REALITY 交握、代理協定交握、業務讀寫等不同階段。policy 只能解釋其中一部分工作階段逾時。若連線在固定且很短的時間後中斷,可以檢查 handshakeconnIdle;若日誌明確指出連線至遠端位址逾時,應先檢查網路與出站;若只有某個應用程式的長連線定期中斷,則比較其閒置週期與策略值。

修改逾時前,應先記錄錯誤發生階段與時間規律。簡單地把所有值調得很大,會延遲故障回報,也會讓失效連線長時間占用資源。全部調小則會損害慢速網路與長連線。合理做法是保留預設策略作為基準,只對可重現的情境進行單項調整,並在用戶端重新啟動後重新測試同一目標。

系統策略與設定可攜性

不同用戶端與核心家族可能支援不同的策略欄位或預設值。v2rayN 使用的執行核心、v2rayNG 常見的 Xray 核心,以及 v2flyNG 對應的 v2fly 核心,在相容欄位之外仍可能存在行為差異。將一份完整設定複製到另一個用戶端前,應先檢查目標用戶端是否允許完整自訂設定,以及它是否會在啟動時重寫 policy。

設定可攜性的核心不是欄位越少越好,而是清楚區分標準結構、核心擴充與用戶端產生的內容。入站連接埠、日誌路徑、TUN 參數等通常與平台環境有關;伺服器協定參數通常可以移轉;用戶端介面狀態與執行設定則不一定一一對應。跨平台移轉時,先匯入訂閱建立可運作基準,再逐項移轉路由、DNS 與策略,比直接覆蓋整份檔案更容易發現不相容欄位。

07

設定載入、用戶端覆寫與驗證流程

將語法驗證、結構驗證與實際連線驗證分開,可以快速縮小問題範圍。

第一層:確認 JSON 可以解析

語法驗證只回答設定是否為合法 JSON。重點檢查雙引號、逗號、方括號與大括號是否成對,以及數字、布林值與字串是否使用正確型別。JSON 不接受註解,也不接受物件結尾的多餘逗號。從網頁、聊天記錄或文件複製設定時,先儲存為純文字 UTF-8 檔案,避免彎引號與不可見控制字元。

語法錯誤通常會提供行號與欄號,但真正的錯誤可能位於上一行。例如解析器在新屬性開頭回報錯誤,常見原因是上一項末尾缺少逗號。遇到檔案結尾錯誤時,優先檢查某個物件或陣列是否未閉合。編輯器的括號配對功能很有幫助,但不能取代對資料型別與欄位層級的檢查。

第二層:確認標籤與欄位位於正確位置

合法 JSON 仍可能不是合法的 V2Ray 設定。第二層驗證需要檢查頂層欄位名稱、協定專屬 settings、傳輸層 streamSettings 與路由引用。常見結構錯誤包括把 tlsSettings 放在出站根部、把單一出站物件寫成物件而不是陣列、在規則中引用不存在的 outboundTag,以及把字串陣列寫成單一字串。

未知欄位的處理方式可能因核心而異:有些會直接拒絕載入,有些可能忽略欄位。被忽略比立即報錯更難排查,因為設定看似啟動成功,預期功能卻沒有生效。若日誌出現 unknown field、failed to parse、failed to build 或找不到標籤,應先回到對應物件層級檢查,不要繼續測試網路連通性。

第三層:確認用戶端實際載入哪一份設定

v2rayN、v2rayNG 與 v2flyNG 都可能依介面設定在啟動時產生執行設定。使用者編輯的檔案不一定就是核心最後讀取的檔案,尤其在訂閱節點、路由預設、系統代理與 TUN 模式同時啟用時。驗證前應從用戶端日誌確認設定產生與核心啟動是否成功,並查看用戶端提供的匯出、預覽或執行目錄入口。

訂閱更新通常會替換節點參數,但不一定會替換本地路由;完整自訂設定則可能繞過部分介面設定。需要先確認目前使用的是「訂閱節點加用戶端範本」,還是「完整自訂設定」。兩種模式混用時,經常出現介面中修改了連接埠但執行檔案沒有變化,或手寫路由被預設重新產生。訂閱更新失敗的獨立排查方法可查看訂閱更新失敗與自動更新設定

分階段建立連線基準

  1. 驗證啟動:確認核心啟動完成,本機 SOCKS 或 HTTP 連接埠已開始監聽,沒有連接埠占用與設定解析錯誤。
  2. 驗證本機入口:讓一個明確支援代理的應用程式連線至本機連接埠,檢查存取日誌是否出現對應的入站標籤。
  3. 驗證單一出站:暫時使用簡單路由,確認目標請求能經由代理出站完成連線,避免複雜規則造成干擾。
  4. 恢復 DNS 與路由:逐組加入區域網路、網域、GeoIP 與阻擋規則,每次記錄請求最終使用的出站。
  5. 恢復系統接管:最後再啟用系統代理或 TUN,讓更多應用程式進入處理鏈,並分別驗證瀏覽器與終端機。

這套順序把問題拆成啟動、本機入口、遠端出站、分流與系統接管五層。若第一層尚未完成,就沒有必要分析遠端協定;若本機入口沒有收到請求,應檢查應用程式代理設定;若簡單出站可用而恢復路由後失敗,問題集中在 DNS 或規則;若手動代理可用但系統接管後異常,則重點檢查系統代理狀態、TUN 權限與路由衝突。

日誌層級與可讀資訊

log.loglevel 可以在排錯期間調整為包含更多細節的層級。記錄越詳細,越容易觀察入站、路由與出站,但輸出量也越大。正常使用時不必長期保留高詳細度。排錯日誌應圍繞一次明確測試截取,從核心啟動開始,直到目標請求失敗或成功結束,避免在大量歷史記錄中混淆不同設定。

{
  "log": {
    "access": "",
    "error": "",
    "loglevel": "info",
    "dnsLog": true
  }
}

日誌設定的具體路徑與輸出方式可能由用戶端接管。空字串是否代表輸出至主控台,也應配合目前核心與用戶端行為確認。dnsLog 有助於觀察內建解析過程,但只有經過內建 DNS 的查詢才會出現。完整的日誌閱讀方法可參考V2Ray 執行日誌常見錯誤含義與定位

變更記錄比反覆試錯更有效

每輪測試只修改一組欄位,並記錄修改前值、修改後值、測試目標與日誌結果。例如把 domainStrategyAsIs 改為 IPIfNonMatch 後,只驗證需要 IP 規則的網域;不要同時更換節點、DNS 伺服器與 TUN 模式。若結果變差,可以準確復原;若結果改善,也能知道是哪項設定生效。

用戶端升級或切換核心後,應重新執行最小驗證流程,不要預設舊設定全部相容。不要編造或依賴固定版本號判斷欄位支援;應查看目前用戶端選擇的核心類型、啟動日誌與設定錯誤資訊。需要重新安裝用戶端時,可從安裝套件頁面選擇 Windows、macOS、Android 或 Linux 對應入口。

08

常見錯誤定位與長期維護方法

從錯誤發生的層級著手處理,而不要在所有設定區段之間隨機切換開關。

啟動失敗:先檢查語法、連接埠與引用

核心啟動後立即退出,通常應先檢查三類問題。第一類是 JSON 語法錯誤,包括缺少逗號、括號不相符與資料型別錯誤;第二類是本機資源衝突,例如監聽連接埠已被另一個程序占用、日誌目錄無法寫入,或 TUN 裝置無法建立;第三類是設定物件引用錯誤,例如路由目標標籤不存在、協定設定缺少必要欄位,或目前核心不認識某個擴充項目。

處理順序應與日誌一致。解析錯誤發生在讀取階段,先修復檔案;位址占用發生在監聽階段,檢查重複用戶端與本機連接埠;找不到出站發生在建立路由階段,核對標籤;只有核心明確進入執行狀態後,才進入遠端連線排查。看到用戶端介面顯示「未連線」不足以判斷是哪一層,必須查看最後一段錯誤日誌。

本機連接埠存在,但應用程式沒有流量

先確認應用程式填寫的是正確的代理類型與連接埠。HTTP 代理與 SOCKS 代理不是同一個入口,系統代理也不保證終端機與背景服務會自動使用。接著檢查應用程式是否繞過本機位址、是否啟用了自己的解析或代理設定,以及請求是否實際抵達 access 日誌。日誌完全沒有這次請求,表示問題位於應用程式到入站之間;日誌出現入站記錄後,才表示流量已進入 V2Ray。

如果只有部分應用程式無法運作,可以為問題應用程式設定明確的 SOCKS 或 HTTP 入口作為對照。手動入口可用而系統代理不可用時,檢查作業系統代理狀態與排除清單;系統代理下瀏覽器可用而終端機不可用時,為終端機工具設定它支援的代理選項。不要因為某個應用程式繞過系統代理,就修改遠端節點協定。

網域失敗但 IP 可用

這種現象應優先檢查解析路徑。確認應用程式提交的是網域還是已解析的 IP、內建 DNS 是否收到查詢、伺服器是否返回可用位址,以及 queryStrategy 是否選擇了目前網路可達的位址族。若網域規則依賴探測,還要檢查入站是否能辨識目標名稱。使用 Fake DNS 時,檢查保留位址是否由同一個執行個體還原。

如果 DNS 已經返回位址,但連線在出站階段逾時,問題就不再是「沒有解析結果」,而是該位址的連線路徑、路由或遠端服務。若返回位址被 expectIPs 判定為不符合預期,請檢查 Geo 資料與伺服器分組。若只有剛修改的網域仍使用舊位址,應考慮應用程式、系統與內建快取,並透過重新啟動相關程序或測試新網域排除快取影響。

規則看似正確卻沒有命中

先從請求的實際形式檢查:路由器取得的是完整網域、子網域還是 IP;規則使用的是 full:domain: 還是關鍵字;前面是否存在更寬泛的規則提前命中;Geo 資料檔是否可用。規則文字與目標看似相近,不代表比對語義相同。full:example.com 不會比對其他子網域,而過於寬泛的關鍵字可能會命中多個無關目標。

將問題規則暫時移到陣列較前的位置,可以用來判斷是否被其他規則遮蔽,但測試結束後仍要重新檢視整體順序。更可靠的方法是啟用路由相關日誌,記錄請求最後選擇的出站標籤。若請求只有 IP,網域規則自然不會命中;此時應檢查 sniffing、應用程式解析方式,或補充合理的 IP 規則,而不要不斷改寫同一個網域字串。

節點參數正確但交握失敗

先確認伺服器位址與連接埠可達,再核對協定身分參數、傳輸方式與安全層。TLS 情境檢查伺服器名稱、系統時間與憑證錯誤;REALITY 情境檢查伺服器名稱、公鑰、短識別碼、指紋與流控參數;其他協定同樣要確保用戶端參數與伺服器逐項對應。不要把不同節點的傳輸欄位拼成一份設定,因為每一層都可能有依賴關係。

如果訂閱更新後突然失敗,可保留舊節點作為對照,檢查更新是否改變了位址、連接埠、傳輸方式或身分參數。不要手動猜測缺少的欄位。若所有節點同時失敗,應優先檢查本機網路、系統時間、核心啟動與路由;只有單一節點失敗時,才較可能集中在該節點參數或遠端狀態。

設定逐漸膨脹後的整理原則

長期使用後,設定中容易累積失效標籤、重複網域規則、彼此覆蓋的 Geo 規則與不再使用的入站。整理時先繪製目前的處理鏈:列出所有入站標籤、所有出站標籤、每條規則的目標與 DNS 伺服器用途。確認沒有引用後再刪除物件。相同目標與相同出口的規則可以合併,但不要為了減少行數而把不同目的的條件塞進一條難以解釋的規則。

建議為標籤建立穩定的命名規則,並依「特殊阻擋、區域網路直連、特定代理、預設處理」的邏輯排列路由。DNS 伺服器物件依適用網域範圍分組,policy 只保留實際使用的等級。設定檔本身不支援註解時,可以在獨立的維護記錄中寫明每個標籤的用途、最後一次驗證情境與用戶端產生方式,避免之後看到欄位卻不敢調整。

用戶端更新與設定移轉

更新用戶端前,儲存目前可運作的設定、路由預設與訂閱設定。更新後先使用原有節點完成最小連線測試,再檢查進階功能。若用戶端切換了執行核心,請留意啟動日誌中的未知欄位與棄用提示。不要因為介面選項名稱改變,就立即刪除底層設定;先匯出新產生的執行檔案,再與舊設定按頂層區段比較。

從桌面端移轉到另一個桌面平台時,伺服器協定參數通常可以透過訂閱復原,但本機監聽連接埠、系統代理、TUN 權限與日誌路徑需要依新平台重新設定。從 Android 移轉到 v2rayNG 或 v2flyNG 時,同樣應先匯入訂閱,再依目標核心復原路由與 DNS。平台差異主要在系統接管與檔案位置,不應在伺服器出站中加入與平台無關的猜測欄位。

建立固定的排錯清單

啟動層

JSON、欄位層級、連接埠占用、標籤引用、執行權限。

入口層

應用程式代理類型、本機連接埠、系統代理、TUN 接管、存取日誌。

解析與路由層

網域或 IP、DNS 返回、規則順序、Geo 資料、最終出站標籤。

出站層

伺服器可達性、身分參數、傳輸方式、安全層與交握日誌。

每次故障都依這四層順序記錄,可以避免重複勞動。日誌出現 rejected 時,查看拒絕發生在本機入口、路由阻擋還是遠端;出現 timeout 時,確認逾時階段;出現身分或交握錯誤時,回到對應的出站參數。若仍無法判斷,可前往疑難解答,依基礎認知、安裝設定、使用技巧與故障排查分類繼續查找。

設定維護的目標不是堆滿可選欄位,而是讓每個區段都有明確作用,並能透過日誌證明處理結果。先保留一份結構簡單、可重複驗證的基準,再增加路由、DNS、TUN 與策略。遇到問題時回到基準逐層恢復,比從複雜設定中隨機刪除欄位更可靠。