本文重點

本文適合準備將代理入口從電腦移至 OpenWrt 的使用者。本文以 OpenWrt 24.10.x、firewall4 與單一 IPv4 用戶端測試為基礎,分別說明閘道轉送、TPROXY 接管、Xray 路由與 DNS 的職責。文中的位址和連接埠僅供說明架構,設定片段須整合至既有節點設定,不能視為完整的一鍵部署指令碼。

先確認旁路由位置與流量路徑

旁路由不是代理協定,而是網路中的部署角色。主路由器負責連線至網際網路與 DHCP,旁路由則可為部分終端設備提供閘道與 DNS。只有流量實際經過旁路由,透明代理規則才有機會生效;在同一區域網路的設備上安裝 Xray,不會自動接管其他終端的流量。

本文以同網段單臂旁路由為例:主路由器位址為 192.168.10.1,OpenWrt 為 192.168.10.2,測試電腦為 192.168.10.100。旁路由的預設路由仍指向主路由器。先將測試電腦的 IPv4 閘道和 DNS 手動設為旁路由位址,其他設備則維持原有網路設定。

主路由器與測試終端

主路由器位址
192.168.10.1/24
DHCP 配發者
主路由器,維持單一配發來源
測試電腦位址
192.168.10.100/24
測試電腦閘道
192.168.10.2

旁路由的固定位址應避開 DHCP 動態配發範圍,或在主路由器設定靜態租約。

OpenWrt 服務入口

管理位址
192.168.10.2/24
預設上游閘道
192.168.10.1
透明入站連接埠
12345,TCP 與 UDP
區域網路 DNS
192.168.10.2:53

這些連接埠各自負責不同功能;DNS 連接埠不是透明代理入站連接埠。

單臂轉送還涉及同介面轉送、回程路徑與 ICMP redirect。主路由器可能直接將回應封包送給終端,導致旁路由無法看見完整的直連連線。是否需要來源位址轉換,應依回程路徑與連線追蹤結果判斷,不能將「啟用 NAT」視為所有網路架構都必須執行的步驟。測試期間也要確認旁路由是否傳送 ICMP redirect,導致終端後續改用其他閘道。

選擇核心:先確認節點欄位,再設定透明接管

v2rayN 是桌面用戶端,Xray 和 V2Fly 則是代理核心。OpenWrt 可直接執行核心程序,由服務管理器讀取 JSON 設定,不需要桌面介面。匯入訂閱、切換節點與透明轉送屬於不同層級的功能:安裝執行檔後,還需設定檔產生、服務啟動與防火牆整合。

Xray 核心

建議

本文以 Xray 的 dokodemo-door 與 TPROXY 設定為例。若節點使用 VLESS、REALITY 或 flow: xtls-rprx-vision,請選擇明確支援這些欄位的 Xray 版本,並核對相應文件。

適用情境:已有 Xray 節點,並希望在 OpenWrt 上統一設定透明代理入口。

V2Fly 核心

可用於該版本支援的 VMess 等節點與透明代理方案。設定欄位雖有相似之處,但不代表 Xray 的協定擴充、傳輸選項和設定檔都能直接沿用。

適用情境:已有 V2Fly 設定,且已確認環境支援所用協定與欄位。

安裝前請確認 CPU 架構、韌體套件來源與可用儲存空間。OpenWrt 24.10.x 預設使用 firewall4 與 nftables,網路上針對舊版 iptables 的指令不能直接照搬。TPROXY 也需要韌體提供相應的核心模組;套件成功安裝、核心程序順利啟動,都不代表封包接管流程已經建立。

ubus call system board
uname -m
xray version
nft list ruleset
ip rule show
ip route show table all

記錄實際回報的核心版本,不要只記套件名稱。升級後也要重新執行設定檔測試,尤其是節點包含 REALITY、fingerprint 或特定傳輸欄位時。OpenWrt 的設定檔路徑依套件與啟動指令碼而異,以下統一以 /etc/xray/config.json 為例。

dokodemo-door、TPROXY 與策略路由如何搭配

dokodemo-door 是接收流量的入站。啟用 followRedirect 後,它可透過透明接管機制取得原始目的位址。它本身不會建立 nftables 規則,也不會替系統設定策略路由。只在 inbounds 中新增連接埠,終端流量仍不會自動進入該連接埠。

以下是 Xray 入站設定片段,使用 12345 接收 TCP 與 UDP。內容僅展示 inbounds 部分;實際運作還需要有效的 outbounds、日誌設定與相應的防火牆規則。監聽所有 IPv4 位址是為了配合本機透明轉送,防火牆必須限制連線來源,不可將此連接埠開放至公網。

{
  "inbounds": [
    {
      "tag": "transparent-in",
      "listen": "0.0.0.0",
      "port": 12345,
      "protocol": "dokodemo-door",
      "settings": {
        "network": "tcp,udp",
        "followRedirect": true
      },
      "streamSettings": {
        "sockopt": {
          "tproxy": "tproxy"
        }
      }
    }
  ]
}
層級必要工作檢查項目
nftables 接管依來源篩選測試終端,將指定流量以 TPROXY 轉送至 12345新請求進來時規則計數會增加
封包標記為待本機轉送的封包設定約定的 mark範例使用 0x1/0x1
策略路由將上述 mark 導向專用的本機路由表範例表號為 100,包含指向 lo 的本機預設路由
Xray 入站接收轉送封包並還原原始目的位址transparent-in 有連線記錄
Xray 出站依 routing 選擇直連或代理日誌中的 outboundTag 符合預期

0x1 和表號 100 只是本例的設定,部署前必須確認不會與其他策略路由衝突。代理程序的連線必須使用另一種可辨識的略過條件,例如在出站 sockopt.mark 設定不同於接管標記的值,並在規則中優先略過。否則,連線至代理伺服器的流量可能再次進入透明入站,形成迴圈。

本文不提供適用所有韌體的完整 nftables 指令碼。應使用 firewall4 支援的持久化方式加入規則,並確認鏈的 hook、優先順序與防火牆區域權限。臨時指令執行成功,不代表重新載入防火牆後規則仍會保留。

routing 分流與 DNS 分流應分開驗證

防火牆決定哪些封包進入核心,routing 則決定封包進入後使用哪個出站,兩者不能互相取代。Xray 路由規則會依序比對,應先列出區域網路直連等明確例外,再處理需要代理的目的地;未符合任何規則的流量通常會使用第一個出站,因此也要檢查 outbounds 的排列順序。

以下為路由設定片段,假設既有設定已定義名為 direct 的直連出站,以及名為 proxy 的有效節點出站。範例會將透明入站的其他流量送往代理,這是為了方便驗證而採用的廣泛規則,並非完整的地區分流設定。

{
  "routing": {
    "domainStrategy": "IPIfNonMatch",
    "rules": [
      {
        "type": "field",
        "ip": [
          "10.0.0.0/8",
          "172.16.0.0/12",
          "192.168.0.0/16",
          "127.0.0.0/8"
        ],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "inboundTag": ["transparent-in"],
        "outboundTag": "proxy"
      }
    ]
  }
}

IPIfNonMatch 不代表「所有網域都會先解析再分流」。當原始目的地是網域名稱且已有規則符合時,不一定會為了路由比對而進行解析。透明連線若只帶有目的 IP,路由規則也無法憑空取得網域名稱;可視需求評估 sniffing,但它無法識別所有加密協定,也不能取代 DNS 規劃。

53 連接埠與核心 DNS 是兩個入口

OpenWrt 通常使用 dnsmasq 在 53 連接埠為區域網路提供 DNS。Xray 頂層的 dns 物件主要供核心內部解析使用,不會自動成為區域網路 DNS 伺服器。若要將 dnsmasq 轉送至本機 5353,必須先部署實際監聽 5353 且支援相應查詢協定的服務,再設定上游伺服器。

五步完成部署:先測試單一用戶端,再擴大範圍

先保留可用的管理路徑,再變更流量入口。以下選單以 OpenWrt 24.10.x 常見的 LuCI 介面為準,佈景主題與翻譯可能略有不同。修改位址前請先備份設定,並記下主路由器位址,以便將測試電腦還原至原本的閘道。

  1. 備份網路設定

    前往「系統」→「備份/升級」,建立設定備份。記下目前的 LAN 位址、DHCP 設定與防火牆區域,不要透過遠端連線直接替換整套規則。

  2. 固定旁路由位址

    前往「網路」→「介面」→「LAN」→「編輯」→「一般設定」,確認靜態位址為 192.168.10.2、子網路遮罩為 255.255.255.0,IPv4 閘道為 192.168.10.1。再到「DHCP 伺服器」→「一般設定」,確認旁路由不會重複配發位址。

  3. 驗證核心

    先使用可用節點完善出站設定,再執行設定檔測試。確認服務日誌正常後,再檢查 12345 是否正在監聽;此時先不要變更全網閘道,也不要啟用適用所有終端的接管規則。

  4. 先接管一台設備

    將測試電腦的閘道與 DNS 改為 192.168.10.2,並讓接管規則只符合來源位址 192.168.10.100。先測試 TCP,再測試 UDP,逐層觀察 nftables 計數、入站記錄與出站標籤。

  5. 持久化後重新測試

    確認「網路」→「DHCP/DNS」→「一般設定」中的 DNS 轉送目標。透過本機主控台重新載入防火牆並重新啟動設備,重測規則、策略路由與服務啟動;全部確認正常後,再擴大 DHCP 閘道的配發範圍。

xray run -test -config /etc/xray/config.json
ss -lnptu
logread | grep -i xray
nft list ruleset
ip rule show
ip route show table 100
nslookup example.com 192.168.10.2

以上指令用於確認狀態。如果韌體未安裝 ss,請先安裝對應的診斷工具,或使用韌體內建的通訊端檢視指令。設定檔測試通過只表示核心接受該設定,不能證明遠端節點可連線;DNS 查詢成功也只表示這次查詢有回應,無法證明網頁請求使用了正確的出站。

如何排查 DNS 可解析、網站無法開啟與 UDP 失敗

請依封包經過的順序逐步排查。先確認測試電腦使用的閘道,再查看接管計數,接著檢查核心日誌,最後確認遠端連線。不要在同一輪測試中同時更換 DNS、節點與防火牆設定,否則即使恢復連線,也很難判斷是哪項修改發揮作用。

現象優先檢查項目判斷依據
電腦可上網,但接管計數沒有變化預設閘道、規則來源位址、IPv6 路徑流量可能未經過旁路由,或未符合規則
計數增加,但入站沒有記錄mark、策略路由、本機路由與區域權限封包已符合規則,但未能成功交給通訊端
入站有記錄,出站卻反覆連線代理伺服器略過條件、程序出站標記確認是否發生代理流量迴圈
網頁正常,但 UDP 應用程式失敗UDP 接管、節點的 UDP 支援與回程封包TCP 成功不代表 UDP 也正常
部分網站逾時DNS 回應、出口、MTU 與 IPv6先區分 DNS 解析失敗、握手失敗與大型封包傳輸失敗
重新啟動後失效服務啟動、規則持久化與路由還原順序臨時規則與啟動相依設定未完整保存

效能驗收時應固定測試條件。例如連續發出 10 次相同的 HTTPS 請求,記錄成功次數、連線耗時與下載期間的 CPU 使用率,再比較單一連線與多條連線的結果。這是建議的測量方式,並非本文的實測結果。路由器標示的網路埠速率不等於加密轉送吞吐量;CPU、散熱、MTU 與節點連線都可能成為瓶頸。

啟用流量卸載後,為什麼規則計數與連線狀況會改變?

軟體或硬體流量卸載可能改變後續封包經過一般轉送流程的方式,實際相容性依實作而異。排查時先前往「網路」→「防火牆」→「一般設定」,停用相關卸載選項並建立可重複的測試基準,再逐項啟用確認。不要只因網站偶爾能開啟,就判定設定相容。

旁路由與桌面用戶端如何分工

旁路由適合負責穩定的家庭網路策略;桌面用戶端則適合設備離開區域網路後自行連線。同一份訂閱可供不同設備使用,但訂閱文字不是可直接交由核心執行的設定檔。旁路由仍須產生相應的節點出站、路由規則與更新機制;匯入新節點時,也不能覆蓋透明入站與防止迴圈的設定。

建議配置:分開管理家庭網路入口與行動裝置

OpenWrt 旁路由
  • 執行 Xray,固定使用 12345 作為透明入站。
  • 維護區域網路例外規則、DNS 流程與服務啟動。
  • 在已接管的電腦上先停用桌面代理,確認單一代理路徑正常。
終端用戶端
  • 在桌面使用 v2rayN,離家後自行選擇節點。
  • Android 裝置依所需核心選擇 v2rayNG 或 v2flyNG。
  • 若需要在裝置端使用代理,請協調旁路由的略過策略與 DNS 設定。

同一台設備應優先確認單一且清楚的代理路徑;疊加兩層代理前,先釐清各層的入口、出口與略過條件。

部署完成的判準不是「程序仍在執行」,而是終端閘道設定正確、接管流程有命中、DNS 走向明確、出站符合規則,且重新啟動後仍能重現。保留原有閘道設定與設定備份,旁路由維護時便可將終端還原至主路由器,避免更新一次節點就影響整個區域網路。