適合已匯入節點、想進一步看懂核心設定的使用者。先沿著請求路徑認識四個頂層欄位,再拆解 VMess + WebSocket + TLS 範例,最後檢查標籤引用、規則順序與 DNS。讀完後,你將能判斷該調整入站、節點參數還是路由,而不是每次連線失敗就重寫整份 JSON。
1. 設定檔與用戶端設定:先分清楚
v2rayN、v2rayNG 是用戶端,負責管理節點、更新訂閱,以及產生核心執行設定。v2rayNG 使用 Xray 核心;v2flyNG 使用 v2fly 核心。v2rayN 可以管理不同核心,但本文討論的是 V2Ray/Xray 傳統 JSON 設定格式,並非所有核心都通用的欄位表。
這裡的 config.json 指核心實際讀取的設定檔,不是用戶端用來儲存視窗位置、訂閱群組等資訊的設定檔。檔名也不一定固定:判斷依據是啟動命令指定的檔案,以及內容是否包含 inbounds、outbounds 等欄位。用戶端更新節點或重新啟動核心時,自動產生的檔案可能會被覆寫。
inbounds:定義核心在哪裡接收請求,例如本機 SOCKS 連接埠。outbounds:定義請求如何離開核心,例如透過代理節點、直接連線或封鎖。routing:依目標網域、IP、入站標籤等條件選擇出站。dns:設定內建解析器;這不是自動接管系統 DNS 的開關。
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"]
}
}
這些連接埠是本文的範例值,不是每個版本固定使用的預設值。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 入站啟用嗅探。
tag是設定內部的引用名稱,不是提供給伺服器的使用者名稱。settings.udp: true不會自動將所有 UDP 流量導入核心,也不等於啟用 TUN。- Android 用戶端的 VPN 接管方式,無法只用這兩個本機監聽連接埠來說明;本文範例主要用於理解手動代理入口。
4. outbounds:分別檢查節點驗證與傳輸層
在代理出站中,protocol: "vmess" 表示節點協定。settings.vnext 儲存伺服器清單,users 儲存驗證參數。id 是使用者 UUID;alterId: 0 是現代 VMess 常見的設定,不要照著舊教學填入非零值碰運氣。users[].security: "auto" 是 VMess 的加密選項,與 TLS 開關不同。
| 欄位 | 範例值 | 實際作用 |
|---|---|---|
vnext[].address | node.example.invalid | 核心連線的節點位址 |
vnext[].port | 443 | 伺服器監聽連接埠,不是本機入站連接埠 |
streamSettings.network | ws | 使用 WebSocket 傳輸 |
streamSettings.security | tls | 在傳輸層啟用 TLS |
tlsSettings.serverName | node.example.invalid | TLS 伺服器名稱,通常用於 SNI 與憑證名稱驗證 |
wsSettings.path | /ws | WebSocket 請求路徑,必須與伺服器設定相符 |
wsSettings.headers.Host | node.example.invalid | WebSocket 交握使用的 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」無關。
- 確認標籤:
outboundTag: "direct"必須能找到tag: "direct"的出站。 - 檢查順序:明確的例外規則通常應排在範圍較廣的規則之前;兜底規則若提早放置,會遮蔽後續規則。
- 檢查條件:同一條規則中的不同欄位通常必須同時符合;同一欄位陣列中的多個候選項,通常任一符合即可。
- 檢查資料:
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 分流。應用程式可能在送出請求前自行解析;系統、瀏覽器與核心各自的解析路徑都需要分別檢查。
- 應用程式傳入網域:核心可使用網域規則進行判斷;若路由策略需要 IP,則會呼叫內建 DNS 取得位址。
- 應用程式先解析再傳入 IP:路由看到的可能只有 IP。嗅探或許能補充部分網域線索,但無法保證還原所有請求。
- 直連出站解析:
freedom的網域策略也會影響解析方式;本例的空設定不代表所有解析都會經過上述內建上游。 - 遠端代理解析:網域透過代理協定傳送至伺服器後,可能由伺服器進行解析,實際情況取決於請求方式與設定。
因此,設定了 dns 並不能單獨證明所有解析都會依預期經過代理。還需要確認應用程式是否使用獨立解析、路由的 domainStrategy、出站解析策略,以及 DNS 查詢本身是否可連線。特別是必須解析網域才能連線的節點,請勿讓解析節點網域的路徑依賴尚未建立的節點連線。
7. 從匯出設定到排除故障:一次只改一個變數
排除故障時,先保留一份可正常執行的設定,再檢查核心版本與目前實際讀取的檔案。在 v2rayN 中,可透過「設定」→「參數設定」查看或調整本機監聽相關參數;實際分頁與選項名稱會隨版本而異。介面中的節點表單、路由設定與執行時 JSON 必須彼此對應,不能只檢查一份可能已被用戶端重新產生的檔案。
- 檢查語法:使用本機編輯器檢查括號、逗號與資料型別。請勿將 UUID、訂閱網址或節點資訊提交至公開的線上格式化服務。
- 檢查核心相容性:確認讀取設定的是 V2Ray 還是 Xray。新欄位與傳輸方式必須符合目前核心支援的範圍。
- 檢查入口:確認程序正在監聽實際設定的連接埠。若出現
address already in use,先處理連接埠占用問題,不要急著修改節點 UUID。 - 檢查出站:暫時減少規則變數,核對位址、驗證資訊與傳輸設定。逾時、驗證失敗與 TLS 錯誤應分別排查。
- 檢查分流:新增一條比對範圍明確的測試規則,確認請求是否選到目標出站,再還原完整規則集。
- 降低除錯記錄:必要時暫時將
loglevel改為debug;完成後恢復為warning,避免持續記錄過多連線資訊。
獨立執行核心時,可使用核心提供的設定測試命令。以下適用於目前採用子命令格式的 V2Ray/Xray 執行檔,請將路徑換成實際檔案位置;舊版命令列參數可能不同,請先查看本機的 help 輸出。
v2ray test -c config.json
xray run -test -config config.json
測試成功主要表示目前的核心能解析並載入設定,不代表節點在線、憑證正確,或所有規則都符合預期。最後仍須使用明確支援代理的應用程式送出實際請求。檢查記錄時,請留意入站標籤、目標位址與選定的出站;分享記錄前,先移除驗證資訊與個人瀏覽記錄。
操作結論:分層驗證入口、出站、路由與 DNS
先確認請求進入正確的連接埠,再確認代理節點可用,最後才加入分流與解析策略。每個步驟都保留一份可還原的設定副本,避免同時修改四個層面後,只剩一句「還是連不上」。