-
Notifications
You must be signed in to change notification settings - Fork 43
Open
Labels
questionFurther information is requestedFurther information is requested
Description
在多拨的情况下是如何利用每条宽带的呢,我并不是专业的,有个想法不知道合不合理
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
Labels
questionFurther information is requestedFurther information is requested