本文重點

本文適合已匯入節點、想看懂執行設定的使用者。先從本機連接埠找到入站,再依路由中的標籤找到出站,最後分辨節點參數、傳輸參數與客戶端設定。讀完後,就能判斷連線在哪個環節出問題,也能分清「設定檔載入成功」和「節點連線成功」的差異。

一、先分清客戶端設定與核心執行設定

config.json 通常是交由核心讀取的 JSON 檔案,檔名本身不會決定檔案內容。v2rayN 儲存的伺服器清單、訂閱群組與介面偏好,屬於客戶端管理資料;啟動核心時,客戶端會依據目前使用的伺服器與路由設定產生執行設定。只匯出一條分享連結,得到的並不是包含入站和路由的完整設定檔。

閱讀時應以實際使用的執行檔為準。v2rayN 各版本的匯出入口與產生檔案的位置可能不同,請先確認匯出的是完整設定檔,而不是伺服器分享內容。Android 版 v2rayNG 使用 Xray 核心,v2flyNG 使用 V2Fly 核心;兩者的基本結構相近,但不能因此認定擴充欄位都通用。

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

二、完整 config.json 範例(已去識別化)

以下依照客戶端匯出完整設定檔的結構整理成範例,保留兩個本機入站、三個出站與兩條路由,並將位址和身分參數替換為示例值。這是一份完整的 JSON 文件,但不是可用來連線的節點:example.com:443 不代表有相應的 VMess 伺服器,不能直接用來測試網路。

{
  "log": {
    "loglevel": "warning"
  },
  "dns": {
    "servers": ["localhost"]
  },
  "inbounds": [
    {
      "tag": "socks-in",
      "listen": "127.0.0.1",
      "port": 10808,
      "protocol": "socks",
      "settings": {
        "auth": "noauth",
        "udp": true
      }
    },
    {
      "tag": "http-in",
      "listen": "127.0.0.1",
      "port": 10809,
      "protocol": "http",
      "settings": {}
    }
  ],
  "outbounds": [
    {
      "tag": "proxy",
      "protocol": "vmess",
      "settings": {
        "vnext": [
          {
            "address": "example.com",
            "port": 443,
            "users": [
              {
                "id": "11111111-1111-4111-8111-111111111111",
                "alterId": 0,
                "security": "auto"
              }
            ]
          }
        ]
      },
      "streamSettings": {
        "network": "tcp",
        "security": "tls",
        "tlsSettings": {
          "serverName": "example.com"
        }
      }
    },
    {
      "tag": "direct",
      "protocol": "freedom",
      "settings": {}
    },
    {
      "tag": "block",
      "protocol": "blackhole",
      "settings": {}
    }
  ],
  "routing": {
    "domainStrategy": "AsIs",
    "rules": [
      {
        "type": "field",
        "domain": ["full:example.org"],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "ip": ["geoip:private"],
        "outboundTag": "direct"
      }
    ]
  }
}

三、inbounds:監聽位址、連接埠與應用程式代理類型

第一個入站在 127.0.0.1:10808 接收 SOCKS 請求,第二個在 127.0.0.1:10809 接收 HTTP 代理請求。這兩個連接埠是本文範例的指定值,不保證與你的客戶端相同。應用程式該填哪一個,取決於所選的代理類型,而不是目標網站使用 HTTP 還是 HTTPS。

SOCKS 入站

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

應用程式選擇 SOCKS5 時,請填入此入口;UDP 也需要應用程式和後續鏈路都支援。

HTTP 入站

標籤
http-in
監聽位址
127.0.0.1
連接埠
10809
協定
http

應用程式選擇 HTTP 代理時,請填入此入口;連線至 HTTPS 目標時,通常會透過 CONNECT 建立通道。

listen 設為迴送位址時,只有本機可以連線。若為了在區域網路分享而改成 0.0.0.0,監聽範圍會隨之擴大,也必須一併考量身分驗證與防火牆,不能只改位址。本例 SOCKS 入站的 auth: "noauth" 表示不要求驗證,請將使用範圍維持在本機。

udp: true 只會啟用 SOCKS 入站的 UDP 功能,不會自動將整個系統的 UDP 流量送進代理,也不代表 HTTP 入站具備相同功能。若應用程式沒有使用這個入口,即使核心啟動成功,也不會產生預期的代理連線。

四、outbounds:節點身分、傳輸方式與出口標籤

outbounds 是陣列,可以同時列出多個出口。本例的第一個出口標記為 proxy,使用 VMess 協定;vnext 中的 address 和 port 是遠端伺服器的位址與連接埠,users 中的 id 則是使用者身分參數。這裡的 443 是遠端連接埠,不能取代本機的 10808、10809。

欄位範例值說明重點
protocolvmess決定代理協定及其 settings 結構。
users[].securityautoVMess 使用者層的加密選項,不是 TLS 開關。
users[].alterId0VMess AEAD 常見的設定,應與伺服器端要求一致。
streamSettings.networktcp本例使用的傳輸方式;名稱與可用值會因核心版本而異。
streamSettings.securitytls啟用傳輸層 TLS,與使用者層的 security 各自負責不同功能。
tlsSettings.serverNameexample.com用於 TLS 的伺服器名稱與憑證名稱驗證。

direct 使用 freedom 直接連線至目標,block 使用 blackhole 拒絕流量。這些只是標籤名稱,實際行為由 protocol 決定;將 freedom 的標籤改成「proxy」,也不會讓它變成遠端代理。本例沒有任何規則引用 block,因此只宣告這個出站並不會自動封鎖請求。

判斷設定相容性:先看協定,再看核心欄位

不要直接把 VMess 的 protocol 改成 VLESS 後就執行。兩者的身分與加密欄位結構不同;使用 REALITY 等擴充功能時,也必須確認目前執行的是支援該欄位的 Xray 核心,不能只看檔名判斷。

五、routing:規則順序、tag 引用與預設出口

路由規則會由上往下檢查,符合條件後就依該規則選擇出口。本例第一條規則只會將完整網域 example.org 交給 direct。full: 代表完全比對,不會連同子網域一起比對。第二條規則會將符合私人位址範圍的目標交給相同出口;其他連線若未符合任何規則,則使用 outbounds 中的第一個出站,也就是 proxy。

  1. 連線目標是網域 example.org:符合第一條規則,尋找標籤為 tag: "direct" 的出站。
  2. 連線目標是位址 192.168.1.20:符合第二條私人位址規則,直接連線至區域網路目標。
  3. 連線目標是其他未符合規則的網域:使用第一個出站 proxy,嘗試連線至範例 VMess 伺服器。

outboundTag 必須與出站的 tag 完全相符,包含大小寫。入站標籤則可透過規則的 inboundTag 陣列參與比對,例如只處理 ["socks-in"] 的連線。入站標籤和出站標籤不會自動配對,名稱也不必相同。

本例採用 domainStrategy: "AsIs",路由階段不會為了比對 IP 規則而主動將網域解析成位址。因此,若連線仍以網域形式進入,第二條私人 IP 規則不一定能辨識它最後指向的區域網路位址。若需要這類行為,應先了解 IPIfNonMatch 或 IPOnDemand 的解析時機,再配合 DNS 設定調整,不要假設每個網域請求都已取得目標 IP。

修改路由前,先記下第一個出站

將 direct 移到陣列第一個位置,會改變所有未符合規則之連線的預設出口。請分開調整規則與出站順序,每次只改一項,避免誤將預設直連當成規則失效。

六、dns 與 log:能載入不代表能連線

本例的 dns.servers 使用 localhost,表示內建 DNS 在需要解析時可以使用系統的解析功能。這不會在本機開啟 DNS 服務連接埠,也不會自動接管應用程式發往其他 DNS 伺服器的請求。路由解析、出站解析與應用程式本身的解析發生在不同環節,必須依實際入站方式判斷。

loglevel: "warning" 會減少一般連線資訊。排查問題時可暫時改為 info,重新啟動核心後重現一次失敗的請求;完成排查後再恢復原設定。日誌可能包含瀏覽的網域、目標位址與設定檔路徑,公開求助前請刪除訂閱連結、使用者身分參數及個人路徑。

七、config.json 常見問題

檔案可以開啟,為什麼核心仍然顯示設定錯誤?

文字編輯器能開啟檔案,不代表它是合法的 JSON。先檢查結尾多餘的逗號、雙引號與括號,再依日誌找出問題欄位。語法正確後,還要確認欄位結構受目前使用的核心支援;例如,不能把出站物件放進 inbounds 陣列。

在 HTTP 代理設定中填入 10808,為什麼連線失敗?

本例的 10808 接收 SOCKS 請求,10809 才接收 HTTP 代理請求。請在應用程式中將代理類型改為 SOCKS5 並使用 10808,或維持 HTTP 類型並改用 10809;實際操作前仍須確認自己的執行設定中使用的連接埠。

設定檔裡明明寫了 proxy,為什麼流量還是直接連線?

先確認應用程式確實連上本機入站,再檢查符合的規則是否指向 direct。proxy 只是標籤,不會自動啟用系統代理;客戶端的系統代理開關與核心的路由設定必須分別確認。

可以將桌面版的完整設定檔直接匯入 Android 客戶端嗎?

請先確認目標客戶端支援的核心欄位與匯入方式。桌面版的監聽連接埠、日誌路徑和路由資料不一定適用於 Android 環境。若只需要同步伺服器,建議優先匯入訂閱或節點分享內容,再於目標客戶端設定本機監聽與路由,不要直接用整份設定檔覆蓋執行設定。