V2Ray 設定檔結構逐段解析:inbounds、outbounds 與 routing 的職責分工

以精簡的 JSON 設定為例,逐段說明 inbounds 如何接收本機流量、outbounds 如何定義出口、routing 如何比對規則並轉送流量,並解析 log 與 dns 在整體結構中的位置。

本文速覽

本文適合已經會匯入伺服器、希望進一步讀懂 V2Ray 設定的使用者。重點不是背熟所有欄位,而是建立「流量從入站進入、經過路由判斷,再由出站送出」的結構模型,並學會利用 tag、日誌與設定邊界定位問題。

先建立設定檔的流量路徑

V2Ray 設定檔是一個 JSON 物件,頂層欄位分別控制日誌、網域解析、入站、出站與路由。核心並不是按照檔案由上而下逐行執行,而是在啟動時讀取完整設定,建立監聽連接埠、出站處理器與路由規則。理解設定時應依資料流閱讀,而非按照文字行號閱讀。

應用程式首先將請求交給本機的 SOCKS 或 HTTP 代理連接埠,對應設定中的 inbounds。入站識別目標位址後,會將連線交給路由模組;routing 依規則順序選擇一個出站標籤;最後由 outbounds 中對應標籤的處理器建立遠端連線,或直接連線至目標。dns 為需要解析的網域提供結果,log 則記錄過程中的警告與錯誤。

應用程式請求 入站接收 嗅探補全 路由比對 出站傳送

以下範例使用本機 SOCKS 連接埠 10808,定義一個 VMess 代理出站與一個 freedom 直連出站。私有位址先走直連,其餘 TCP 與 UDP 流量交給代理出站。範例網域使用保留的 example.com,僅用於展示結構,不能直接當作可用的伺服器設定。

{
  "log": {
    "loglevel": "warning"
  },
  "dns": {
    "servers": [
      "localhost",
      "1.1.1.1"
    ]
  },
  "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": "proxy",
      "protocol": "vmess",
      "settings": {
        "vnext": [
          {
            "address": "server.example.com",
            "port": 443,
            "users": [
              {
                "id": "11111111-2222-4333-8444-555555555555",
                "security": "auto"
              }
            ]
          }
        ]
      },
      "streamSettings": {
        "network": "tcp",
        "security": "none"
      }
    },
    {
      "tag": "direct",
      "protocol": "freedom",
      "settings": {}
    }
  ],
  "routing": {
    "domainStrategy": "IPIfNonMatch",
    "rules": [
      {
        "type": "field",
        "ip": [
          "geoip:private"
        ],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "network": "tcp,udp",
        "outboundTag": "proxy"
      }
    ]
  }
}

inbounds:定義誰能將流量交給核心

設定重點

inbounds 是入站陣列,每個元素都代表一個監聽入口。範例將位址限制為 127.0.0.1,連接埠設為 10808,協定設為 socks。這表示只有本機程式可以連線至該連接埠,區域網路中的其他裝置無法直接使用此入口。

listenport 決定核心在哪裡等待連線,protocol 決定如何解讀進入連接埠的資料。連接埠沒有特殊魔法,只要位於有效範圍、未被其他程式占用,並與應用程式填寫的代理連接埠一致即可。若瀏覽器設定為 127.0.0.1:10808,但設定檔監聽 10809,請求就不會進入核心。

10808
本機 SOCKS 連接埠
127.0.0.1
僅監聽本機
1 個
範例入站
已啟用 UDP
SOCKS 入站能力

settings 與 sniffing 分別控制什麼

設定重點

入站的 settings 由所選協定決定。SOCKS 入站中的 authudp 有其用途,但將這些欄位原樣放入其他協定的入站不一定有效。閱讀文件時應先確認欄位屬於哪個協定,不要只因名稱相似就直接套用設定。

sniffing 用來從連線初始資料中補充目標網域。應用程式有時會先將網域解析為 IP,再把 IP 交給代理;啟用嗅探後,核心可能從 HTTP 主機欄位或 TLS 握手資訊中還原網域,讓以網域為基礎的 routing 規則有機會命中。嗅探不是網域解析器,也不會取代 dns

outbounds:定義流量從哪裡離開

設定重點

outbounds 同樣是陣列,但職責與入站相反:它描述核心如何連線至最終目標。代理出站通常包含伺服器位址、伺服器連接埠、使用者識別碼、協定參數與傳輸設定;直連出站使用 freedom,由目前裝置直接存取目標;如需明確阻擋,也可以使用專用的拒絕出站並透過標籤引用。

範例中的 proxydirect 都是 tag。routing 不會複製出站內容,只會記錄應交給哪個 tag。修改標籤時必須同步檢查路由規則,例如將 direct 改為 local-direct 後,仍引用舊名稱的 outboundTag 就無法指向預期的出站。

proxy 出站

協定
VMess
遠端連接埠
443
傳輸
TCP
使用者識別碼
UUID 格式

伺服器位址、使用者識別碼與傳輸參數必須與伺服器端設定一致。

direct 出站

協定
freedom
遠端伺服器
不需要
引用標籤
direct
典型用途
區域網路直連

由本機網路直接建立連線,仍會受到本機 DNS、路由與防火牆影響。

協定參數與傳輸參數不在同一層

以 VMess 為例,settings 中的 vnext 描述遠端伺服器與使用者;streamSettings 描述底層網路與安全方式。伺服器連接埠正確但傳輸方式不一致時,TCP 連線可能已建立,協定握手仍會失敗。因此排查連線問題時,不能只核對位址、連接埠與使用者識別碼。

欄位位置 負責內容 常見錯誤
settings.vnext 伺服器位址、連接埠與使用者參數 位址失效、連接埠錯誤、使用者識別碼不一致
streamSettings.network TCP、WebSocket 等傳輸類型 用戶端與伺服器端選擇不同傳輸方式
streamSettings.security 傳輸層安全方式 安全方式與伺服器端不匹配
tag 供 routing 引用的內部名稱 拼寫變更後未同步修改規則

結論:先核對層級,再比較欄位值

位址與連接埠屬於協定設定,網路類型與傳輸安全屬於 streamSettings。參數放錯層級時,即使值本身正確,核心也不會按照預期解讀。

routing:依規則將入站連線交給出站

設定重點

routing.rules 是有順序的規則陣列。核心從第一條開始檢查,遇到第一個符合的規則後,就使用該規則指定的 outboundTag。因此較具體的規則通常放在前面,涵蓋範圍較大的兜底規則放在後面。若將涵蓋所有 TCP 與 UDP 的規則放在最前面,後續的區域網路直連規則就沒有命中的機會。

範例第一條規則透過 geoip:private 比對私有位址,並交給 direct。常見私有範圍包括 10.0.0.0/8172.16.0.0/12192.168.0.0/16。第二條規則比對 TCP 與 UDP,作為其餘流量的代理出口。這裡的規則數量不多,但已呈現「具體規則優先、寬泛規則靠後」的基本原則。

  1. 確認規則的 type 是核心支援的類型,常用的欄位比對規則使用 field
  2. 檢查條件屬於網域、IP、連接埠、網路類型或入站標籤中的哪一類。
  3. 由上而下尋找第一條可能命中的規則,不要只查看預期中的規則本身。
  4. 核對 outboundTag 是否與 outbounds 中某個 tag 完全一致,包括大小寫。
  5. 暫時調高日誌層級並重新啟動核心,透過日誌確認實際目標與錯誤發生階段。

domainStrategy 決定何時為路由解析網域

設定重點

範例使用 IPIfNonMatch。當目標以網域形式傳入,且網域規則未命中時,路由模組可以解析該網域,再嘗試比對 IP 規則。這讓某些以位址資料庫為基礎的規則能處理網域目標,但也會增加一次解析程序。

domainStrategy 不是「所有 DNS 請求要走哪個出站」的開關,也不等同於系統 DNS 設定。它主要影響 routing 在比對過程中是否以及何時將網域解析為 IP。DNS 伺服器選擇、查詢流量路徑與最終連線的目標位址,仍需結合 dns、路由規則與出站設定一併判斷。

比對條件 範例 適合解決的問題
網域 domain 依完整網域、子網域範圍或預設網域類別分流
IP ip 依 CIDR、單一位址或位址類別分流
連接埠 port 將指定的目標連接埠交給特定出口
入站標籤 inboundTag 讓不同的本機入口採用不同的出口策略
網路類型 network 區分 TCP 與 UDP 流量

結論:分流異常先檢查規則順序

當目標總是走向同一個出口時,先查看它是否被前面的寬泛規則提前攔截,再檢查網域是否已變成 IP,以及出站標籤是否存在。

dns 與 log:輔助解析與定位故障

dns 定義核心可使用的 DNS 伺服器與相關解析策略。範例依序列出 localhost1.1.1.1,用於說明伺服器清單結構。實際設定應依網路環境與路由目標選擇解析方式,並注意查詢是否會由預期的出站處理。

需要特別區分應用程式自己的解析、作業系統解析與 V2Ray 內建 DNS。若應用程式先解析網域,只將 IP 交給 SOCKS 入站,核心未必會重新執行相同的網域查詢;啟用 sniffing 後可能還原網域,但能否成功取決於協定流量中是否能擷取相應資訊。排查網域分流時,應先確認核心實際收到的是網域還是 IP。

dns 段

範例伺服器
localhost
備用位址
1.1.1.1
主要職責
提供網域解析
關聯模組
routing

解析結果可能參與 IP 規則比對,但 dns 本身不決定最終出口。

log 段

範例層級
warning
排查層級
info 或 debug
主要職責
記錄執行狀態
重點資訊
監聽與連線錯誤

詳細日誌適合用於暫時診斷,完成排查後可恢復為較精簡的層級。

loglevel 控制輸出的詳細程度。日常執行使用 warning 可保留警告與錯誤;需要觀察請求路徑時,可以暫時改為 infodebug。詳細層級會產生更多記錄,問題解決後不宜長期保留。

從用戶端產生設定到手動排查

v2rayN、v2rayNG 與 v2flyNG 會根據圖形介面中的伺服器與路由選項產生核心設定。訂閱位址或分享連結主要提供單一伺服器所需的協定參數,用戶端還會補充本機入站、日誌、DNS 與路由內容。因此,分享連結中的欄位集合通常不等於最後交給核心的完整 JSON。

使用圖形用戶端時,不建議直接將執行期間產生的檔案當作長期設定來源來修改。用戶端重新啟動核心、切換伺服器或更新設定後,產生的檔案可能會被覆寫。較穩妥的做法是先在介面中修改對應選項,再透過日誌或產生結果核對欄位。若必須維護獨立設定,則應將其作為單獨檔案管理,並在每次修改後執行語法檢查與啟動測試。

設定語法正確,為什麼核心仍然立即退出?

JSON 合法只代表文字可以解析。接著查看啟動日誌,檢查未知欄位、欄位類型錯誤、連接埠占用,以及 routing 引用不存在的出站標籤。

瀏覽器已填寫 10808,為什麼沒有請求日誌?

確認 inbounds 實際監聽 127.0.0.1:10808,再檢查瀏覽器選擇的是 SOCKS 代理而非 HTTP 代理。兩端的協定類型必須一致。

新增直連規則後,流量仍然走 proxy?

將直連規則移到寬泛代理規則之前,核對 outboundTag 是否正確寫為 direct,並確認目標進入核心時是網域還是 IP。

可以直接將這份 JSON 匯入 v2rayN 嗎?

完整核心設定與用戶端伺服器項目的結構不同。需要託管完整設定時,應使用用戶端提供的相應設定入口;一般伺服器匯入則使用 VMess、VLESS 分享連結或訂閱位址。

修改 loglevel 後為什麼看不到變化?

儲存檔案後重新啟動核心,並確認正在編輯的是目前程序實際讀取的設定。圖形用戶端可能會在每次啟動時重新產生執行設定。

建議採用的最小排查順序

  1. 先確認 JSON 可以解析,所有物件、陣列、逗號與引號的位置都正確。
  2. 啟動核心並檢查 127.0.0.1:10808 是否已開始監聽。
  3. 暫時保留一個明確的代理出站與一個直連出站,減少變數數量。
  4. 使用兩條 routing 規則驗證私有位址直連,其餘流量走代理。
  5. 確認基礎連線成立後,再逐項加入網域類別、連接埠條件與更多出站。
  6. 每次只修改一組相關欄位,重新啟動後立即讀取對應日誌。

讀懂 V2Ray 設定的關鍵,是將欄位還原為連線路徑:inbounds 負責接收,routing 負責選擇,outbounds 負責傳送,dns 為網域比對與連線提供解析結果,log 則為每個階段提供診斷線索。遇到問題時,依這五個邊界逐段縮小範圍,比同時修改協定、連接埠、DNS 與路由更容易得到可驗證的結論。

下載 v2rayN 查看四平台用戶端