本文速览

本文面向准备把代理入口从电脑迁到 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”当作所有拓扑的固定步骤。测试期间也要检查旁路由是否向终端发送了会改变后续网关选择的重定向。

选择内核:先核对节点字段,再谈透明接管

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 查询成功也仅证明此次查询返回了结果,不能证明网页请求选择了正确出站。

如何定位能解析、打不开与 UDP 失败

故障排查按包经过的顺序进行。先确认测试电脑使用的网关,再检查接管计数,之后检查内核日志,最后看远端连接。不要在同一轮测试中同时换 DNS、换节点和改防火墙,否则即使恢复访问,也难以知道是哪项修改起作用。

现象优先核对判断依据
电脑上网,接管计数不变默认网关、规则来源地址、IPv6 路径流量可能未经过旁路由或未命中规则
计数增长,入站没有记录mark、策略路由、本地路由与区域权限包已被规则选中,但未成功交给套接字
入站有记录,出站反复连接代理服务器绕过、进程出站标记检查是否发生自身流量回环
网页正常,UDP 应用失败UDP 接管、节点 UDP 支持及回包TCP 成功不能替代 UDP 验证
部分站点超时DNS 答案、出口、MTU 与 IPv6先区分解析失败、握手失败和大包传输失败
重启后失效服务启动、规则持久化、路由恢复顺序临时规则与启动依赖没有完整保存

性能验收要固定测试条件。例如连续发起 10 次同一 HTTPS 请求,记录成功次数、连接耗时和下载期间 CPU 占用;再比较单连接与多连接结果。这是建议的测量方法,不是本文的实测成绩。路由器标称网口速率不能代表加密转发吞吐,CPU、散热、MTU 和节点链路都可能成为限制。

开启流量卸载后,为何规则计数和连接表现变化?

软件或硬件流量卸载可能改变后续数据包经过常规转发链的方式,兼容性取决于具体实现。诊断时先在「网络」→「防火墙」→「常规设置」关闭相关卸载选项,建立可重复的基线,再逐项启用验证,不要仅凭网页偶尔打开就判定兼容。

旁路由与桌面客户端怎样分工

旁路由适合承接稳定的家庭网络策略,桌面客户端适合设备离开局域网后的独立连接。同一条订阅可以用于不同设备,但订阅文本不是可以直接交给内核执行的配置文件。旁路由侧仍需生成对应的节点出站、路由规则和更新机制,且不能在导入新节点时覆盖透明入站与防回环设置。

推荐方案:家庭入口与移动设备分开管理

OpenWrt 旁路由
  • 运行 Xray,固定透明入站 12345。
  • 维护局域网例外、DNS 链路与服务启动。
  • 在已接管的电脑上先关闭桌面代理,验证单层路径。
终端客户端
  • 桌面使用 v2rayN,离家后独立选择节点。
  • 安卓按所需内核选择 v2rayNG 或 v2flyNG。
  • 需要设备端代理时,协调旁路由绕过策略与 DNS。

同一设备优先验证一条清楚的代理路径;叠加两层前,先明确每层的入口、出口与绕过条件。

部署完成的标准不是“进程还在运行”,而是终端网关正确、接管链命中、DNS 去向明确、出站符合规则,且重启后仍能复现。保留原网关和配置备份,可以在旁路由维护时把终端恢复到主路由,避免一次节点更新影响整个局域网。