将闲置 Android 手机变身为高性能代理节点:Termux 与 Xray 的实战记录
将闲置 Android 手机变身为高性能代理节点
在致力于构建极致的高可用(HA)家庭代理网络的过程中,我意识到手头有一台性能强大、全天候联网却在“吃灰”的 ARM 设备:我的旧 Android 手机。
通过将其作为一个“次级主节点(Secondary Primary Node)”集成到我的网络中,通过与 Mac 并行工作,我实现了一个“三活(Triple-Active)”架构:Mac + Android -> VPS 备份。本文将深入分享我是如何利用 Termux 将一台 Android 手机变成“哑节点(Dumb Node)”代理的,以及在此过程中解决的那些奇特的网络陷阱。
📱 概念:什么是“哑节点”?
不同于运行着完整 X-UI 面板和漂亮界面的 VPS 或 Mac,Android 手机受限于电池和散热资源。我并不想在上面运行沉重的 Web 面板和数据库。
我选择了**“无状态哑节点”架构**:
- 无 UI:只运行纯粹的
Xray-core二进制文件。 - 硬编码配置:UUID 与 VPS 完全一致。
- 隧道:使用
frpc将本地端口暴露给 VPS。
对于负载均衡器(Nginx)来说,它看起来和我的 Mac 一模一样。而对于手机来说,这只是两个轻量级的后台进程。
🛠 技术栈:Termux 足矣
忘掉 Root 刷机吧。Termux 提供了完全够用的用户空间 Linux 环境。
1 | pkg install frp # 注意:包名是 'frp',而不是 'frpc' |
对于代理核心,我直接下载了标准的 ARM64 (aarch64) 版 Xray-core。
🕳 踩坑记录(以及我是如何填坑的)
这并不是即插即用的。Android 的网络栈非常……独特。
1. 包名陷阱
如果你尝试在 Termux 里安装 frpc,会提示找不到。
纠正:软件包名称是 frp,安装后会同时包含 frpc 和 frps。
2. “连接被拒绝”的幽灵
起初,Xray 日志看起来很干净,但流量就是不通。在 Android 上使用 netstat 需要 Root 权限才能看到有用的输出,这让调试变成了瞎子摸象。
原因:Xray 实际上并没有成功运行或监听在预期的接口上。
解决:我写了一个 start.sh 脚本来正确管理进程生命周期,并将日志转储到标准输出(stdout)以便调试,而不是丢进 /dev/null。
3. DNS 黑洞 ([::1]:53)
这是最恶心的一个 Bug。Xray 日志显示:dial tcp: lookup www.google.com on [::1]:53: read: connection refused
为什么?
Termux 并没有像 Go 语言(Xray 的开发语言)预期的那样拥有指向系统解析器的标准 /etc/resolv.conf。它试图使用本地回环 IPv6 地址进行 DNS 解析,但那里并没有 DNS 服务监听。
解决:
在 Xray 的 config.json 中硬编码 DNS。不要依赖系统。
1 | "dns": { |
4. IPv6 幻影
即使 DNS 修好了,连接依然超时。Android 系统倾向于优先使用 IPv6,但在许多移动网络或 WiFi 配置下,IPv6 路由并不稳定或被限制。
解决:
强制 Xray 使用 IPv4 进行出站连接。
1 | "outbounds": [ |
UseIP 策略会强制 Xray 将域名解析为 IP(使用我们硬编码的 8.8.8.8),然后直接连接该 IP,绕过系统路由配额的限制。
🔋 优化:电池 vs 性能
在电池供电的设备上 24/7 运行代理需要平衡。
- Wakelock(唤醒锁):必不可少。点击 Termux 通知栏的 “Acquire Wakelock”,防止 CPU 进入深度休眠。没有它,关屏 5 分钟后代理就会断连。
- 网络选择:
- 5G:速度快,低延迟,但发热大,耗电快。适合作为家庭宽带断网时的临时备份。
- Wi-Fi:功耗低得多。作为永久设施时的推荐选择。
- 进程优先级:Android 会激进地杀掉后台应用。我必须将 Termux 锁定在“最近任务”视图中,并对其禁用电池优化。
🚀 最终效果
我现在拥有了一个冗余的代理节点,它几乎不耗电,零维护(无状态),而且可移动。
如果我的 Mac 崩溃了?流量切到 Android。
如果我家光纤断了?流量切到 Android (走 5G)。
如果所有东西都挂了?流量切到 VPS。
韧性(Resilience)不在于永不故障,而在于故障发生时无人察觉。