本文速覽

適合已匯入節點、想進一步看懂核心設定的使用者。先沿著請求路徑認識四個頂層欄位,再拆解 VMess + WebSocket + TLS 範例,最後檢查標籤引用、規則順序與 DNS。讀完後,你將能判斷該調整入站、節點參數還是路由,而不是每次連線失敗就重寫整份 JSON。

1. 設定檔與用戶端設定:先分清楚

v2rayN、v2rayNG 是用戶端,負責管理節點、更新訂閱,以及產生核心執行設定。v2rayNG 使用 Xray 核心;v2flyNG 使用 v2fly 核心。v2rayN 可以管理不同核心,但本文討論的是 V2Ray/Xray 傳統 JSON 設定格式,並非所有核心都通用的欄位表。

這裡的 config.json 指核心實際讀取的設定檔,不是用戶端用來儲存視窗位置、訂閱群組等資訊的設定檔。檔名也不一定固定:判斷依據是啟動命令指定的檔案,以及內容是否包含 inbounds、outbounds 等欄位。用戶端更新節點或重新啟動核心時,自動產生的檔案可能會被覆寫。

應用程式請求本機入站路由比對選定出站目標服務

2. 完整 JSON 範例:兩個入站、三個出站

以下是用於解讀的完整結構。node.example.invalid 是明確的虛構網域,UUID 也是示範值,無法連線至真實節點。範例採用傳統 VMess 的 vnext 結構;實際的位址、連接埠、UUID、傳輸路徑與 TLS 名稱,必須以伺服器設定為準。

{
  "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"],
        "routeOnly": true
      }
    },
    {
      "tag": "http-in",
      "listen": "127.0.0.1",
      "port": 10809,
      "protocol": "http",
      "settings": {}
    }
  ],
  "outbounds": [
    {
      "tag": "proxy",
      "protocol": "vmess",
      "settings": {
        "vnext": [
          {
            "address": "node.example.invalid",
            "port": 443,
            "users": [
              {
                "id": "00000000-0000-4000-8000-000000000001",
                "alterId": 0,
                "security": "auto"
              }
            ]
          }
        ]
      },
      "streamSettings": {
        "network": "ws",
        "security": "tls",
        "tlsSettings": {
          "serverName": "node.example.invalid"
        },
        "wsSettings": {
          "path": "/ws",
          "headers": {
            "Host": "node.example.invalid"
          }
        }
      }
    },
    {
      "tag": "direct",
      "protocol": "freedom",
      "settings": {}
    },
    {
      "tag": "block",
      "protocol": "blackhole",
      "settings": {}
    }
  ],
  "routing": {
    "domainStrategy": "AsIs",
    "rules": [
      {
        "type": "field",
        "domain": ["full:blocked.example.invalid"],
        "outboundTag": "block"
      },
      {
        "type": "field",
        "ip": ["geoip:private"],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "domain": ["full:localhost"],
        "outboundTag": "direct"
      }
    ]
  },
  "dns": {
    "servers": ["223.5.5.5"]
  }
}
10808
範例 SOCKS 入站連接埠
10809
範例 HTTP 入站連接埠
443
範例遠端 TLS 連接埠

這些連接埠是本文的範例值,不是每個版本固定使用的預設值。JSON 中的連接埠是數字,true 是布林值,兩者都不能寫成加上引號的字串。最後一個項目後面也不能加逗號;為方便驗證,範例未加入註解。

3. inbounds:監聽位址、協定與嗅探

listen 設定接收連線的本機位址,port 設定連接埠,protocol 則決定應用程式要使用哪種代理協定連線。SOCKS 用戶端不能直接連線到 HTTP 入站;連接埠可連通,也不代表協定設定正確。手動設定應用程式時,範例對應 SOCKS5 的 127.0.0.1:10808,或 HTTP 代理的 127.0.0.1:10809。

SOCKS 入站

tag
socks-in
listen
127.0.0.1
port
10808
protocol
socks
settings.udp
true

僅監聽本機;若要支援 UDP,應用程式也必須使用 SOCKS5 UDP 轉發。

HTTP 入站

tag
http-in
listen
127.0.0.1
port
10809
protocol
http
settings
空物件

適用於支援 HTTP 代理的應用程式;HTTPS 請求通常會使用 CONNECT 通道。

127.0.0.1 會將入口限制在本機。改為 0.0.0.0 則會監聽所有 IPv4 網路介面;範例中的 SOCKS 入站也使用 auth: "noauth",不可照抄後直接暴露於網路。若要共用代理,應一併檢查驗證設定、防火牆與允許連線的來源。

sniffing 可從 HTTP Host 或 TLS 交握中的伺服器名稱辨識目標網域,協助比對網域規則。routeOnly: true 表示嗅探取得的名稱僅用於路由判斷,不會取代原始連線目標。它不會解密 HTTPS,也無法保證所有流量都能取得網域資訊;本例僅在 SOCKS 入站啟用嗅探。

4. outbounds:分別檢查節點驗證與傳輸層

在代理出站中,protocol: "vmess" 表示節點協定。settings.vnext 儲存伺服器清單,users 儲存驗證參數。id 是使用者 UUID;alterId: 0 是現代 VMess 常見的設定,不要照著舊教學填入非零值碰運氣。users[].security: "auto" 是 VMess 的加密選項,與 TLS 開關不同。

欄位範例值實際作用
vnext[].addressnode.example.invalid核心連線的節點位址
vnext[].port443伺服器監聽連接埠,不是本機入站連接埠
streamSettings.networkws使用 WebSocket 傳輸
streamSettings.securitytls在傳輸層啟用 TLS
tlsSettings.serverNamenode.example.invalidTLS 伺服器名稱,通常用於 SNI 與憑證名稱驗證
wsSettings.path/wsWebSocket 請求路徑,必須與伺服器設定相符
wsSettings.headers.Hostnode.example.invalidWebSocket 交握使用的 HTTP Host

範例中的位址、SNI 與 Host 相同,只是為了減少變數;實際設定中三者可以不同。即使連線至 IP 位址,TLS 仍可能要求指定網域名稱。路徑也必須完全相符,/ws 與 /proxy 不是可以互換的裝飾文字。

freedom 表示直連出站,blackhole 表示封鎖出站。direct、block、proxy 則是本文選用的標籤名稱,可以更改,但所有 outboundTag 引用都必須一併修改。VLESS 出站的使用者欄位與 VMess 不完全相同,不能只把 protocol 換成 vless 就當作完成轉換。

判斷方式:連線失敗時先核對兩層參數

先比對位址、連接埠與 UUID,再比對 network、TLS 名稱、Host 和 path。不要以關閉憑證驗證來取代修正 serverName;跳過檢查並不會讓錯誤設定自動變成正確節點。

5. routing:規則順序與預設出站

rules 會依陣列順序逐條檢查,由第一條符合的規則決定出站。範例先封鎖一個示範網域,再讓私有位址和 localhost 直連。若沒有任何規則符合,傳統 V2Ray/Xray 設定會使用 outbounds 陣列中的第一個出站,因此此處預設走 proxy。這項預設行為與標籤是否命名為「proxy」無關。

  1. 確認標籤:outboundTag: "direct" 必須能找到 tag: "direct" 的出站。
  2. 檢查順序:明確的例外規則通常應排在範圍較廣的規則之前;兜底規則若提早放置,會遮蔽後續規則。
  3. 檢查條件:同一條規則中的不同欄位通常必須同時符合;同一欄位陣列中的多個候選項,通常任一符合即可。
  4. 檢查資料:geoip:private 需要 GeoIP 資料檔可供使用;使用 geosite 項目時,也要檢查對應的網域資料。

網域比對語法各有不同:full:example.com 只會比對完整網域,domain:example.com 則會比對該網域及其子網域。沒有前綴的字串通常會以關鍵字比對,涵蓋範圍可能超出預期。設定精確例外時,建議明確指定比對範圍。

domainStrategy解析時機排查重點
AsIs路由判斷不會主動將網域解析為 IP網域請求不應預期會自動符合 IP 規則
IPIfNonMatch網域未符合規則時,再嘗試解析並進行 IP 比對解析結果可能改變最終出站
IPOnDemand比對過程需要 IP 條件時才會觸發解析檢查解析負載與 DNS 回應結果

本例的 AsIs 是為了讓判斷流程保持簡單。若目標本身就是私有 IP,可以符合私有位址規則;但若目標是解析後得到私有 IP 的網域,則不保證會符合該規則。內網網域應另外設定明確的直連網域規則,或先了解解析行為後再調整策略。

6. dns:內建解析器不等於系統 DNS

dns.servers 指定核心內建解析器使用的伺服器。本例只有一個上游 223.5.5.5,用於說明設定結構,不代表已實作完整的 DNS 分流。應用程式可能在送出請求前自行解析;系統、瀏覽器與核心各自的解析路徑都需要分別檢查。

因此,設定了 dns 並不能單獨證明所有解析都會依預期經過代理。還需要確認應用程式是否使用獨立解析、路由的 domainStrategy、出站解析策略,以及 DNS 查詢本身是否可連線。特別是必須解析網域才能連線的節點,請勿讓解析節點網域的路徑依賴尚未建立的節點連線。

7. 從匯出設定到排除故障:一次只改一個變數

排除故障時,先保留一份可正常執行的設定,再檢查核心版本與目前實際讀取的檔案。在 v2rayN 中,可透過「設定」→「參數設定」查看或調整本機監聽相關參數;實際分頁與選項名稱會隨版本而異。介面中的節點表單、路由設定與執行時 JSON 必須彼此對應,不能只檢查一份可能已被用戶端重新產生的檔案。

  1. 檢查語法:使用本機編輯器檢查括號、逗號與資料型別。請勿將 UUID、訂閱網址或節點資訊提交至公開的線上格式化服務。
  2. 檢查核心相容性:確認讀取設定的是 V2Ray 還是 Xray。新欄位與傳輸方式必須符合目前核心支援的範圍。
  3. 檢查入口:確認程序正在監聽實際設定的連接埠。若出現 address already in use,先處理連接埠占用問題,不要急著修改節點 UUID。
  4. 檢查出站:暫時減少規則變數,核對位址、驗證資訊與傳輸設定。逾時、驗證失敗與 TLS 錯誤應分別排查。
  5. 檢查分流:新增一條比對範圍明確的測試規則,確認請求是否選到目標出站,再還原完整規則集。
  6. 降低除錯記錄:必要時暫時將 loglevel 改為 debug;完成後恢復為 warning,避免持續記錄過多連線資訊。

獨立執行核心時,可使用核心提供的設定測試命令。以下適用於目前採用子命令格式的 V2Ray/Xray 執行檔,請將路徑換成實際檔案位置;舊版命令列參數可能不同,請先查看本機的 help 輸出。

v2ray test -c config.json
xray run -test -config config.json

測試成功主要表示目前的核心能解析並載入設定,不代表節點在線、憑證正確,或所有規則都符合預期。最後仍須使用明確支援代理的應用程式送出實際請求。檢查記錄時,請留意入站標籤、目標位址與選定的出站;分享記錄前,先移除驗證資訊與個人瀏覽記錄。

操作結論:分層驗證入口、出站、路由與 DNS

先確認請求進入正確的連接埠,再確認代理節點可用,最後才加入分流與解析策略。每個步驟都保留一份可還原的設定副本,避免同時修改四個層面後,只剩一句「還是連不上」。