AiStation 手机远程访问部署方案
本文说明 AiStation 手机远程网关如何通过局域网、公网隧道或自有服务器访问。文中的示例假定桌面端手机网关监听 127.0.0.1:1234。
1. 当前网络边界
AiStation 手机网关具有以下默认行为:
- 网关默认关闭;未启用时不会创建监听端口或后台网络任务。
- 网关只绑定本机回环地址,不应直接暴露到公网。
- 手机端使用 HTTPS 访问公网地址,并通过 WebSocket 接收会话事件。
- 配对码由桌面端显式生成,一次性使用;设备凭据保存到系统凭据库。
publicBaseUrl只填写手机实际访问的 HTTPS 地址,不填写127.0.0.1、内网地址或隧道内部端口。
推荐拓扑如下:
手机
|
| HTTPS / WSS :443
v
公网域名或隧道入口
|
| 加密转发
v
桌面端 127.0.0.1:1234
2. 方案比较
| 方案 | 适合场景 | 是否需要公网服务器 | 手机是否需要额外 VPN | 推荐度 |
|---|---|---|---|---|
| Cloudflare Tunnel | 快速试用、无需维护 VPS | 否 | 否 | 高 |
| Cloudflare Named Tunnel | 长期使用、已有 Cloudflare 域名 | 否 | 否 | 高 |
| 自有 VPS + SSH 反向隧道 + Caddy | 已有服务器,单台桌面稳定远程 | 是 | 否 | 最高 |
| 自有 VPS + FRP/rathole + Caddy | 多台桌面、需要专门隧道服务 | 是 | 否 | 高 |
| Tailscale/Headscale | 私网访问、接受手机安装 VPN | 可选 | 是 | 高 |
| WireGuard | 自己维护私有网络和 ACL | 通常是 | 是 | 高 |
| 路由器端口映射 | 家庭网络、临时实验 | 否 | 否 | 低 |
| ngrok、zrok 等托管隧道 | 临时演示或验证 | 否 | 否 | 中 |
公网生产访问不建议把 1234 直接映射到互联网。公网入口应由 Caddy、Nginx 或同类反向代理提供 HTTPS,隧道只负责把入口转发到桌面端回环地址。
3. 推荐方案:自有 VPS + SSH 反向隧道 + Caddy
此方案不需要修改 AiStation,也不要求路由器拥有固定公网地址。桌面端主动向 VPS 建立出站 SSH 连接,VPS 只暴露 HTTPS。
3.1 网络拓扑
手机
-> https://mobile.example.com:443
VPS: Caddy -> 127.0.0.1:18123
VPS: SSH reverse forwarding
-> 桌面端 127.0.0.1:1234
服务器端 18123 和桌面端 1234 位于不同主机,可以使用相同端口,但使用不同端口更容易排查问题。
3.2 域名和防火墙
- 将
mobile.example.com的 DNS A/AAAA 记录指向 VPS。 - VPS 防火墙只开放
80/tcp、443/tcp,以及管理所需的 SSH 端口。 - 不要开放
18123/tcp;它只应监听 VPS 的回环地址。
3.3 Caddy 配置
在 VPS 的 Caddyfile 中添加:
mobile.example.com {
reverse_proxy 127.0.0.1:18123
}
Caddy 会自动申请和续期 HTTPS 证书,并默认转发 WebSocket。无需为 /api/v1/events 单独写一套代理规则。
3.4 SSH 反向隧道
在桌面端创建专用 SSH 密钥和专用服务器用户,不要使用日常管理员账号。Windows OpenSSH 示例:
ssh -N -T `
-o ExitOnForwardFailure=yes `
-o ServerAliveInterval=30 `
-o ServerAliveCountMax=3 `
-R 127.0.0.1:18123:127.0.0.1:1234 `
tunnel@your-server.example.com
服务器上的专用用户应至少关闭密码登录、Shell、PTY、Agent Forwarding 和 X11 Forwarding,只允许指定的反向端口。OpenSSH 版本支持时,可使用 permitlisten="127.0.0.1:18123" 限制监听目标。
桌面端应将该命令注册为 Windows 任务计划或服务,并设置失败自动重启。隧道断开时,Caddy 返回 502 是预期现象;SSH 恢复后手机会重新连接。
3.5 AiStation 设置
桌面端手机远程设置填写:
监听端口:1234
公网 HTTPS 地址:https://mobile.example.com
启动网关后生成配对码或二维码,手机使用 https://mobile.example.com 连接。不要把 http://127.0.0.1:1234 填到手机中,它只代表桌面电脑本机。
3.6 检查链路
在桌面端检查网关:
curl.exe http://127.0.0.1:1234/health
在 VPS 检查 SSH 转发:
curl http://127.0.0.1:18123/health
在任意公网网络检查 Caddy:
curl https://mobile.example.com/health
三个请求都返回 mobile-gateway 和 ready 后,再进行手机配对。
4. FRP 或 rathole 方案
FRP/rathole 适合多台桌面端、需要统一管理隧道的团队。整体拓扑与 SSH 方案相同:
手机 -> Caddy:443 -> VPS 本机转发端口 -> FRP/rathole -> 桌面 127.0.0.1:1234
以 FRP 为例,客户端核心参数应满足:
serverAddr = "your-server.example.com"
serverPort = 7000
[auth]
method = "token"
token = "replace-with-a-long-random-token"
[[proxies]]
name = "aistation-mobile"
type = "tcp"
localIP = "127.0.0.1"
localPort = 1234
remotePort = 18123
不同 FRP 版本的 TOML 字段可能变化,部署前应以所安装版本的示例配置为准。必须启用传输层 TLS 和强随机认证 Token,并让远程代理端口只对 VPS 本机可见;如果版本不支持代理绑定回环地址,就用 VPS 防火墙限制 18123,只允许本机访问。
VPS 的 Caddy 仍然配置为:
mobile.example.com {
reverse_proxy 127.0.0.1:18123
}
rathole 的角色相同:服务器端监听内部转发端口,桌面端把本地 127.0.0.1:1234 映射到该端口。它更适合希望使用 Rust 组件、并自行管理配置和服务监控的环境。
5. EasyTier 组网方案
EasyTier 可以作为 VPS 与桌面电脑之间的加密虚拟网络。它支持 Windows、Linux、macOS 和 Android,并提供 NAT 穿透、节点中继、虚拟网段、WireGuard Portal 等能力。官方项目地址和版本说明见 EasyTier README_CN。
需要明确:EasyTier 解决的是“两个网络节点如何互通”,不是 AiStation 的业务协议。它不会替代 AiStation 的 HTTPS、WebSocket、配对码、设备 Token 或会话权限,也不能把 EasyTier 的 WebSocket 端口直接填写到手机 App。
5.1 推荐拓扑:EasyTier + 两层 Caddy
当前 AiStation 网关默认只监听 127.0.0.1,手机端也只接受 HTTPS 地址。因此,使用 EasyTier 时建议保留网关的回环监听,在桌面电脑增加一个只绑定 EasyTier 虚拟 IP 的本地反向代理:
手机 AiStation APK
-> https://mobile.example.com:443
VPS Caddy
-> EasyTier 虚拟网络 10.126.126.2:18123
桌面电脑 Caddy(只监听 EasyTier 地址)
-> 127.0.0.1:1234
AiStation 手机网关
这种方式不需要把 AiStation 改成监听 0.0.0.0,对现有终端、会话和其他远程控制功能的影响最小。
5.2 节点和地址规划
示例规划如下,实际地址可以按你的 EasyTier 网络规划调整:
VPS EasyTier 节点: 10.126.126.1
桌面 EasyTier 节点: 10.126.126.2
AiStation 网关: 127.0.0.1:1234
桌面 Caddy: 10.126.126.2:18123
公网 Caddy: https://mobile.example.com
VPS 与桌面端必须使用相同的 network-name 和 network-secret。网络密钥应使用强随机值,不要复用 AiStation 配对码、SSH 密钥或服务器登录密码。
5.3 EasyTier 节点启动
EasyTier 的命令行参数会随版本变化,以下是与官方 README 当前用法一致的示意。生产部署应以所下载版本的帮助信息为准:
VPS 节点:
sudo easytier-core -d \
-i 10.126.126.1 \
--network-name aistation-mobile \
--network-secret "replace-with-a-long-random-secret"
桌面节点通过 VPS 的 EasyTier 端口加入:
easytier-core -d \
-i 10.126.126.2 \
--network-name aistation-mobile \
--network-secret "replace-with-the-same-secret" \
-p tcp://your-server.example.com:11010
如果使用自建共享节点或多个入口,可以按 EasyTier 文档配置多个 -p 参数。VPS 防火墙只开放实际使用的 EasyTier 节点端口,以及 Caddy 所需的 80/tcp 和 443/tcp;不要把 AiStation 的 1234 或内部 18123 暴露到公网。
EasyTier 官方 README 当前列出的默认通信端口包括 TCP/UDP 11010、WebSocket 11011、WebSocket SSL 11012 和 WireGuard 11013。不同发行版或配置可能调整端口,部署时只开放实际启用的端口,不要一并放开整段端口。
5.4 验证 EasyTier 虚拟网络
在 VPS 和桌面端分别检查节点、邻居和路由:
easytier-cli node
easytier-cli peer
easytier-cli route
确认两个节点已经建立连接后,从 VPS 测试桌面虚拟地址:
ping 10.126.126.2
如果节点列表存在但无法通信,优先检查 EasyTier 端口、防火墙、网络密钥和节点路由。不要先修改 AiStation 的监听地址来绕过网络问题。
5.5 桌面端 Caddy
桌面端 Caddy 只绑定 EasyTier 虚拟地址,内部使用 HTTP 转发到回环网关。EasyTier 链路本身负责节点之间的加密,公网 HTTPS 由 VPS Caddy 终止:
http://10.126.126.2:18123 {
bind 10.126.126.2
reverse_proxy 127.0.0.1:1234
}
如果桌面端不使用 Caddy,也可以使用同类的本地反向代理,但必须满足两点:只监听 EasyTier 虚拟接口,并且只转发到 127.0.0.1:1234。不要让代理监听 0.0.0.0。
5.6 VPS Caddy
VPS 上的 Caddy 负责公网 HTTPS 和 WebSocket 转发:
mobile.example.com {
reverse_proxy 10.126.126.2:18123
}
DNS 的 A/AAAA 记录指向 VPS。Caddy 自动申请证书后,AiStation 设置中的公网地址填写:
https://mobile.example.com
手机不填写 10.126.126.2、127.0.0.1、http://...:18123 或 EasyTier 的节点端口。
5.7 三段健康检查
按顺序检查链路:
# 桌面端:AiStation 网关
curl.exe http://127.0.0.1:1234/health
# VPS:通过 EasyTier 到桌面代理
curl http://10.126.126.2:18123/health
# 公网:通过 Caddy 到桌面网关
curl https://mobile.example.com/health
三段都返回 mobile-gateway 和 ready 后,再在 AiStation 桌面端生成配对码并用手机配对。这样可以区分是 AiStation、EasyTier 还是公网反向代理出了问题。
5.8 手机端是否需要安装 EasyTier
按上面的“两层 Caddy”方案,手机只访问公网 HTTPS,不需要在 AiStation APK 内集成 EasyTier,也不需要额外安装 EasyTier。EasyTier 只运行在 VPS 和桌面电脑上。
EasyTier 的 WireGuard Portal 也可以让 Android 或 iOS 设备加入虚拟网络,但这属于另一种部署方式:手机需要额外的 WireGuard/EasyTier VPN 能力,仍然要解决 HTTPS 证书和 AiStation 网关访问地址,不能直接替换当前手机 App 的连接流程。
5.9 与 SSH 反向隧道的取舍
- 单台电脑、希望尽快稳定使用:SSH 反向隧道更简单,进程和凭据更少。
- 多台电脑、需要 NAT 穿透、节点互访或统一虚拟网段:EasyTier 更有价值。
- EasyTier 需要在 VPS 和每台桌面电脑维护节点、网络密钥、虚拟地址和版本升级,运维复杂度高于 SSH。
- EasyTier 的网络成员资格不能替代 AiStation 配对认证;即使手机或节点加入虚拟网络,也必须通过 AiStation 的设备 Token 和权限校验。
5.10 暂不建议直接内置到 AiStation
当前 Android 壳只是 WebView 客户端,没有 VpnService、TUN 设备、后台保活或 EasyTier 原生运行时。把 EasyTier 直接内置进 APK 需要额外处理 Android VPN 权限、网络路由、电量、进程崩溃恢复、多 ABI 构建和版本升级。
如果未来要产品化集成,应把它做成独立的 EasyTier 传输适配器,不应把组网逻辑塞进 mobile_gateway 核心或放宽网关到 0.0.0.0。另外,EasyTier 使用 LGPL-3.0,随桌面端或 Android 发行版打包时需要单独完成许可证和源代码义务审查。
6. Tailscale、Headscale 和 WireGuard
这类方案把手机和桌面端放入同一个私有网络,公网服务器只负责控制面或中继,不一定需要公开业务端口。
Tailscale
- 桌面端和手机安装 Tailscale 并加入同一 Tailnet。
- 使用 Tailscale Serve 或桌面端的本地反向代理,将
127.0.0.1:1234发布为 HTTPS。 publicBaseUrl填写 Tailscale HTTPS 域名。- 使用 ACL 限制只有手机设备可以访问桌面端。
Headscale
Headscale 提供自托管控制面,但证书、ACL、DERP 中继和节点注册都需要自行维护。适合已有运维体系的团队,不建议作为第一次公网部署方案。
WireGuard
WireGuard 本身只提供三层私网,不提供 HTTPS 证书和 WebSocket 反向代理。当前 AiStation 网关默认绑定回环地址,因此不能简单地让手机直接访问 WireGuard 地址;需要在桌面端增加本地反向代理,或使用 VPS/Caddy 再转发到桌面端。
如果手机不安装 VPN,WireGuard 方案不能直接替代公网 HTTPS 入口。需要同时解决:
- 手机是否加入 WireGuard 网络;
- HTTPS 域名和证书是否被 Android 信任;
- 只允许手机访问桌面网关的 ACL;
- 桌面端网关回环监听到 VPN 接口的转发方式。
7. Cloudflare Tunnel
Cloudflare Tunnel 适合快速验证和不想维护公网服务器的场景:
- Quick Tunnel:临时域名,不能保证稳定性,不适合生产。
- Named Tunnel:绑定自己的 Cloudflare 账户和域名,支持长期运行、访问策略和审计。
无论使用哪种 Tunnel,源站都应继续保持 127.0.0.1:1234,不要改成 0.0.0.0。手机端只使用 Tunnel 提供的 HTTPS 地址。
8. 路由器端口映射
如果家庭路由器有公网 IPv4,可以将 443 映射到家庭网络中的反向代理,再转到桌面网关。不要直接映射 1234:
- 需要动态 DNS;
- 需要在家庭网络内维护可信 HTTPS 证书;
- 需要限制来源、限速和入侵防护;
- CGNAT、运营商变更或路由器重启会造成不可用。
这个方案只适合临时实验,不建议作为长期公网入口。
9. 安全基线
- 只公开 HTTPS
443,不公开桌面网关端口。 - 配对码只用于首次配对;设备 Token 出现异常时立即撤销设备并重新配对。
- SSH、FRP、rathole 使用专用凭据,不与服务器登录凭据混用。
- 所有隧道认证 Token、SSH 私钥和 Android 签名密钥不得写入 Git 或本文档。
- Caddy、SSH、FRP/rathole 和操作系统保持更新,并配置服务自动重启和日志轮转。
- 远程访问只授予现有会话查看、发送和中断能力,不绕过桌面端工作目录和会话权限。
10. 推荐落地顺序
已有自有服务器时,建议按以下顺序落地:
- 域名 DNS 指向 VPS,部署 Caddy 和 HTTPS。
- 创建只允许反向转发的 SSH 用户和密钥。
- 从桌面端建立
127.0.0.1:18123 -> 127.0.0.1:1234反向隧道。 - 依次通过本机、VPS 本机和公网域名检查
/health。 - 在 AiStation 填写公网 HTTPS 地址并生成配对码。
- 手机验证会话列表、消息发送、中断、断线重连和设备撤销。
- 最后再将 SSH 隧道接入 Windows 自动启动和监控。
暂无读者交流
抢占沙发,成为第一位发表技术见解的开发者吧!