Alex 是面向 Linux OpenPPP2 的双端自动调优工具。它从 OpenPPP2 客户端节点运行,通过 SSH 同时控制对应服务端,测试真实 PPP 隧道,选择综合表现最好的参数并永久保存。
默认接入上限固定为:
- 下载:
2000 Mbps - 上传:
120 Mbps
评分不会因为本地网卡显示 2.5G/10G 而提高目标上限。
- 通过 SSH 同时备份客户端和服务端配置;
- 扫描
concurrent、MUX 模式、MUX turbo、发送队列、重排窗口和 TUN 队列; - 每个方向至少测试三次并取中位数;
- 同时考察吞吐、重传、CPU、本次测试新增的 TUN 丢包、服务重启和接口计数器重置;
- 每个候选失败时恢复两端原配置;
- 最优解写回两端
appsettings.json; - 使用 systemd drop-in 永久保存 TUN
txqueuelen; - 提交后重启两端并再次复验;
- 成功或已验证回退后清理候选、远端 helper 和事务材料;
- SSH 中断时,两端 4 小时 watchdog 自动恢复原配置;正常结束会立即撤销,不会等待 4 小时。
Alex 不修改 OpenPPP2 密钥、服务器地址、代理、路由、DNS、SNAT 或其他未知 JSON 字段。
只有在最优配置完成最终复验,或原配置已确认恢复后,Alex 才会删除过程资料。如果回退本身失败或节点状态无法确认,会保留受保护的恢复材料并返回失败,避免为了“清理干净”而丢失人工修复依据。
建议客户端和服务端使用同一版较新的 OpenPPP2。旧版本如果不认识 flow 或 balance,可能自行归一为 compat;Alex 仍会以服务是否稳定和真实隧道测速结果判定,但这类候选可能与 compat 表现相同。
客户端和服务端需要:
- Linux + systemd;
- OpenPPP2 由 systemd 单实例管理;
- 客户端和服务端 OpenPPP2 服务均已处于
active,指定的 TUN 接口已存在; appsettings.json是有效 JSON;- TUN 隧道内服务端地址可达,默认
10.0.0.1; - SSH 密钥登录和非交互式
sudo -n(远端 SSH 用户需有对应的 NOPASSWD 权限); - 管理 SSH 路径不能依赖即将重启的 PPP 隧道。
Alex 使用补偿事务而不是分布式共识:普通命令失败和 SSH 中断由双端备份/watchdog 回退;如果协调客户端恰好在两端最终撤销 watchdog 的极短窗口内被 SIGKILL 或断电,仍可能需要人工核对两端配置。生产运行时应保持管理机供电和 SSH 管理链路稳定。
本机安装脚本会安装 jq、iperf3、OpenSSH client、util-linux 和 iproute2 等缺失依赖。远端默认只检查依赖,不会静默改动软件包;缺少依赖时,可以手工安装,或在命令中明确添加 --install-remote-deps,允许 Alex 通过远端的 apt、dnf 或 yum 补齐依赖。OpenRC-only 系统不受支持。
git clone --depth=1 https://github.com/lucifer988/Alex.git
cd Alex
sudo bash install.sh
alex --version
alex-docker --helpAlex 强制 StrictHostKeyChecking=yes,仅使用指定的专用 known_hosts,不会自动信任未知、系统全局已知或发生变化的主机密钥。
先查看服务端指纹:
ssh-keyscan -p 22 SERVER_IP > /tmp/alex-known-hosts
ssh-keygen -lf /tmp/alex-known-hosts通过服务商控制台或其他独立渠道核对指纹后安装:
sudo install -m 0644 /tmp/alex-known-hosts /etc/alex/known_hosts
rm -f /tmp/alex-known-hosts从 OpenPPP2 客户端节点执行:
sudo alex optimize \
--ssh-host SERVER_IP \
--ssh-user root \
--ssh-key /root/.ssh/id_ed25519 \
--remote-mode server \
--yes如果远端还没有 jq、iperf3、iproute2、systemd/coreutils 等运行依赖,首次执行时显式加入:
sudo alex optimize \
--ssh-host SERVER_IP \
--ssh-key /root/.ssh/id_ed25519 \
--remote-mode server \
--install-remote-deps \
--yes默认使用:
客户端配置 /opt/openppp2/appsettings.json
服务端配置 /opt/openppp2/appsettings.json
客户端服务 openppp2-client.service
服务端服务 openppp2-server.service
客户端 TUN ppp0
服务端 TUN ppp0
远端模式 server
测速模式 managed
隧道服务端 10.0.0.1
测速端口 5201
测试时长 每方向 15 秒 x 3 次
默认完整扫描通常需要约 15–20 分钟,具体取决于服务重启和网络状态。只有候选综合评分至少达到运行前原始配置基线的 102%,并且在提交前、持久化重启后都再次达到该门槛,才会永久保存;否则恢复原配置,避免把正常测速波动误判成优化。
实际名称不同可以覆盖:
sudo alex optimize \
--ssh-host SERVER_IP \
--ssh-key /root/.ssh/id_ed25519 \
--local-config /etc/openppp2/client.json \
--remote-config /etc/openppp2/server.json \
--local-service ppp-client.service \
--remote-service ppp-server.service \
--remote-mode server \
--tun-server 10.0.0.1 \
--yes只做双端备份、基准测试和验证,完成后恢复并清理:
sudo alex detect \
--ssh-host SERVER_IP \
--ssh-key /root/.ssh/id_ed25519查看将扫描的候选:不会修改正式配置,也不会重启 OpenPPP2;为保证 SSH 中断时可恢复,会临时创建事务备份和 watchdog,正常结束后立即清理。除非显式添加 --install-remote-deps,dry-run 也不会安装远端软件包。
sudo alex optimize \
--ssh-host SERVER_IP \
--ssh-key /root/.ssh/id_ed25519 \
--dry-run当 OpenPPP2 以 Docker 多实例 方式运行,尤其是:
- 多个 client 容器共用宿主机网络;
- 容器内能看到整套宿主机
pppX,而不是单独的ppp0; - 需要按
peer_host:peer_port区分多个对端;
应使用 alex-docker,而不是直接套用 alex 的 systemd 单实例模型。
- 从容器
appsettings.json自动解析:peer_hostpeer_porthttp_proxy_portsocks_proxy_port
- 从容器主进程命令行
/proc/1/cmdline自动解析:--tun pppX--tun-ip--tun-gw
- 输出实例识别结果:
container_namepeer_host:peer_portppp_ifnametun_iptun_gwdetection_modetun_bound
- 交互式列出本地 / 远端候选实例;
- 支持单选或
all; all/all时按peer_host + peer_port自动配对;- 对已识别实例执行:
preparehealthcleanup
optimize已具备 baseline / candidate / restore / compare 的主循环骨架。
alex-docker 当前最适合:
- 多实例 client Docker 节点;
- 远端是单容器或共享 server 的场景前半段识别与检测;
- 需要先做 inventory / detect / 单实例 baseline 验证的环境。
- 远端若是 shared server(多个 client 共用一个 server 容器),当前仓库已能识别和检测 client 侧实例,但
optimize的远端建模仍在演进中; - batch optimize 适合对称 client/container 对;shared server 模式还需要进一步增强;
- 若进程命令行、配置文件、容器网络形态都无法唯一确定实例身份,脚本会退回
manual-required,而不会盲猜 tun。
# 本地 inventory
/root/alex-docker-node inventory | python3 -m json.tool
# 通过 SSH 控制远端 shared/server 节点时
alex-docker inventory \
--ssh-host SERVER_IP \
--ssh-key /root/.ssh/id_ed25519 \
--known-hosts /etc/alex/known_hostsalex-docker detect \
--interactive \
--ssh-host SERVER_IP \
--ssh-key /root/.ssh/id_ed25519 \
--known-hosts /etc/alex/known_hosts交互模式会:
- 列出本地容器及其
peer_host:peer_port; - 列出远端候选;
- 允许输入单个编号或
all; - 在
all/all场景下按peer_host + peer_port自动配对; - 逐对执行 detect / optimize 骨架流程。
未提交事务会由 watchdog 自动回退。成功事务在最终复验后会清理过程资料,因此正常完成后不保留长期回退副本。需要长期人工回退时,应在运行 Alex 前使用现有备份系统保存两端 OpenPPP2 配置和 systemd 状态。
下载占评分 70%,上传占 30%,分别封顶于 2000/120 Mbps。以下情况会淘汰候选:
- 服务没有稳定恢复;
- 测速期间 MainPID 变化、systemd 自动重启计数增加或计数器异常重置;
- TUN 在该次测试期间新增丢包;
- 任一方向测速失败;
- SSH 或远端状态无法确认;
- 最终持久化重启后复验失败。
重传和测速结束时的 CPU 使用快照超过 85% 会扣分。工具不会为了很小的峰值增益保存明显更不稳定的组合。
成功结果会输出 JSON,包括原始基线、最低合格分、最终调优参数和持久化后的复验指标,便于保存到日志或接入自动化平台。输出中不会包含 OpenPPP2 密钥及其他未调优配置字段。
- 仅接受固定子命令,不通过 SSH 执行用户提供的任意 shell;
- 不支持
sshpass -p或命令行密码; - 不使用
StrictHostKeyChecking=no; - SSH 禁用密码/交互式认证、agent 转发、端口转发和系统全局 known_hosts 回退;
- 每端使用
/run/lock/alex-openppp2.lock防止并发事务; - 同一事务 ID 不允许重复覆盖原始恢复材料;
- 配置通过
jq结构化修改和同目录原子替换; - 远端 helper 上传后校验 SHA-256;
- iperf3 只绑定隧道地址,清理时同时核对 PID 和进程启动时间,避免误杀其他测速进程;
- 过程文件权限为
0600/0700; - 配置或路径异常时默认失败并回退。
- 在维护窗口运行,提前确认客户端和服务端带外 SSH 都不会经过待重启的 PPP 隧道;
- 使用独立的最小权限 SSH 密钥,并把远端 sudoers 权限限制到 Alex 所需命令;
- 先执行
detect验证隧道测速和双端健康状态,再执行optimize; - 将命令的 JSON 输出和 systemd 日志纳入变更记录;
- Alex 的事务备份用于故障补偿,不替代长期配置备份。
bash tests/test_alex.sh
bash tests/test_node_transaction.sh
bash tests/test_alex_docker.sh
bash tests/test_alex_docker_node.sh
bash -n alex alex-node alex-docker alex-docker-node install.sh lib/alex-core.sh tests/test_alex.sh tests/test_node_transaction.sh tests/test_alex_docker.sh tests/test_alex_docker_node.sh
shellcheck -x -e SC1091,SC2029,SC2034 alex alex-node alex-docker alex-docker-node install.sh lib/alex-core.sh tests/test_alex.sh tests/test_node_transaction.sh tests/test_alex_docker.sh tests/test_alex_docker_node.shMIT