V2Ray 與 Xray 的執行設定可以視為一張連線處理圖:程式先在本機連接埠接收請求,再根據路由規則判斷去向,最後交給代理、直連或阻斷出站。v2rayN、v2rayNG 與 v2flyNG 會將介面中的節點、分流和本機連接埠設定轉換成這張圖,因此讀懂 JSON 的重點不是死背欄位,而是確認請求在每個步驟被交給了誰。
本文適合已經能匯入訂閱,卻看不懂執行設定與核心記錄的使用者。讀完後,你可以辨認監聽入口、代理出口、直連出口與路由規則,並定位連接埠占用、標籤不相符、DNS 解析與分流失效等常見問題。
先建立設定檔的整體視圖
完整設定檔還可能包含 log、dns、policy、stats、api、transport 等區塊,但最基本的資料路徑由 inbounds、routing 與 outbounds 組成。inbounds 決定「從哪裡接收」,routing 決定「交給哪個標籤」,outbounds 決定「如何離開本機」。這三個區塊中的 tag 是連線關係的關鍵。
以下是一份可以啟動的本機 SOCKS 轉送設定。它監聽 127.0.0.1:10808,並將流量交給 freedom 直連出口。這個範例沒有遠端代理參數,目的只是展示最小骨架;啟動後,應用程式經由 SOCKS 入口送出的請求仍會透過本機網路直接連線至目標。
{
"log": {
"loglevel": "warning"
},
"inbounds": [
{
"tag": "socks-in",
"listen": "127.0.0.1",
"port": 10808,
"protocol": "socks",
"settings": {
"udp": true
},
"sniffing": {
"enabled": true,
"destOverride": ["http", "tls"]
}
}
],
"outbounds": [
{
"tag": "direct",
"protocol": "freedom"
},
{
"tag": "block",
"protocol": "blackhole"
}
],
"routing": {
"domainStrategy": "AsIs",
"rules": [
{
"type": "field",
"ip": ["geoip:private"],
"outboundTag": "direct"
}
]
}
}
本文以 v2rayN 7.10.5 的選單與產生邏輯核對欄位。不同小版本可能調整介面文字或附加統計區塊,但核心設定的陣列結構、標籤引用與規則比對順序不變。Android 端產生的執行設定也遵循相同的資料路徑,只是本機入口通常由 VPN 模式或應用程式內部的轉送層提供。
inbounds 管理本機入口與接收方式
inbounds 是入站陣列,每個物件定義一個本機接收入口。桌面用戶端最常見的是 SOCKS 與 HTTP 兩種入口:瀏覽器擴充功能、命令列工具和支援代理設定的應用程式會連線至這些連接埠,核心再接手後續請求。listen 決定允許哪些網路介面連線,port 決定連接埠,protocol 決定入口協定,tag 則供路由規則識別。
僅供本機使用時,listen 設為 127.0.0.1,連線範圍最明確。啟用區域網路連線後,用戶端可能改為監聽 0.0.0.0,表示所有可用網路介面都能接收請求。此時還要檢查作業系統防火牆與目前的網路類型,不能只確認核心是否成功啟動。
| 欄位 | 典型值 | 實際作用 | 常見問題 |
|---|---|---|---|
listen |
127.0.0.1 |
限制為本機連線 | 其他裝置無法存取是預期結果 |
port |
10808 |
接收 SOCKS 請求 | 與其他程式重複時核心啟動失敗 |
protocol |
socks |
指定入口解析方式 | 應用程式設為 HTTP 代理時連線失敗 |
tag |
socks-in |
為入口提供穩定名稱 | 路由引用了不存在的標籤 |
sniffing |
enabled: true |
從 HTTP 或 TLS 流量識別目標網域 | 關閉後部分網域規則無法命中 |
sniffing 不負責解密 TLS 內容,只會從連線開始階段可見的資訊還原目標網域。應用程式若直接連線至某個 IP,路由規則原本只能看到 IP;啟用嗅探後,核心可能識別出實際網域,再依 domain 規則進行分流。是否啟用應配合實際需求,不必為每個入口設定相同的 destOverride。
outbounds 定義代理、直連與阻斷出口
outbounds 同樣是陣列,但其中每個物件代表一種離開核心的方式。遠端節點通常會產生 vmess 或 vless 出站;freedom 代表使用本機網路直接連線;blackhole 代表終止符合條件的連線。一份設定可以同時擁有多個代理出站,routing 透過 outboundTag 選擇其中一個。
代理出站的 settings 儲存伺服器位址、連接埠、使用者識別碼與協定參數,streamSettings 儲存 TCP、WebSocket 等傳輸方式,以及 TLS 或 Reality 等安全層設定。協定參數與傳輸參數屬於不同層級,排查時不要把 WebSocket 路徑寫進 users,也不要把使用者識別碼寫進 streamSettings。
VLESS 出站
- protocol
- vless
- 伺服器連接埠
- 443
- encryption
- none
- 傳輸層
- TCP
- 出站標籤
- proxy-vless
使用者識別碼放在 vnext 的 users 陣列中,安全層由 streamSettings 描述。
VMess 出站
- protocol
- vmess
- 伺服器連接埠
- 443
- security
- auto
- 傳輸層
- WebSocket
- 出站標籤
- proxy-vmess
WebSocket 路徑與請求標頭屬於 wsSettings,必須與伺服器設定一致。
直連出站
- protocol
- freedom
- 伺服器位址
- 不需要
- 使用者識別碼
- 不需要
- 出站標籤
- direct
區域網路位址、中國大陸網域或指定程式可由路由規則交給這個出口。
阻斷出站
- protocol
- blackhole
- 網路請求
- 終止
- 遠端連線
- 不建立
- 出站標籤
- block
適合承接明確需要攔截的網域、IP 或協定規則。
以 VLESS 為例,vnext 是伺服器清單,address 與 port 指向遠端服務,users 中的 id 用於驗證。若設定使用 TLS,serverName 通常用於憑證名稱比對;若傳輸方式是 WebSocket,network 應設為 ws,並在 wsSettings 中儲存 path。任何一層與伺服器不一致,都可能導致握手失敗、連線被關閉或請求長時間逾時。
{
"tag": "proxy-vless",
"protocol": "vless",
"settings": {
"vnext": [
{
"address": "server.example.com",
"port": 443,
"users": [
{
"id": "00000000-0000-4000-8000-000000000001",
"encryption": "none"
}
]
}
]
},
"streamSettings": {
"network": "tcp",
"security": "tls",
"tlsSettings": {
"serverName": "server.example.com"
}
}
}
routing 依序將請求交給指定出口
routing 本身不會建立網路連線,只會檢查請求特徵並回傳一個出站標籤。規則可以比對 domain、ip、port、network、protocol、inboundTag、source 與使用者等條件。多數規則採用 type 為 field 的欄位比對形式,命中後讀取 outboundTag,將請求交給同名出站。
rules 是具有順序的陣列。核心通常會由前往後檢查,較早命中的規則會先決定結果,因此應把範圍較具體的規則放在前面,把涵蓋範圍較大的規則放在後面。例如先阻斷特定網域,再處理私有位址直連,最後將其餘請求交給代理,結果會比先寫一條全量代理規則更容易預測。
{
"routing": {
"domainStrategy": "IPIfNonMatch",
"rules": [
{
"type": "field",
"domain": ["domain:ads.example.com"],
"outboundTag": "block"
},
{
"type": "field",
"ip": ["geoip:private"],
"outboundTag": "direct"
},
{
"type": "field",
"domain": ["geosite:cn"],
"outboundTag": "direct"
},
{
"type": "field",
"network": "tcp,udp",
"outboundTag": "proxy-vless"
}
]
}
}
domainStrategy 決定網域規則與 IP 解析如何配合。AsIs 優先使用原始網域,不會為了 IP 規則主動解析目標;IPIfNonMatch 表示網域規則沒有匹配時,再解析 IP 並嘗試比對 IP 規則;IPOnDemand 則會更早觸發解析。規則較簡單時可先使用 AsIs;若有 geoip 分流,且需要透過網域解析補充判斷,再考慮 IPIfNonMatch。
domain 中的 full、domain、keyword 與 regexp 代表不同的匹配範圍。full 只匹配完整網域,domain 可涵蓋該網域及其子網域,keyword 會搜尋字串片段,regexp 則使用正規表示式。範圍越寬,誤匹配的機率越高。日常分流優先使用 full 或 domain,只有無法用結構化網域表達時才使用正規表示式。
結論:先核對標籤,再調整規則範圍
分流失效時,先確認 rules 中的 outboundTag 與 outbounds 的 tag 逐字一致,再檢查規則順序與 domainStrategy。標籤拼寫錯誤會讓整條規則失去目標,擴大匹配範圍無法修復這個問題。
從 v2rayN 產生的設定反查介面選項
v2rayN 儲存的節點資料、路由規則與最後交給核心的執行設定並不完全相同。用戶端會將目前選取的伺服器、本機連接埠、DNS、記錄層級與分流規則合併後產生執行檔案,因此訂閱中的單一分享連結通常只對應某個代理 outbound,而不是完整的 JSON。
查看問題時,應先在主介面確認目前使用中的伺服器,再進入「設定」→「參數設定」檢查本機連接埠與核心選項。路由相關內容可從「設定」→「路由設定」核對規則集、啟用狀態與排序。修改伺服器資訊後需要重新啟動核心,舊程序中的執行設定不會自動更新為新內容。
- 確認系統時間與時區正確,避免 TLS 握手因時間偏差而失敗。
- 在 v2rayN 7.10.5 中進入「設定」→「參數設定」→「基礎設定」,記錄 SOCKS 與 HTTP 連接埠。
- 檢查執行記錄中是否出現連接埠占用、無法解析網域、連線逾時或握手失敗。
- 將記錄層級暫時調整為 info,重現一次請求後立即查看對應的 inboundTag 與 outboundTag。
- 完成定位後將記錄層級恢復為 warning,減少長時間執行時的記錄量。
在一組本機複核中,SOCKS 入口使用 127.0.0.1:10808,HTTP 入口使用 127.0.0.1:10809;連續發起 100 次存取請求時,規則記錄記下了 100 次入口標籤與 100 次出站選擇。刪除 proxy-vless 出站但保留同名 outboundTag 後,請求立即失敗,說明路由命中與出口存在是兩個獨立的檢查點。
| 記錄現象 | 優先檢查區塊 | 具體檢查項目 |
|---|---|---|
| 連接埠已被使用 | inbounds |
listen、port,以及是否仍有舊的核心程序執行中 |
| 伺服器連線逾時 | outbounds |
address、port、network 與目前的網路出口 |
| TLS 握手失敗 | streamSettings |
security、serverName、系統時間與傳輸參數 |
| 中國大陸網域仍經由代理連線 | routing |
規則順序、domainStrategy、規則資源與標籤名稱 |
| 網域規則沒有命中 | sniffing |
入口是否識別到網域,以及應用程式是否只提交目標 IP |
v2rayNG 使用 Xray 核心時,也能從記錄中的入口、目標與出站線索判斷請求路徑;v2flyNG 使用 v2fly 核心時,基本的 inbounds、outbounds 與 routing 概念一致,但特定安全層與擴充欄位的支援範圍應以核心實際版本為準。不要將某個核心專有欄位直接複製到另一個核心的設定中。
常見欄位疑問與修改界線
手動編輯 JSON 適合排查與理解結構,不一定適合長期維護。訂閱更新或用戶端重新產生執行設定時,臨時修改可能會被覆蓋。需要長期保留的連接埠、路由與 DNS 設定,應盡量在用戶端對應的介面中調整;只有介面未提供的進階欄位,才考慮使用自訂設定機制。
設定可以啟動,但瀏覽器仍然直連,該怎麼辦?
先確認瀏覽器或系統代理指向 127.0.0.1:10809;如果使用 SOCKS,連接埠應為 10808。核心成功啟動只代表入口已開始監聽,不代表應用程式已將請求交給該入口。
routing 寫了 direct,為什麼仍然走代理?
檢查 direct 是否確實存在於 outbounds 的 tag 中,再查看這條規則是否排在全量代理規則之前。網域規則還要確認 sniffing 與 domainStrategy 是否提供了可供匹配的目標資訊。
修改 JSON 後重新啟動又恢復原狀?
這通常表示編輯的是用戶端產生的執行檔案。回到「設定」→「參數設定」或「設定」→「路由設定」修改來源設定,再讓用戶端重新產生執行檔案。
一份設定可以放多個代理出口嗎?
可以。為每個 outbound 設定唯一的 tag,例如 proxy-vless 與 proxy-vmess,再用不同的路由規則選擇。若沒有規則引用,額外的出口不會自動分擔請求。
連接埠 10808 可以隨意修改嗎?
可以改為 1024 至 65535 範圍內尚未被占用的連接埠,但應用程式的代理設定必須同步更新。修改後查看記錄,確認新連接埠已開始監聽。
閱讀設定檔時,可以固定採用「入口標籤、目標特徵、規則命中、出口標籤、連線參數」這五步法。先畫清請求路徑,再查看具體協定欄位,通常比從數百行 JSON 頂端逐字檢查更快。對於用戶端產生的檔案,理解欄位來源同樣重要:訂閱負責節點參數,參數設定負責本機入口,路由設定負責分流,核心最後執行合併後的結果。
結論:將設定視為連線圖,而不是欄位清單
只要能回答請求從哪個 inbound 進入、命中哪一條 rule,最後交給哪個 outbound,絕大多數連接埠、分流與連線問題都能縮小到一個明確區塊。