Skip to content

[?] 多拨时每条宽带的使用 #109

@GuangYu-yu

Description

@GuangYu-yu

在多拨的情况下是如何利用每条宽带的呢,我并不是专业的,有个想法不知道合不合理

1.接口数据标记
对每个接口实现数据标记,使用nftables功能进行处理

2.WAN口健康检测
对每个WAN口进行指定URL或IP检测
使用http检测
健康检测设置:超时时间、循环检测间隔时间
健康检测失败则认为接口下线

3.负载均衡策略
支持多个策略选择,并且随时可以应对接口的上线或下线:

3.1 自动选择策略
每条宽带发起健康检测,选择延迟最低的
支持设置超时时间、循环检测的时间

3.2 轮询策略
轮流在每个接口分配流量
可设置带宽比值,按照比值分配
当某个接口下线时,该接口对应的比例分摊到其他在线接口

3.3 故障转移策略
以指定优先级使用
当某个接口下线时,切换到下一个接口

4.接口绑定与流量控制
每条WAN可以绑定interface-name(如:pppoe-cmcc)
都可以绑定对应的nftables sets
当流量匹配到sets规则时:
    如果该接口没有下线则优先使用它
    如果流量没有匹配每个接口的sets,或者对应的接口下线了,则走策略选择

5.协议优化
5.1 UDP处理
实现UDP race策略(UDP 并发多路径 + 取最快返回的包)

5.2 TCP处理
实现MPTCP
可选择TFO(TCP Fast Open)

5.3 DNS处理
让系统自动处理

6.实现方式
6.1 技术栈选择
使用Rust语言实现核心功能
通过YAML文件进行配置管理

6.2 架构设计
系统调用:通过std::process::Command调用系统命令
配置解析:使用serde_yaml解析YAML配置文件

6.3 核心模块
健康检测模块:命令调用实现

使用std::process::Command调用curl等系统命令
通过定时器(tokio::time::interval)定期执行检测
解析命令输出获取延迟和状态信息
维护接口健康状态表
负载均衡引擎:命令调用实现

使用Command调用nft命令动态更新规则
使用Command调用ip命令管理路由表
策略算法(最低延迟选择、权重计算、故障转移逻辑)
根据接口状态变化触发规则重新生成
接口监控:命令调用实现

使用Command调用"ip monitor link"监听接口状态
解析输出识别接口上下线事件
触发负载均衡重新计算
UDP race模块:纯Rust实现
UDP race和健康检测要异步并发,不阻塞主线程

使用tokio::net::UdpSocket实现并发多路径发送
实现数据包复制和并发传输逻辑
监听多个接口的返回,取最快响应
MPTCP支持:系统配置实现

使用Command调用sysctl配置内核MPTCP参数
通过iptables/nftables规则启用MPTCP标记

使用serde_yaml解析配置文件
实现配置热重载和验证
维护运行时状态和统计信息

6.4 部署方式
支持daemon模式后台运行

其中yaml的配置文件类似于

# 全局配置
global:
  policy: "load-balance"         # 默认策略: url-test, load-balance, fallback
  udp-race: true                 # 启用UDP竞速优化
  mptcp: true                    # 启用多路径TCP
  tfo: false                     # 启用TCP Fast Open
  health-check:
    timeout: 3                   # 健康检测超时时间(秒)
    interval: 10                 # 健康检测间隔(秒)
    url: https://www.qq.com/favicon.ico  # 健康检测URL
    fail-threshold: 3            # 连续失败次数阈值
    succ-threshold: 2            # 连续成功次数阈值

# 接口配置
interfaces:
  # 中国移动宽带
  - name: "wan1"
    interface-name: "pppoe-cmcc"  # 系统接口名
    weight: 10                    # 带宽权重(用于负载均衡)
    mark: 1                       # 流量标记
    enabled: true                 # 是否启用
    nftables-sets: ["cmcc_cidr4", "cmcc_cidr6"]  # nftables集合

  # 中国联通宽带
  - name: "wan2"
    interface-name: "pppoe-cnc"
    weight: 8
    mark: 2
    enabled: true
    nftables-sets: ["cnc_cidr4", "cnc_cidr6"]

  # 中国电信宽带
  - name: "wan3"
    interface-name: "pppoe-ct"
    weight: 5
    mark: 3
    enabled: true
    nftables-sets: ["ct_cidr4", "ct_cidr6"]

# 策略配置
policies:
  # 自动选择策略 - 选择延迟最低的接口
  - type: "url-test"
    interfaces: ["wan1", "wan2", "wan3"]

  # 负载均衡策略 - 按权重轮询分配
  - type: "load-balance"
    interfaces: ["wan1", "wan2", "wan3"]

  # 故障转移策略 - 按优先级使用
  - type: "fallback"
    interfaces: ["wan2", "wan1", "wan3"]  # 故障转移,优先级从高到低

Metadata

Metadata

Assignees

No one assigned

    Labels

    questionFurther information is requested

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions