本文適合已匯入節點、想看懂執行設定的使用者。先從本機連接埠找到入站,再依路由中的標籤找到出站,最後分辨節點參數、傳輸參數與客戶端設定。讀完後,就能判斷連線在哪個環節出問題,也能分清「設定檔載入成功」和「節點連線成功」的差異。
一、先分清客戶端設定與核心執行設定
config.json 通常是交由核心讀取的 JSON 檔案,檔名本身不會決定檔案內容。v2rayN 儲存的伺服器清單、訂閱群組與介面偏好,屬於客戶端管理資料;啟動核心時,客戶端會依據目前使用的伺服器與路由設定產生執行設定。只匯出一條分享連結,得到的並不是包含入站和路由的完整設定檔。
閱讀時應以實際使用的執行檔為準。v2rayN 各版本的匯出入口與產生檔案的位置可能不同,請先確認匯出的是完整設定檔,而不是伺服器分享內容。Android 版 v2rayNG 使用 Xray 核心,v2flyNG 使用 V2Fly 核心;兩者的基本結構相近,但不能因此認定擴充欄位都通用。
inbounds:接收應用程式連線,例如本機的 SOCKS 或 HTTP 代理連接埠。outbounds:定義流量出口,例如 VMess 代理、直接連線或拒絕連線。routing:依規則決定連線要交給哪個出站,不會建立出站本身。log與dns:分別控制日誌與內建 DNS 行為,並不等同於系統代理開關。
二、完整 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。
| 欄位 | 範例值 | 說明重點 |
|---|---|---|
protocol | vmess | 決定代理協定及其 settings 結構。 |
users[].security | auto | VMess 使用者層的加密選項,不是 TLS 開關。 |
users[].alterId | 0 | VMess AEAD 常見的設定,應與伺服器端要求一致。 |
streamSettings.network | tcp | 本例使用的傳輸方式;名稱與可用值會因核心版本而異。 |
streamSettings.security | tls | 啟用傳輸層 TLS,與使用者層的 security 各自負責不同功能。 |
tlsSettings.serverName | example.com | 用於 TLS 的伺服器名稱與憑證名稱驗證。 |
direct 使用 freedom 直接連線至目標,block 使用 blackhole 拒絕流量。這些只是標籤名稱,實際行為由 protocol 決定;將 freedom 的標籤改成「proxy」,也不會讓它變成遠端代理。本例沒有任何規則引用 block,因此只宣告這個出站並不會自動封鎖請求。
判斷設定相容性:先看協定,再看核心欄位
不要直接把 VMess 的 protocol 改成 VLESS 後就執行。兩者的身分與加密欄位結構不同;使用 REALITY 等擴充功能時,也必須確認目前執行的是支援該欄位的 Xray 核心,不能只看檔名判斷。
五、routing:規則順序、tag 引用與預設出口
路由規則會由上往下檢查,符合條件後就依該規則選擇出口。本例第一條規則只會將完整網域 example.org 交給 direct。full: 代表完全比對,不會連同子網域一起比對。第二條規則會將符合私人位址範圍的目標交給相同出口;其他連線若未符合任何規則,則使用 outbounds 中的第一個出站,也就是 proxy。
- 連線目標是網域
example.org:符合第一條規則,尋找標籤為tag: "direct"的出站。 - 連線目標是位址
192.168.1.20:符合第二條私人位址規則,直接連線至區域網路目標。 - 連線目標是其他未符合規則的網域:使用第一個出站
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,重新啟動核心後重現一次失敗的請求;完成排查後再恢復原設定。日誌可能包含瀏覽的網域、目標位址與設定檔路徑,公開求助前請刪除訂閱連結、使用者身分參數及個人路徑。
- 啟動後立即退出:先檢查 JSON 語法、欄位型別,以及核心不支援的協定選項。連接埠必須是數字
10808,不可將說明文字一併寫入字串。 - 顯示監聽失敗:檢查 10808、10809 是否已被另一個客戶端執行個體占用;先別修改遠端伺服器的連接埠。
- 本機連接埠可連線,但遠端失敗:接著檢查伺服器位址、443 連接埠、使用者身分參數及 TLS 名稱是否與伺服器端設定一致。
- 只有部分目標使用錯誤的出口:檢查規則順序、標籤引用、請求傳入的是網域還是 IP,以及未符合規則時使用的預設出口。
七、config.json 常見問題
檔案可以開啟,為什麼核心仍然顯示設定錯誤?
文字編輯器能開啟檔案,不代表它是合法的 JSON。先檢查結尾多餘的逗號、雙引號與括號,再依日誌找出問題欄位。語法正確後,還要確認欄位結構受目前使用的核心支援;例如,不能把出站物件放進 inbounds 陣列。
在 HTTP 代理設定中填入 10808,為什麼連線失敗?
本例的 10808 接收 SOCKS 請求,10809 才接收 HTTP 代理請求。請在應用程式中將代理類型改為 SOCKS5 並使用 10808,或維持 HTTP 類型並改用 10809;實際操作前仍須確認自己的執行設定中使用的連接埠。
設定檔裡明明寫了 proxy,為什麼流量還是直接連線?
先確認應用程式確實連上本機入站,再檢查符合的規則是否指向 direct。proxy 只是標籤,不會自動啟用系統代理;客戶端的系統代理開關與核心的路由設定必須分別確認。
可以將桌面版的完整設定檔直接匯入 Android 客戶端嗎?
請先確認目標客戶端支援的核心欄位與匯入方式。桌面版的監聽連接埠、日誌路徑和路由資料不一定適用於 Android 環境。若只需要同步伺服器,建議優先匯入訂閱或節點分享內容,再於目標客戶端設定本機監聽與路由,不要直接用整份設定檔覆蓋執行設定。