解决方案设计
技术研究 人工智能 GitHub
!-- Plan A (native), Plan B (workaround), architecture --
本章节将设计完整的系统架构,包括网络拓扑、组件协作关系,以及关键的故障回退机制。
方案A: 原生集成方案
2.1 方案概述
方案A 采用标准的 OpenWrt + V2Ray 原生集成方式,通过 iptables/nftables 实现透明代理,配合自定义健康检查脚本实现故障回退。
核心组件:
| 组件 | 实现方式 | 说明 |
|---|---|---|
| 操作系统 | OpenWrt 23.05+ | 官方稳定版 |
| 代理服务 | V2Ray-Core / Xray-Core | 透明代理模式 |
| 流量劫持 | iptables + TPROXY | 内核级透明代理 |
| DHCP 服务 | dnsmasq-full | 内置完整功能 |
| 健康检查 | Shell 脚本 + cron | 自定义监控方案 |
2.2 工作流程
正常代理流程:
客户端请求 → R4S (网关) → iptables 劫持 → V2Ray (dokodemo-door)
↓
V2Ray 路由决策 → [国内直连 / 国外代理] → 互联网
故障回退流程:
健康检查脚本检测到 V2Ray 故障
↓
自动清除 TPROXY 规则
↓
流量直接转发到主路由(旁路由转交换模式)
↓
定期重试检测 V2Ray 恢复
↓
恢复后重新启用 TPROXY 规则
2.3 方案优缺点
优点:
- 完全原生,无额外依赖
- 资源占用低,适合嵌入式设备
- 可精细控制每个环节
缺点:
- 配置复杂,需要手动编写 iptables 规则
- 健康检查脚本需要自行开发维护
- 无 Web 管理界面(纯命令行)
方案B: 备用方案
3.1 方案概述
方案B 使用 v2rayA 作为管理工具,提供 Web UI 简化配置,内置健康检查和负载均衡功能。
核心组件:
| 组件 | 实现方式 | 说明 |
|---|---|---|
| 操作系统 | OpenWrt 23.05+ | 同上 |
| 管理工具 | v2rayA | Web UI + 透明代理 |
| 代理核心 | Xray-Core | v2rayA 底层使用 Xray |
| 分流规则 | v2rayA 内置 | 支持多种路由策略 |
3.2 方案对比
| 维度 | 方案A (原生) | 方案B (v2rayA) |
|---|---|---|
| 配置复杂度 | 高 | 低 |
| 资源占用 | 低 | 中 |
| Web 管理 | ❌ | ✅ |
| 故障回退 | 自定义脚本 | 内置支持 |
| 多服务器 | 手动配置 | 负载均衡 |
| 维护成本 | 高 | 低 |
3.3 推荐选择
推荐方案A(原生集成),理由:
- 学习价值:深入理解透明代理原理
- 可控性:每个环节都可调优
- 稳定性:最小化依赖,故障点少
- 资源占用:更适合 R4S 的有限资源
建议选择方案B(v2rayA)的场景:
- 追求快速部署,不愿投入学习时间
- 需要多代理服务器负载均衡
- 需要图形化界面管理
架构设计
4.1 系统架构图
┌─────────────────────────────────────────────────────────────────┐
│ 家庭网络环境 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 光猫/ │ │ NanoPi │ │ 客户端 │ │
│ │ 主路由 │◄────►│ R4S │◄────►│ 设备群 │ │
│ │ 192.168.1.1 │ │ 192.168.1.2 │ │ DHCP获取 │ │
│ └─────────────┘ └──────┬──────┘ └─────────────┘ │
│ │ │
│ ┌─────────┴──────────┐ │
│ │ OpenWrt 系统 │ │
│ │ ┌──────────────┐ │ │
│ │ │ V2Ray │ │ │
│ │ │ (dokodemo) │ │ │
│ │ └──────┬───────┘ │ │
│ │ │ │ │
│ │ ┌──────┴──────┐ │ │
│ │ │ iptables │ │ │
│ │ │ (TPROXY) │ │ │
│ │ └─────────────┘ │ │
│ └────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
4.2 数据流向设计
透明代理数据流:
flowchart TD
Client[客户端设备] -->|目标: 8.8.8.8| R4S[R4S 网关]
R4S -->|iptables PREROUTING| TProxy[TPROXY 劫持]
TProxy -->|目标端口 12345| V2Ray[V2Ray dokodemo]
V2Ray -->|路由决策| Router{路由判断}
Router -->|GeoIP: CN| Direct[直连出口]
Router -->|GeoIP: !CN| Proxy[V2Ray 代理]
Direct -->|192.168.1.1| WAN[主路由/互联网]
Proxy -->|加密隧道| WAN
4.3 关键配置决策
IP 地址规划:
| 设备 | IP 地址 | 角色 |
|---|---|---|
| 主路由(光猫) | 192.168.1.1 | 默认网关 |
| R4S 旁路由 | 192.168.1.2 | DHCP 服务器 + 透明代理 |
| 客户端设备 | 192.168.1.100-200 | DHCP 动态分配 |
端口规划:
| 服务 | 端口 | 说明 |
|---|---|---|
| V2Ray dokodemo | 12345 | TPROXY 监听端口 |
| V2Ray API | 10085 | 内部 API(可选) |
| dnsmasq DNS | 53 | DNS 服务 |
| dnsmasq DHCP | 67/68 | DHCP 服务 |
故障回退机制设计
5.1 回退策略设计
核心原则:代理失效时,网络可用性优先,翻墙功能次之。
回退触发条件:
- 进程级故障:V2Ray 进程崩溃或停止
- 网络级故障:代理服务器不可达(连接超时)
- 性能级故障:代理延迟过高(> 5s)或丢包严重
回退执行动作:
# 1. 清除 TPROXY 规则
iptables -t mangle -F V2RAY 2>/dev/null
iptables -t mangle -D PREROUTING -j V2RAY 2>/dev/null
# 2. 清除代理链
iptables -t mangle -X V2RAY 2>/dev/null
# 3. 流量直接转发(旁路由转交换模式)
# 此时 R4S 仅作为普通二层交换机使用
5.2 健康检查机制
检查脚本设计:
#!/bin/sh
# /usr/bin/v2ray-health-check.sh
V2RAY_PID=$(pgrep -f "v2ray")
PROXY_SERVER="your.proxy.server:443"
CHECK_INTERVAL=30 # 检查间隔(秒)
# 检查 1:进程是否存在
if [ -z "$V2RAY_PID" ]; then
echo "[$(date)] V2Ray process not found"
/usr/bin/v2ray-fallback.sh enable
exit 1
fi
# 检查 2:代理服务器连通性(通过主路由直连,不经过代理)
if ! curl -s --max-time 5 --interface br-lan -o /dev/null "https://${PROXY_SERVER}"; then
echo "[$(date)] Proxy server unreachable"
/usr/bin/v2ray-fallback.sh enable
exit 1
fi
# 检查通过,确保代理模式启用
/usr/bin/v2ray-fallback.sh disable
Fallback 控制脚本:
#!/bin/sh
# /usr/bin/v2ray-fallback.sh
ACTION=$1
TPROXY_PORT=12345
MARK=0x1
case $ACTION in
enable)
# 启用回退模式(清除代理规则)
iptables -t mangle -F V2RAY 2>/dev/null
echo "[$(date)] Fallback mode enabled"
;;
disable)
# 禁用回退模式(恢复代理规则)
/etc/init.d/v2ray-setup-iptables restart
echo "[$(date)] Proxy mode restored"
;;
esac
5.3 自动化部署
cron 定时任务:
# /etc/crontabs/root
# 每 30 秒检查一次 V2Ray 健康状态
*/1 * * * * /usr/bin/v2ray-health-check.sh
*/1 * * * * sleep 30 && /usr/bin/v2ray-health-check.sh
5.4 状态监控
状态日志:
# 查看回退状态
tail -f /var/log/v2ray-fallback.log
# 查看当前 iptables 规则
iptables -t mangle -L V2RAY -n -v
# 查看 V2Ray 进程状态
/etc/init.d/v2ray status
网络拓扑图
6.1 物理拓扑
互联网 (Internet)
│
▼
┌─────────────────────┐
│ 光猫/主路由 │
│ 192.168.1.1 │
│ PPPoE 拨号 │
└──────────┬──────────┘
│ 千兆网线
│
┌───────────────┼───────────────┐
│ │ │
▼ ▼ ▼
┌─────────┐ ┌─────────┐ ┌─────────┐
│ R4S │ │ PC-1 │ │ PC-2 │
│旁路由 │ │ 有线 │ │ WiFi │
│1.2 │ │ │ │ │
└────┬────┘ └─────────┘ └─────────┘
│
┌────┴────┐
│ 交换机 │ (可选扩展)
└────┬────┘
│
┌────┴────┐
│ 更多设备 │
└─────────┘
6.2 逻辑拓扑
┌────────────────────────────────────────────────────────────────┐
│ 逻辑网络架构 │
├────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────────┐ ┌──────────────────┐ │
│ │ 主路由 │ │ R4S 旁路由 │ │
│ │ 192.168.1.1 │◄────►│ 192.168.1.2 │ │
│ │ NAT/DHCP(关) │ │ DHCP(开)/代理 │ │
│ └────────┬─────────┘ └────────┬─────────┘ │
│ │ │ │
│ │ 同一二层网络 │ │
│ │ 192.168.1.0/24 │ │
│ │ │ │
│ ┌────────┴─────────┬───────────────┴────────┐ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌──────┐ ┌────────┐ ┌─────────┐ │
│ │ NAS │ │ 手机 │ │ 电视 │ │
│ └──────┘ └────────┘ └─────────┘ │
│ │
│ 所有设备网关指向 192.168.1.2(R4S) │
│ R4S 上游网关指向 192.168.1.1(主路由) │
│ │
└────────────────────────────────────────────────────────────────┘
6.3 故障回退拓扑变化
正常模式:
客户端 → R4S (TPROXY) → V2Ray → 判断 → [直连/代理] → 主路由 → 互联网
回退模式:
客户端 → R4S (透明转发) → 主路由 → 互联网
(无 TPROXY)
关键区别:
- 正常模式下,R4S 对流量进行劫持和处理
- 回退模式下,R4S 仅作为普通交换机转发流量,不进行任何处理
参考资料
- OpenWrt 网络配置 - 官方网络配置指南
- V2Ray TPROXY 透明代理 - 中文透明代理教程
- Linux TPROXY 原理 - 内核 TPROXY 文档
- iptables 详解 - ArchWiki iptables 指南