多机联合增强转发流量

Gogs f3d636dc27 UDP子节点报错且未联通 3 天之前
scripts 00dacea0e1 tcp和udp分开 3 天之前
.gitignore fa156cc5c0 继续修改hk1掉线和UDP优化 4 天之前
README.md 82f8f7acdf 继续修改UDP多节点 3 天之前
__init__.py c958afbf24 基础功能,主机和子节点可用 1 周之前
__main__.py c958afbf24 基础功能,主机和子节点可用 1 周之前
cli.py 00dacea0e1 tcp和udp分开 3 天之前
config.json 82f8f7acdf 继续修改UDP多节点 3 天之前
config.jsonbak a004bd9cdf 解决启动退出ssh问题 6 天之前
config.py 82f8f7acdf 继续修改UDP多节点 3 天之前
demo-config copy.json 66db438889 更新 1 周之前
protocol.py c958afbf24 基础功能,主机和子节点可用 1 周之前
relay_client.py 74ded560a9 update 3 天之前
relay_server.py f3d636dc27 UDP子节点报错且未联通 3 天之前
scheduler.py f1e95aae71 更新日志问题 3 天之前
socks_edge.py f3d636dc27 UDP子节点报错且未联通 3 天之前
transparent_edge.py 82f8f7acdf 继续修改UDP多节点 3 天之前

README.md

mynetspeeder

mynetspeeder 现在支持 透明接管当前服务器的 direct TCP 出站

目标场景:

  • 你本机继续通过 sing-boxhy2 19887/19888 入站使用外网
  • sing-box 出站仍然保持 direct
  • mynetspeeder 在系统层透明接管这些 direct TCP 流量
  • 当前主 VPS 直接出站可立即工作
  • 配置的子节点 VPS 会自动连接并参与竞速
  • 子节点不在线时,不影响当前主 VPS 直接使用

当前能力

  • relay:子节点 VPS 中继
  • edge:主 VPS 透明接管 direct TCP 出站
  • probe:查看节点探测与在线状态
  • 主 VPS 本地直连始终可用
  • 子节点可选,多节点在线时自动参与冗余竞速
  • 一键启停脚本:透明接管 OUTPUT 链中的 TCP 连接

重要说明

  • 当前透明模式先实现的是 TCP
  • UDP 默认关闭,需要显式开启
  • 这是为了先让你现有视频、网页、下载这类 TCP 场景可直接用起来
  • 开启 UDP 时,脚本会自动放行 ESTABLISHED,RELATED 回包,避免本机入站/回包再次被 OUTPUT 重定向到 19080 形成自环

配置文件

示例 /home/mynetspeeder/config.json

{
  "strategy": "top3",
  "redundancy": 3,
  "direct_redundancy": 2,
  "direct_max_redundancy": 3,
  "direct_redundancy_v6": 3,
  "tcp_warmup_bytes": 1048576,
  "tcp_loser_grace_ms": 1500,
  "probe_interval": 15,
  "relays": [
    {"name": "hk1", "host": "1.2.3.4", "port": 9009, "token": "demo", "weight": 100},
    {"name": "jp1", "host": "5.6.7.8", "port": 9009, "token": "demo", "weight": 95}
  ]
}

说明:

  • relays 可以为空,空时只走当前主 VPS 直接出站
  • 子节点启动后会自动连上并参与竞速
  • 子节点没启动时不会影响使用

子节点一键安装

把项目目录复制到子节点后,直接执行:

sudo /home/mynetspeeder/scripts/install.sh /opt/mynetspeeder

安装完成后可直接使用全局命令:

mynetspeeder --help

子节点启动 relay:

sudo /opt/mynetspeeder/scripts/start-relay.sh 你的token

子节点停止 relay:

sudo /opt/mynetspeeder/scripts/stop-relay.sh

启动方式

1. 子节点 VPS

python3 -m mynetspeeder relay --listen-port 9009 --token demo

2. 当前主 VPS

准备配置:

cp /home/mynetspeeder/demo-config.json /home/mynetspeeder/config.json

启动透明接管:

sudo /home/mynetspeeder/scripts/start-transparent.sh --kernel auto --capture-uid <sing-box运行UID> /home/mynetspeeder/config.json

不指定 --capture-uid 时,默认接管所有用户发起的流量:

sudo /home/mynetspeeder/scripts/start-transparent.sh /home/mynetspeeder/config.json

停止透明接管:

sudo /home/mynetspeeder/scripts/stop-transparent.sh

查看节点状态:

python3 -m mynetspeeder probe --config /home/mynetspeeder/config.json --once

汇总透明模式胜率:

python3 -m mynetspeeder summary --log-file /var/log/mynetspeeder-edge.log

Ubuntu 20 / 24 内核模式

当前版本新增 --kernel auto|20|24

  • auto:默认,根据系统自动判断
  • 20:更保守的兼容模式
  • 24:更积极的 Ubuntu 24 优化模式

Ubuntu 24 模式会额外:

  • 打印 iptables 后端类型(nf_tables / legacy
  • 启动后执行规则自检
  • 自动缩短 direct / relay 建连超时
  • 启用更积极的 happy eyeballs 建连参数

如需手动指定:

sudo /home/mynetspeeder/scripts/start-transparent.sh --kernel 24 --capture-uid $(id -u singbox) /home/mynetspeeder/config.json

配置文件还支持:

{
  "kernel_mode": "auto",
  "direct_open_timeout": 6.0,
  "relay_open_timeout": 6.0,
  "tcp_connect_happy_eyeballs_delay": 0.25,
  "relay_reconnect_delay": 3.0,
  "relay_tcp_nodelay": true
}

单机增强 direct 竞速

当前版本新增更激进的主节点 direct 冗余能力,默认保持 relay 逻辑不变:

  • direct_redundancy:默认 direct 并发连接数
  • direct_max_redundancy:当某目标或某地址族近期更偏向 relay 胜出时,允许自动放大到的最大 direct 并发数
  • direct_redundancy_v4:可单独指定 IPv4 目标的 direct 并发数
  • direct_redundancy_v6:可单独指定 IPv6 目标的 direct 并发数

示例:

{
  "direct_redundancy": 2,
  "direct_max_redundancy": 3,
  "direct_redundancy_v4": 2,
  "direct_redundancy_v6": 3
}

说明:

  • 同一目标会同时发起多条 direct 连接
  • 谁先拿到有效下行,谁成为 winner
  • 其他 direct 副本会按现有 tcp_loser_grace_ms 延迟关闭
  • 若某个目标或某个地址族近期经常是 relay 胜出,主节点会自动把该目标的 direct 冗余数提升 1 档,但不会超过 direct_max_redundancy
  • 当前优化只增强主节点 direct 路径,不改变子节点 relay 内部出站逻辑

工作方式

透明模式启动后:

  • 不需要改 sing-boxdirect 出站配置
  • iptables 会把系统的 TCP 出站重定向到 mynetspeeder edge
  • edge 会同时尝试:
    • 当前主 VPS 直接连目标
    • 若干在线子节点 relay 代为连接目标
  • tcp_warmup_bytes 的上行数据会更积极地并发发给所有候选路径
  • winner 出现后,loser 会额外保留 tcp_loser_grace_ms 毫秒,再关闭
  • 谁先回下行数据,谁成为胜出路径
  • 其它路径会关闭

一键脚本说明

start-transparent.sh 会自动:

  • 只接管指定 UID 的 TCP 出站,避免影响整机连接

  • 创建运行用户 mynetspeeder

  • 以该用户启动 edge

  • 自动排除:

    • 127.0.0.0/8
    • 所有 relay IP
    • mynetspeeder 自己发起的连接
  • 接管全局 OUTPUT 的 TCP 出站流量

现有限制

  • 透明接管当前只支持 IPv4 TCP
  • UDP 默认关闭,需要显式开启
  • iptables 规则是全局级别,除 mynetspeeder 自己和 relay IP 外,其他本机 TCP 流量也会被接管

当前服务器用法

当前服务器已将 sing-box 改为 singbox 用户运行,因此透明接管请直接使用:

sudo /home/mynetspeeder/scripts/start-transparent.sh --capture-uid $(id -u singbox) /home/mynetspeeder/config.json

停止:

sudo /home/mynetspeeder/scripts/stop-transparent.sh

IPv6 与 UDP

当前版本新增:

  • IPv6 透明 TCP 接管
  • UDP 透明接管(默认关闭)
  • iptables + ip6tables 的 TCP REDIRECT 规则,UDP 仅在显式开启时生效

说明:

  • UDP 只有在显式开启时才会接管
  • 如遇特定 UDP/QUIC 场景异常,优先先验证 TCP 是否正常

当前状态

当前版本已支持:

  • singbox 用户的透明 TCP 接管
  • IPv4 / IPv6 TCP 透明监听
  • IPv4 / IPv6 UDP 透明监听(默认关闭)
  • 无 relay 时自动只走当前主机 direct

推荐启动命令:

sudo /home/mynetspeeder/scripts/start-transparent.sh --capture-uid 996 /home/mynetspeeder/config.json

UDP 说明

当前已发现 UDP 透明接管在部分环境下会产生自环(例如日志里目标变成 127.0.0.1:19080)。

因此当前默认:

  • 只启用 TCP 透明接管
  • UDP 透明接管默认关闭

如果你要实验 UDP,再显式加:

sudo /home/mynetspeeder/scripts/start-transparent.sh --enable-udp --capture-uid 996 /home/mynetspeeder/config.json

当前版本新增更激进的 UDP 冗余参数:

{
  "udp_redundancy": 1,
  "udp_direct_redundancy": 2,
  "udp_direct_redundancy_v4": 2,
  "udp_direct_redundancy_v6": 2,
  "udp_always_broadcast": true,
  "udp_copy_interval_ms": 8
}

说明:

  • udp_redundancy:每个 UDP 包额外重复发送的次数
  • udp_direct_redundancy:UDP 默认本地 direct 并发副本数
  • udp_direct_redundancy_v4:可单独指定 IPv4 目标的 UDP direct 副本数
  • udp_direct_redundancy_v6:可单独指定 IPv6 目标的 UDP direct 副本数
  • udp_always_broadcast:即使已有 winner,后续包仍持续并发发往所有可用路径
  • udp_copy_interval_ms:多副本之间的间隔,单位毫秒

默认策略更偏向抗丢包和稳态可用,而不是节省流量。

如果你希望同时启用本机显式 SOCKS5 出站入口,只需要在 config.json 增加端口:

{
  "socks_host": "127.0.0.1",
  "socks_port": 19180
}

说明:

  • socks_port0 或不填:不启动
  • socks_port 大于 0start-transparent.sh 会自动一并启动
  • 适合让 sing-box 把指定 UDP/QUIC 流量显式交给 mynetspeeder
  • 不需要额外手动执行单独脚本