適合已能匯入訂閱,但看到產生的設定檔仍不知如何下手的使用者。本文依序說明請求經過入站、路由與出站的流程,提供核心可讀取的本機直連範例,並解釋 VLESS、VMess 參數應放在哪一層,以及修改後如何定位 JSON 語法、連接埠占用與規則順序問題。
先看懂設定檔的外層結構
V2Ray 與 Xray 的執行設定通常使用 JSON。最常見的頂層物件包括 log、inbounds、outbounds、routing 與 dns。其中真正決定請求如何進入、如何選擇路徑,以及從哪裡離開的,是 inbounds、routing、outbounds 這三個區塊。
可以把一次連線理解為固定的資料鏈:瀏覽器或其他應用程式先連線到本機監聽連接埠,核心辨識目標位址,再依路由規則選擇一個出站。訂閱節點主要填入 outbounds,客戶端的路由模式主要產生 routing,而系統代理設定則負責讓應用程式將流量交給 inbounds。
以下範例不包含遠端節點,而是將 SOCKS 請求直接從本機送出。適合用來驗證 JSON 結構、連接埠監聽與路由載入是否正常。核心可以讀取並執行這份設定,但不會提供遠端代理功能。
{
"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"]
}
}
],
"outbounds": [
{
"tag": "direct",
"protocol": "freedom"
},
{
"tag": "blocked",
"protocol": "blackhole"
}
],
"routing": {
"domainStrategy": "AsIs",
"rules": [
{
"type": "field",
"ip": ["geoip:private"],
"outboundTag": "direct"
}
]
}
}
inbounds:本機應用程式如何進入核心
inbounds 是陣列,因此一份設定可以同時監聽多個入口。例如 SOCKS 監聽 10808,HTTP 監聽 10809。系統代理通常指向 HTTP 入口,支援 SOCKS 的應用程式也可以單獨連線至 127.0.0.1:10808。實際連接埠由客戶端產生的設定決定,不應假設所有安裝內容都相同。
listen 決定監聽範圍。設定為 127.0.0.1 時,只有本機程式可以連線;設定為區域網路位址或監聽所有位址,則會改變可存取範圍。一般桌面使用維持本機監聽即可。若出現「連線被拒絕」,應先確認核心正在執行,再確認應用程式填寫的連接埠與實際入站連接埠一致。
- tag:入站的內部名稱,可供 routing 中的
inboundTag引用。名稱可以自行設定,但引用時必須完全一致。 - protocol:指定入口協定。桌面客戶端通常會產生 SOCKS 或 HTTP 入站;TUN 模式則由客戶端建立相應的虛擬網路入口。
- settings:保存該入站協定本身的參數。SOCKS 範例中的
udp: true表示允許處理 UDP 請求。 - sniffing:從連線內容還原目標網域名稱,協助網域規則參與比對。它不是測速開關,也不會直接改變遠端節點協定。
SOCKS 本機入口
- 監聽位址
- 127.0.0.1
- 監聽連接埠
- 10808
- 協定
- socks
- UDP
- true
適合支援 SOCKS5 設定的瀏覽器、下載工具與命令列程式。
HTTP 本機入口
- 監聽位址
- 127.0.0.1
- 監聽連接埠
- 10809
- 協定
- http
- 用途
- 系統代理
連接埠應以客戶端執行記錄與產生的設定檔為準。
驗證 SOCKS 入口時,可以先觀察核心記錄是否出現「監聽 127.0.0.1:10808」這類訊息,再讓支援 SOCKS5 的工具連線至該位址。若使用網域規則,測試工具應將網域交由代理端解析,避免本機提前解析成 IP,導致網域比對條件遺失。
outbounds:遠端協定參數與出口標籤
outbounds 同樣是陣列。第一個出站通常作為預設出口,後續出站則可用於直連、阻擋或其他節點。每個出站由 tag、protocol、settings 與可選的 streamSettings 組成。routing 不會直接填寫伺服器位址,而是透過 outboundTag 選擇此處定義的出站。
VLESS 與 VMess 的帳號資訊通常放在 settings.vnext 中,包括伺服器位址、連接埠與使用者識別碼。TCP、WebSocket、TLS 等傳輸與安全參數位於 streamSettings。兩層參數不可混放:即使遠端帳號正確,傳輸路徑錯誤仍會在握手階段連線失敗。
VLESS + TCP + TLS
- 出站協定
- vless
- 傳輸方式
- tcp
- 安全層
- tls
- 使用者加密
- none
- 常見連接埠
- 443
位址、使用者識別碼、伺服器名稱與安全參數必須與伺服器端設定一致。
VMess + WebSocket + TLS
- 出站協定
- vmess
- 傳輸方式
- ws
- 路徑
- /ws
- 安全層
- tls
- 常見連接埠
- 443
WebSocket 路徑、Host 與 TLS 伺服器名稱需要逐項核對。
{
"tag": "proxy-main",
"protocol": "vless",
"settings": {
"vnext": [
{
"address": "edge.example.com",
"port": 443,
"users": [
{
"id": "00000000-0000-4000-8000-000000000001",
"encryption": "none"
}
]
}
]
},
"streamSettings": {
"network": "tcp",
"security": "tls",
"tlsSettings": {
"serverName": "edge.example.com"
}
}
}
上方的位址與使用者識別碼僅用於展示欄位位置,不能用來連線至真實節點。實際設定應由訂閱或伺服器端參數產生。手動核對時,先看 protocol,再看 address 與 port,接著核對使用者識別碼,最後檢查 network、TLS 伺服器名稱與 WebSocket 路徑。
freedom 表示直接連線至目標,常用標籤為 direct;blackhole 用於終止符合條件的連線,常用標籤為 blocked。兩者不需要遠端伺服器參數。設定中同時保留 proxy、direct、blocked 三類出站後,routing 才能分別完成代理、直連與阻擋。
結論:先核對協定層,再核對傳輸層
記錄出現驗證或使用者識別碼錯誤時,請檢查 settings;出現 TLS、WebSocket 路徑或連線關閉錯誤時,請檢查 streamSettings。依層次定位比反覆更換連接埠更有效。
routing:依順序比對規則,不要從名稱推測
routing.rules 是有順序的規則陣列。核心會從第一條開始往後檢查,命中後使用該規則的 outboundTag,通常不會再由後面的規則覆寫結果。因此,更具體的規則應放在前面,較寬泛的兜底規則則放在後面。
type: "field" 表示依欄位條件進行比對。常見條件包括 domain、ip、port、network、inboundTag 與 protocol。同一條規則放入多種不同類型的條件時,通常需要同時符合;同一欄位中的多個值則表示符合其中任一項即可。
| 規則位置 | 比對條件 | 出站標籤 | 作用 |
|---|---|---|---|
| 第 1 條 | domain: domain:example.net | blocked | 阻擋指定網域 |
| 第 2 條 | ip: geoip:private | direct | 區域網路與私有位址直連 |
| 第 3 條 | domain: geosite:cn | direct | 符合對應網域集合 |
| 未命中 | 無明確條件 | 預設出站 | 通常使用第一個 outbound |
{
"routing": {
"domainStrategy": "IPIfNonMatch",
"rules": [
{
"type": "field",
"domain": ["domain:example.net"],
"outboundTag": "blocked"
},
{
"type": "field",
"ip": ["geoip:private"],
"outboundTag": "direct"
},
{
"type": "field",
"domain": ["geosite:cn"],
"outboundTag": "direct"
},
{
"type": "field",
"network": "tcp,udp",
"outboundTag": "proxy-main"
}
]
}
}
domainStrategy: "AsIs" 主要依請求中已有的網域或 IP 處理;IPIfNonMatch 會在網域規則未命中時嘗試解析 IP,再讓 IP 規則參與判斷。選擇策略時要考量 DNS 設定與 sniffing 結果,不要簡單地把解析次數較多的選項視為較快。
最後一條 network: "tcp,udp" 是寬泛的兜底規則。若將它移到第一條,絕大多數 TCP 與 UDP 請求都會直接命中 proxy-main,後面的私有位址直連規則便會失效。這也是「規則看似都存在,但分流沒有生效」的常見原因。
結論:路由異常先查第一條命中的規則
將目標網域、解析結果與規則順序放在一起檢查。只確認某條規則存在還不夠,它必須排在較寬泛的規則之前,並引用實際存在的 outbound 標籤。
客戶端產生的設定檔該修改哪裡
v2rayN 7.x 會根據節點、路由與核心選項產生執行設定。直接修改執行期間的檔案可能只對目前程序有效,下次切換節點、更新訂閱或重新啟動核心時就會重新產生。需要長期保留的修改,應盡量從客戶端對應的介面完成。
查看基本選項可進入「設定」→「參數設定」;調整節點參數可在「伺服器」清單選取目標後進入編輯介面;路由相關內容應在「設定」→「路由設定」中管理。不同小版本的選單名稱可能略有調整,但修改目標仍分別對應入站、節點出站與路由規則三個層次。
- 先複製目前可用的設定檔或匯出客戶端設定,保留可回復的基準。
- 一次只修改一個欄位,例如只調整監聽連接埠,儲存後立即重新啟動核心。
- 先確認 JSON 可以載入,再測試本機連接埠,最後測試特定網域的路由結果。
- 若修改路由,請記錄目標網域、命中的規則與最終 outboundTag。
- 更新訂閱後重新核對自訂設定,確認客戶端沒有以訂閱欄位覆蓋本機調整。
v2rayNG 使用 Xray 核心時也會產生相應的執行設定,欄位概念與桌面端相近;v2flyNG 使用 v2fly 核心時,應以該核心實際支援的協定與欄位為準。部分 Xray 擴充參數不能直接複製到 v2fly 核心設定中,看到未知欄位錯誤時,應先確認核心家族。
載入失敗與分流異常的排查順序
設定問題可以分成三類:JSON 無法解析、核心可以啟動但入站無法使用,以及核心與入站正常但路由結果不符合預期。依此順序檢查,可以避免將語法錯誤誤判為節點故障。
儲存後核心立即退出,先看哪裡?
先查看核心記錄最前面的錯誤行。若提示 invalid character、unexpected token 或缺少分隔符號,請檢查雙引號、逗號與方括號。JSON 最後一項後不能保留逗號。
10808 連接埠無法連線怎麼辦?
確認 inbounds 中的 listen 為 127.0.0.1、port 為 10808,並查看記錄是否提示 address already in use。若連接埠被占用,改為 10810 後還要同步修改應用程式中的 SOCKS 位址。
節點可用,但指定網域無法直連?
檢查網域是否已被 sniffing 辨識,再確認寬泛的代理規則是否排在直連規則之前。將具體的 domain 規則移到 network 兜底規則上方,重新啟動核心後再次建立連線。
記錄提示找不到 outboundTag?
逐字核對 routing 中的 outboundTag 與 outbounds 中的 tag。proxy-main、proxy_main 與 Proxy-Main 會被視為不同名稱;刪除出站時,也要同步清除引用它的規則。
網域規則存在,IP 規則卻沒有參與比對?
檢查 domainStrategy。需要在網域未命中後繼續解析 IP 時,可以使用 IPIfNonMatch,並確認 DNS 能夠回傳結果。修改後應中斷舊連線再測試,避免沿用既有工作階段。
通過連接埠測試後,再觀察遠端握手記錄。VLESS 與 VMess 的位址、連接埠、使用者識別碼、傳輸方式與安全層必須組成完整配對。只修改其中一個欄位,可能讓 TCP 建立連線成功,卻在 TLS、WebSocket 或協定驗證階段中斷。
驗證 routing 時不要只看網頁是否開啟。更可靠的方法是開啟核心存取記錄,確認目標網域或 IP 對應的 outboundTag。修改規則後關閉舊連線並重新發出請求,因為已建立的長連線不會自動切換至新的出站。
- 第一步:確認 JSON 解析成功,核心沒有在啟動階段退出。
- 第二步:確認 127.0.0.1 與入站連接埠正在監聽,應用程式代理位址完全一致。
- 第三步:確認遠端出站協定、連接埠、使用者參數與傳輸參數一致。
- 第四步:確認目標請求命中預期規則,並選取實際存在的 outboundTag。
- 第五步:重新建立連線,排除舊工作階段與快取結果對測試造成的干擾。
看懂設定的關鍵不是記住所有欄位,而是維持清楚的層次:inbounds 解決「流量如何進入」,outbounds 解決「流量從哪裡離開」,routing 解決「這個請求選擇哪個出口」。遇到錯誤時沿著實際請求方向逐層檢查,通常能將問題縮小到一個連接埠、一條規則或一組協定參數。