Hotdry.

Article

用 Dart/Flutter 构建跨平台代理客户端:集成 ClashMeta 核心实现分流规则引擎

解析 FlClash 的架构设计:如何通过 Flutter 统一封装 ClashMeta 核心,实现跨平台代理客户端的分流规则引擎与多协议支持。

2026-05-30systems

在代理工具领域,跨平台一致性始终是开发者面临的核心挑战。FlClash 项目展示了如何用 Dart/Flutter 构建一个支持 Android、Windows、macOS 和 Linux 的代理客户端,其关键在于将 Go 语言编写的 ClashMeta 核心与 Flutter UI 层解耦,通过声明式配置与 RESTful API 实现灵活的分流规则引擎。

架构分层:核心与界面的解耦设计

FlClash 采用 "核心 + 壳层" 的架构模式。ClashMeta(mihomo)核心以独立二进制形式运行,负责底层网络协议处理、路由决策和流量转发;Flutter 层则专注于 UI 渲染、配置管理和用户交互。两者通过本地 HTTP RESTful API 通信,这种设计使得核心更新与界面迭代可以独立进行。

ClashMeta 核心使用 Go 语言实现,具备原生多架构支持(x86、ARM64、ARMv7、MIPS),单二进制文件体积约 5MB,内存占用远低于基于 Electron 的客户端。核心启动后监听 127.0.0.1:9090(可配置),暴露完整的控制接口,包括代理节点切换、实时流量监控、连接管理和配置热重载。

分流规则引擎的实现原理

分流规则引擎是代理客户端的核心能力,ClashMeta 采用基于优先级的规则匹配机制。规则按从上到下顺序执行,首次命中即生效,最终由 MATCH 规则兜底。这种设计使得复杂分流策略可以精确控制:

规则类型清单

  • DOMAIN:精确域名匹配,如 google.com
  • DOMAIN-SUFFIX:域名后缀匹配,涵盖主域及所有子域
  • DOMAIN-KEYWORD:域名关键词匹配,适用于批量规则
  • GEOIP:基于 MaxMind GeoIP 数据库的地理位置匹配
  • IP-CIDR:CIDR 段匹配,支持 IPv4/IPv6
  • PROCESS-NAME:进程名匹配,实现应用级路由
  • RULE-SET:远程规则集订阅,支持自动更新
  • MATCH:兜底规则,必须置于最后

规则配置的优先级直接影响分流效果。典型场景下,建议按以下顺序排列:广告拦截(REJECT)→ 国内直连(GEOIP CN → DIRECT)→ 特定域名代理 → 兜底代理。通过 rule-providers 引入远程规则集,可将数千条规则的外部维护工作自动化,大幅降低本地配置复杂度。

多协议代理的统一抽象

ClashMeta 核心原生支持十余种代理协议,涵盖 Shadowsocks、VMess、Trojan、VLESS、Hysteria 2、TUIC、Snell 等。协议配置采用统一的 YAML 声明式语法,核心根据 type 字段自动实例化对应协议处理器。

协议选型建议

协议 传输层 适用场景 抗检测能力
Shadowsocks TCP/UDP 兼容性优先 中等
VLESS + Reality TCP 高对抗环境
Hysteria 2 UDP (QUIC) 高延迟 / 丢包网络
Trojan TCP 伪装为 HTTPS

VLESS + Reality 和 Hysteria 2 是 ClashMeta 独有的增强协议。Reality 通过真实网站的 TLS 指纹伪装流量特征,Hysteria 2 基于 QUIC 协议在高丢包网络中仍能保持低延迟。这些协议需要 ClashMeta 核心支持,无法在原版 Clash 核心运行。

代理组策略与健康检测

代理组(proxy-groups)实现流量调度与高可用保障。ClashMeta 支持四种组类型:

  • select:手动选择,适合需要固定节点的场景(如指定区域解锁流媒体)
  • url-test:自动测速,按延迟选择最优节点,建议配置 interval: 300(5 分钟)和 tolerance: 50(50ms 容差)避免频繁切换
  • fallback:故障转移,按顺序使用节点,当前节点失效时自动降级,适合稳定性优先场景
  • load-balance:负载均衡,支持 consistent-hashing(同域名固定节点)和 round-robin(轮询)两种策略

健康检测通过 HTTP HEAD 请求探测节点可用性,默认检测 URL 为 http://www.gstatic.com/generate_204。建议根据实际网络环境调整检测间隔,过于频繁的检测会增加节点负载并暴露探测行为。

Fake-IP 机制与 DNS 防泄漏

传统代理模式下,应用程序先向本地 ISP DNS 查询域名,再建立代理连接,导致 DNS 请求泄露访问意图。ClashMeta 的 Fake-IP 模式接管系统 DNS,对查询请求立即返回伪造的本地 IP(如 198.18.x.x),应用程序据此建立连接后,核心通过加密隧道向远程代理服务器解析真实域名。

DNS 配置建议启用 enhanced-mode: fake-ip,主 DNS 使用 DoH 服务(如 https://doh.pub/dns-query),Fallback DNS 配置境外服务(如 https://1.1.1.1/dns-query)。部分本地服务(微信、QQ 登录域)与 Fake-IP 不兼容,需通过 fake-ip-filter 排除。

可落地的配置检查清单

  1. 核心启动参数:确认 external-controller 绑定地址、secret API 密钥、mode: rule 分流模式
  2. DNS 配置:启用 Fake-IP、配置 DoH 上游、设置合理的 fallback-filter
  3. 规则排序:广告拦截 → 国内直连 → 特定代理 → 兜底规则,确保 MATCH 在最后
  4. 代理组策略:url-test 组配置 300s 检测间隔、50ms 容差;fallback 组按延迟优先级排序节点
  5. 远程规则集:配置 rule-providers 自动更新间隔(建议 24 小时),减少本地维护负担
  6. TUN 模式(可选):启用 tun: enable: truestack: mixed,以管理员 /root 权限运行,捕获非代理感知流量

资料来源

systems

内容声明:本文无广告投放、无付费植入。

如有事实性问题,欢迎发送勘误至 i@hotdrydog.com