本文適合已經會匯入伺服器、希望進一步讀懂 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。這表示只有本機程式可以連線至該連接埠,區域網路中的其他裝置無法直接使用此入口。
listen 與 port 決定核心在哪裡等待連線,protocol 決定如何解讀進入連接埠的資料。連接埠沒有特殊魔法,只要位於有效範圍、未被其他程式占用,並與應用程式填寫的代理連接埠一致即可。若瀏覽器設定為 127.0.0.1:10808,但設定檔監聽 10809,請求就不會進入核心。
settings 與 sniffing 分別控制什麼
設定重點
入站的 settings 由所選協定決定。SOCKS 入站中的 auth 與 udp 有其用途,但將這些欄位原樣放入其他協定的入站不一定有效。閱讀文件時應先確認欄位屬於哪個協定,不要只因名稱相似就直接套用設定。
sniffing 用來從連線初始資料中補充目標網域。應用程式有時會先將網域解析為 IP,再把 IP 交給代理;啟用嗅探後,核心可能從 HTTP 主機欄位或 TLS 握手資訊中還原網域,讓以網域為基礎的 routing 規則有機會命中。嗅探不是網域解析器,也不會取代 dns。
tag是入站的內部識別名稱,路由規則可透過inboundTag區分流量來源。listen: 127.0.0.1適合僅供目前裝置使用的本機代理入口。port發生衝突時,日誌通常會出現監聽失敗或位址已被占用的提示。udp: true表示 SOCKS 入站允許處理 UDP 請求,但最終能否傳輸仍取決於出站協定與伺服器端設定。
outbounds:定義流量從哪裡離開
設定重點
outbounds 同樣是陣列,但職責與入站相反:它描述核心如何連線至最終目標。代理出站通常包含伺服器位址、伺服器連接埠、使用者識別碼、協定參數與傳輸設定;直連出站使用 freedom,由目前裝置直接存取目標;如需明確阻擋,也可以使用專用的拒絕出站並透過標籤引用。
範例中的 proxy 與 direct 都是 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/8、172.16.0.0/12 與 192.168.0.0/16。第二條規則比對 TCP 與 UDP,作為其餘流量的代理出口。這裡的規則數量不多,但已呈現「具體規則優先、寬泛規則靠後」的基本原則。
- 確認規則的
type是核心支援的類型,常用的欄位比對規則使用field。 - 檢查條件屬於網域、IP、連接埠、網路類型或入站標籤中的哪一類。
- 由上而下尋找第一條可能命中的規則,不要只查看預期中的規則本身。
- 核對
outboundTag是否與 outbounds 中某個 tag 完全一致,包括大小寫。 - 暫時調高日誌層級並重新啟動核心,透過日誌確認實際目標與錯誤發生階段。
domainStrategy 決定何時為路由解析網域
設定重點
範例使用 IPIfNonMatch。當目標以網域形式傳入,且網域規則未命中時,路由模組可以解析該網域,再嘗試比對 IP 規則。這讓某些以位址資料庫為基礎的規則能處理網域目標,但也會增加一次解析程序。
domainStrategy 不是「所有 DNS 請求要走哪個出站」的開關,也不等同於系統 DNS 設定。它主要影響 routing 在比對過程中是否以及何時將網域解析為 IP。DNS 伺服器選擇、查詢流量路徑與最終連線的目標位址,仍需結合 dns、路由規則與出站設定一併判斷。
| 比對條件 | 範例 | 適合解決的問題 |
|---|---|---|
| 網域 | domain |
依完整網域、子網域範圍或預設網域類別分流 |
| IP | ip |
依 CIDR、單一位址或位址類別分流 |
| 連接埠 | port |
將指定的目標連接埠交給特定出口 |
| 入站標籤 | inboundTag |
讓不同的本機入口採用不同的出口策略 |
| 網路類型 | network |
區分 TCP 與 UDP 流量 |
結論:分流異常先檢查規則順序
當目標總是走向同一個出口時,先查看它是否被前面的寬泛規則提前攔截,再檢查網域是否已變成 IP,以及出站標籤是否存在。
dns 與 log:輔助解析與定位故障
dns 定義核心可使用的 DNS 伺服器與相關解析策略。範例依序列出 localhost 與 1.1.1.1,用於說明伺服器清單結構。實際設定應依網路環境與路由目標選擇解析方式,並注意查詢是否會由預期的出站處理。
需要特別區分應用程式自己的解析、作業系統解析與 V2Ray 內建 DNS。若應用程式先解析網域,只將 IP 交給 SOCKS 入站,核心未必會重新執行相同的網域查詢;啟用 sniffing 後可能還原網域,但能否成功取決於協定流量中是否能擷取相應資訊。排查網域分流時,應先確認核心實際收到的是網域還是 IP。
dns 段
- 範例伺服器
- localhost
- 備用位址
- 1.1.1.1
- 主要職責
- 提供網域解析
- 關聯模組
- routing
解析結果可能參與 IP 規則比對,但 dns 本身不決定最終出口。
log 段
- 範例層級
- warning
- 排查層級
- info 或 debug
- 主要職責
- 記錄執行狀態
- 重點資訊
- 監聽與連線錯誤
詳細日誌適合用於暫時診斷,完成排查後可恢復為較精簡的層級。
loglevel 控制輸出的詳細程度。日常執行使用 warning 可保留警告與錯誤;需要觀察請求路徑時,可以暫時改為 info 或 debug。詳細層級會產生更多記錄,問題解決後不宜長期保留。
- 啟動後完全沒有監聽連接埠:先檢查 JSON 語法、欄位類型與連接埠占用情況。
- 本機連接埠可連線但遠端失敗:核對 outbounds 的伺服器、協定與傳輸參數。
- 代理可用但分流錯誤:檢查 routing 順序、目標形式與 outboundTag。
- 網域連線失敗但 IP 可存取:檢查 DNS 回應、解析路徑與網域策略。
- 只有 UDP 應用程式異常:確認入站允許 UDP,並核對出站與伺服器端的 UDP 能力。
從用戶端產生設定到手動排查
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 後為什麼看不到變化?
儲存檔案後重新啟動核心,並確認正在編輯的是目前程序實際讀取的設定。圖形用戶端可能會在每次啟動時重新產生執行設定。
建議採用的最小排查順序
- 先確認 JSON 可以解析,所有物件、陣列、逗號與引號的位置都正確。
- 啟動核心並檢查
127.0.0.1:10808是否已開始監聽。 - 暫時保留一個明確的代理出站與一個直連出站,減少變數數量。
- 使用兩條 routing 規則驗證私有位址直連,其餘流量走代理。
- 確認基礎連線成立後,再逐項加入網域類別、連接埠條件與更多出站。
- 每次只修改一組相關欄位,重新啟動後立即讀取對應日誌。
讀懂 V2Ray 設定的關鍵,是將欄位還原為連線路徑:inbounds 負責接收,routing 負責選擇,outbounds 負責傳送,dns 為網域比對與連線提供解析結果,log 則為每個階段提供診斷線索。遇到問題時,依這五個邊界逐段縮小範圍,比同時修改協定、連接埠、DNS 與路由更容易得到可驗證的結論。