Logo
热心市民王先生

解决方案设计

技术研究 人工智能 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+同上
管理工具v2rayAWeb UI + 透明代理
代理核心Xray-Corev2rayA 底层使用 Xray
分流规则v2rayA 内置支持多种路由策略

3.2 方案对比

维度方案A (原生)方案B (v2rayA)
配置复杂度
资源占用
Web 管理
故障回退自定义脚本内置支持
多服务器手动配置负载均衡
维护成本

3.3 推荐选择

推荐方案A(原生集成),理由:

  1. 学习价值:深入理解透明代理原理
  2. 可控性:每个环节都可调优
  3. 稳定性:最小化依赖,故障点少
  4. 资源占用:更适合 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.2DHCP 服务器 + 透明代理
客户端设备192.168.1.100-200DHCP 动态分配

端口规划

服务端口说明
V2Ray dokodemo12345TPROXY 监听端口
V2Ray API10085内部 API(可选)
dnsmasq DNS53DNS 服务
dnsmasq DHCP67/68DHCP 服务

故障回退机制设计

5.1 回退策略设计

核心原则:代理失效时,网络可用性优先,翻墙功能次之。

回退触发条件

  1. 进程级故障:V2Ray 进程崩溃或停止
  2. 网络级故障:代理服务器不可达(连接超时)
  3. 性能级故障:代理延迟过高(> 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 仅作为普通交换机转发流量,不进行任何处理

参考资料