旁路由运行 Xray 内核:OpenWrt 部署思路与透明代理概览

梳理在 OpenWrt 旁路由上直接运行 Xray 内核的整体思路:主路由网关指向、透明代理入站、分流规则放置位置,以及局域网设备的接入方式。

本文速览

本文面向能登录 OpenWrt、读懂 IP 路由与基础 JSON 的用户。先用一台测试设备验证旁路由网关,再区分显式代理与透明代理,最后安排 DNS、内核路由和防火墙规则。示例地址与端口用于说明拓扑,不是可以直接覆盖现网的完整部署脚本。

先画清旁路由与主路由的路径

旁路由不是插上网线就能接管全网的设备。局域网终端必须把流量交给它,或者主路由必须有明确的策略把选定流量送过去。本文采用单网口、同网段旁路由:主路由负责宽带接入与 DHCP,OpenWrt 负责接收指定终端的流量,判断直连或交给 Xray 出站。

设备或项目示例值职责
主路由 LAN192.168.10.1/24连接上游网络,保留 DHCP 服务
OpenWrt LAN192.168.10.2/24作为测试终端的 IPv4 网关
OpenWrt 默认网关192.168.10.1让旁路由自身连接上游
测试终端192.168.10.100/24手动指定网关,先不改全网 DHCP
测试终端网关192.168.10.2把非本地网段的流量送往旁路由

上行路径是“终端 → OpenWrt → 主路由 → 上游”。同一子网内的设备互访通常直接通过二层网络完成,不会因为修改默认网关就自动经过旁路由。OpenWrt 的默认网关仍指向主路由;不要同时把主路由的默认网关改成旁路由,否则容易形成转发环路。

区分 Xray 内核、客户端与透明代理

Xray 是处理入站、路由与出站的内核,不自带 OpenWrt 网络管理界面。v2rayN 是桌面客户端,v2rayNG 是使用 Xray 内核的 Android 客户端,v2flyNG 是使用 v2fly 内核的 Android 客户端。它们的订阅管理界面不等于 OpenWrt 服务配置,也不能把订阅地址直接当作 Xray 的 JSON 配置文件。

先测显式代理

推荐

先让一台终端明确连接旁路由上的 SOCKS 入站。确认远端出站可以工作后,再增加透明转发规则,减少同时排查协议配置与内核转发的变量。

适合:首次部署、验证节点参数、定位出站错误

再接透明代理

终端只指定网关,由 OpenWrt 防火墙和策略路由把选中的 TCP、UDP 流量送入 Xray。应用通常不必单独填写代理地址,但转发链路更复杂。

适合:已完成基础验证、需要接入多台局域网设备

显式代理只服务主动连接代理端口的应用;透明代理需要在网络层截获流量。仅启动 Xray、仅开放一个入站端口,或仅修改终端网关,都不足以完成透明代理。还需要 Linux 转发、防火墙匹配、策略路由和正确的回程处理。

按顺序检查 OpenWrt 基础配置

以下菜单按常见 LuCI 中文界面描述;翻译与主题可能略有区别。OpenWrt 22.03 起默认使用 firewall4 与 nftables,旧版常见 firewall3 与 iptables。先识别现有系统,再选择对应规则写法;不要把两套命令拼成一个启动脚本。

  1. 确认系统

    打开「状态」→「概览」,记录固件版本和目标平台;登录终端运行 ubus call system board 与 uname -m。内核程序必须匹配设备架构与运行环境,不能把桌面安装包放进路由器运行。

  2. 设置地址

    进入「网络」→「接口」→「LAN」→「编辑」→「常规设置」,将协议设为「静态地址」,配置示例地址 192.168.10.2、掩码 255.255.255.0 和 IPv4 网关 192.168.10.1。按实际网段替换后再保存应用。

  3. 关闭重复 DHCP

    在「网络」→「接口」→「LAN」→「编辑」→「DHCP 服务器」→「常规设置」中勾选「忽略此接口」,让主路由继续负责地址分配。本步骤针对本文同网段拓扑,不适用于由 OpenWrt 独立管理下游网段的方案。

  4. 验证本机联网

    在「系统」→「系统」检查时间与时区,再检查默认路由、域名解析和上游可达性。系统时间明显错误会影响 TLS 连接;本机都不能正常联网时,不要先调整透明代理规则。

  5. 启动内核测试

    从适配固件的可信软件源安装或部署 Xray,运行 xray version 确认实际版本。用 xray run -test -config /etc/xray/config.json 检查配置;这里的文件路径是本文约定,服务实际读取路径需核对启动脚本。

测试通过只代表配置可被解析,不代表远端可连接。继续核对服务器地址、端口、协议、传输方式与 TLS 参数。使用 VMess 或 VLESS 时,应逐项对应提供方给出的配置,不要凭协议名称猜测 security、flow 或传输设置。

ubus call system board
uname -m
ip -4 route show
sysctl net.ipv4.ip_forward
xray version
xray run -test -config /etc/xray/config.json

上述命令用于查看与测试,不会替你设置防火墙。net.ipv4.ip_forward 应按转发需求启用;同时确认防火墙允许所需的 LAN 转发。不要为了排错直接关闭整个防火墙,也不要向上游接口公开代理入站。

安排透明入站、流量标记与回环排除

透明代理常见入口是 REDIRECT 或 TPROXY。REDIRECT 常用于 TCP 重定向,不能把 TCP 的配置照搬为完整 UDP 方案;TPROXY 可处理 TCP 与 UDP,但需要匹配的内核模块、防火墙规则和策略路由。本文以 TPROXY 解释各层关系,不提供脱离具体固件的“一键规则”。

12345
本文示例透明入站端口
53
常规 DNS 服务端口
100
可选策略路由表编号

这些是规划值,不是性能测试结果。端口 12345 必须与防火墙的 TPROXY 目标端口一致;路由表 100 只是可选编号,使用前先查是否已被其他服务占用。标记值同样需要统一规划,不能与现有多线接入、策略路由规则冲突。

{
  "inbounds": [
    {
      "tag": "lan-tproxy",
      "listen": "0.0.0.0",
      "port": 12345,
      "protocol": "dokodemo-door",
      "settings": {
        "network": "tcp,udp",
        "followRedirect": true
      },
      "streamSettings": {
        "sockopt": {
          "tproxy": "tproxy"
        }
      }
    }
  ]
}

把防火墙分流与 Xray 路由分开

OpenWrt 防火墙决定“哪些包进入 Xray”;Xray 的 routing.rules 决定“进入内核后走哪个出站”。一条连接如果已经在防火墙层绕过,Xray 就看不到它,再精确的域名规则也不会生效。建议防火墙只负责必要的地址排除与接入范围,域名和业务分类集中在内核路由中维护。

处理位置放置内容验证方式
OpenWrt 防火墙源设备选择、保留地址排除、透明端口转交查看规则计数与 LAN 入方向流量
Linux 策略路由标记匹配、本地路由表查看 ip rule 与对应路由表
Xray 路由域名、目标地址、端口、入站标签匹配查看访问日志中的入站与出站标签
Xray 出站远端协议参数、直连与拒绝动作分别测试直连目标和代理目标

Xray 路由按规则顺序匹配,先命中的规则决定出站。把明确的局域网目标与特殊例外放在宽泛规则之前,避免一条大范围规则提前吞掉后面的细分条件。outboundTag 必须与实际出站的 tag 完全相同;不要只复制路由规则却漏掉对应出站。

单独设计 DNS 与 IPv6 接入

只修改 IPv4 网关,不等于 DNS 和 IPv6 都已进入旁路由。终端可能仍把 DNS 请求发往主路由,也可能通过主路由发布的 IPv6 默认路由直接访问上游。若希望测试设备通过旁路由解析域名,可以将其 DNS 指向 192.168.10.2,但前提是该地址确实运行了可用的 DNS 服务。

  1. 确定唯一入口。常见做法是让 OpenWrt 的 dnsmasq 接收 LAN 的 53 端口请求,再按明确策略转发。先检查端口占用,避免另一个 DNS 进程绑定同一地址和端口。
  2. 避免解析闭环。若 dnsmasq 转发给本机另一 DNS 服务,后者的上游不能再指回 dnsmasq。代理服务器本身使用域名时,还需准备不依赖尚未建立的代理连接的初始解析路径。
  3. 区分内核 DNS。Xray 的 dns 配置服务于内核相关解析,并不意味着局域网终端会自动改用它。终端请求必须经过实际 DNS 监听与转发链路。
  4. 检查加密 DNS。浏览器或应用自己的加密 DNS 不一定遵循系统 DNS 设置。测试时明确使用哪条解析路径,不要只根据一次 nslookup 判断所有应用。
  5. 核对 IPv6。分别检查终端 IPv4 与 IPv6 默认路由。准备接管 IPv6 时,应单独设计路由通告、IPv6 防火墙和透明转发;暂不接管时,在测试终端上明确限制测试范围。

用一台设备验证,再扩展接入范围

把测试终端设为 192.168.10.100,网关设为 192.168.10.2,先验证主路由管理页、局域网设备与普通直连目标可访问,再测试需要代理的目标。TCP 网页成功之后,单独验证 UDP 应用和 DNS;一张网页能打开并不能证明整个透明链路已经完整。

改了网关就断网,先看哪里?

先把网关改回主路由恢复连接,再检查 OpenWrt 的默认路由、net.ipv4.ip_forward 与 LAN 转发策略。若关闭透明截获后仍不通,优先排查基础转发和回程,不要先改远端协议参数。

显式代理能用,透明代理却不行?

对照防火墙命中计数、透明入站端口和策略路由表。检查 TPROXY 所需模块与服务权限。只测试同一台设备、同一个目标,并观察 Xray 是否出现对应入站记录;没有记录时先查流量入口。

网页能开,语音或游戏不通?

分别检查 UDP 是否被截获、入站是否包含 udp、远端链路是否支持所需 UDP 转发,以及防火墙回包是否允许。不要把启用 TCP 重定向等同于启用了 UDP 透明代理。

为什么有些设备没有经过旁路由?

检查该设备当前默认网关、IPv6 路由及防火墙源地址匹配。手动网关只影响已修改的终端;要扩大接入,应在验证后通过主路由 DHCP 的网关选项统一下发,并让终端续租。

完成单机验证后,再考虑让主路由通过 DHCP 选项 3 下发旁路由 IPv4 网关,通过选项 6 下发经过验证的 DNS 地址;具体界面由主路由固件决定。保留恢复原网关的记录,并注意终端可能继续使用旧租约。不要在没有回滚入口时一次性改动全网。

继续阅读 进阶手册,核对路由规则顺序与 DNS 设置;遇到概念混淆时,先用 术语表 区分入站、出站和系统代理。旁路由部署的关键是逐层验证:先通基础网络,再通内核出站,最后接入透明转发。

下载v2rayN按平台选择客户端