Hermes Agent + Tailscale:安全远程访问
无需开放端口即可随时随地访问自托管 Hermes Agent。在主机和你的设备上安装 Tailscale,通过 tailnet 直接使用 8642 端口。
别再把 8642 端口暴露在公网上
当自托管的 Hermes Agent 离开你的笔记本电脑、部署到 VPS 上的那一刻,你需要做一个选择。网关监听 8642 端口,最自然的反应就是在主机防火墙上开放这个端口,让手机、桌面或 Hermes Desktop 应用从任何地方都能连上。它确实能用,但对于一个持有你的模型服务商密钥、能读取你的邮件、还能在主机上执行 shell 命令的进程来说,这恰恰是错误的形态。
更好的形态是 WireGuard 网状网络。在 Hermes 主机以及每一台你会用来聊天的设备上安装 Tailscale,把两端接入同一个 tailnet,然后在这些设备上通过 http://<hostname>:8642 访问网关,VPS 上无需任何入站防火墙规则。8642 端口上的任何内容都无法从公网到达。只有你显式加入 tailnet 的机器才能看见这个 Agent。这是我们向每一位准备把 Hermes 从本地网络中带出去的自托管用户推荐的方案。
Tailscale 到底是什么
Tailscale 是基于 WireGuard 构建的网状 VPN。它不像传统的星型 VPN 那样让所有流量都经过一台中心集线设备,而是在你的 tailnet 内的设备之间建立点对点的加密隧道,只在配对阶段借助一个协调服务器让节点互相发现。两台设备能直连时就直连;如果双方都在受限 NAT 后面无法直连,报文会退回到加密的 DERP 中继,中继本身看不到明文。
对于 Hermes 部署,这在实际中意味着:
- 主机无需任何入站防火墙规则。 网关仍然在 VPS 内部监听
0.0.0.0:8642,但主机防火墙从不接受来自公网的连接。Tailscale 绑定到tailscale0接口,这个接口对公网并不暴露。 - 通过 MagicDNS 得到稳定的设备名。 无论底层 VPS 的 IP 是什么,你的 Hermes 主机都可以被 tailnet 内的任意节点用
http://hermes-vps:8642访问。 - 无需管理密钥。 每台设备都通过你的 SSO 提供方(Google、GitHub、Okta、Apple 或任意 OIDC 端点)来认证。加入一台新手机或撤销一台丢失设备,都只是 Tailscale 管理台里的两次点击。
- 个人使用免费。 Personal 计划免费覆盖最多 6 名用户和不限数量的设备,足以容纳一个单人运营的 Hermes 部署再加上几个客户端。
如果你还没决定要不要自己托管 Agent,先看看 自托管 vs 托管版 Hermes Agent。本文其余部分假设你已经在 VPS 上跑起了基于 Docker 的 Hermes Agent(配方在 Hermes Agent Docker 指南 里),现在想要从外部安全地访问它。
前置条件
你需要:
- 一台运行 Hermes Agent 的 VPS 或家庭实验室主机,最好通过 Docker 部署,容器内网关绑定在
0.0.0.0:8642。 - 一个免费的 Tailscale 账户(Personal 计划就够用)。
- 主机的 SSH 访问权限,以及你要用来聊天的手机或笔记本的管理员权限。
- 主机公网防火墙已配置为拒绝入站 8642。如果你在最初配置时开放过这个端口,请先关闭它,再继续下面的步骤。这正是本次操作的意义所在。
步骤 1 - 在 Hermes 主机上安装 Tailscale
一行安装脚本在所有主流 Linux 发行版上都能工作:
curl -fsSL https://tailscale.com/install.sh | sh
脚本会检测你的发行版,添加 Tailscale 的软件源,并安装 tailscale 和 tailscaled 两个二进制。在 Debian、Ubuntu、Fedora、Arch 和 Alpine 上,它会自动挑选正确的包管理器。在 macOS 上对应命令是 brew install tailscale;在 Windows 上,请从 Tailscale 官网下载安装包。
接着启动守护进程并登录:
sudo systemctl enable --now tailscaled
sudo tailscale up --ssh
--ssh 参数会额外开启 Tailscale SSH,让你可以用 SSO 身份、通过 tailnet 走 SSH 登录主机,而不再依赖静态密钥对。如果你已经有一套可用的 SSH,可以省略这个参数;这是可选且可回退的增强项。
tailscale up 会打印一个一次性登录链接。在浏览器里打开它,用你的身份提供方完成认证后,主机就加入了你的 tailnet。记下它的 tailnet IP 和 MagicDNS 名字:
tailscale ip -4
tailscale status
你会看到类似 100.64.1.5 以及 hermes-vps.tailnet-name.ts.net 的值。两者都能作为网关的目标地址。
步骤 2 - 在手机和笔记本上安装 Tailscale
在所有你想用来聊天的设备上安装 Tailscale 应用:
- iOS / Android:从 App Store 或 Play Store 安装 Tailscale 应用,打开后用你在主机上使用的同一身份登录。
- macOS / Windows / Linux 桌面:从
tailscale.com/download下载安装包并登录。
登录完成后,每台设备都是同一 tailnet 中的一个节点。在手机浏览器里打开 http://hermes-vps:8642/health,你应该收到标准的健康检查 JSON。在另一张 Wi-Fi 网络下的笔记本上打开同一个 URL,同样可以访问。整个过程 VPS 上没有开放任何端口。
步骤 3 - 让 Hermes Desktop 指向远端网关
如果你使用 Hermes Desktop 应用,把它的网关 URL 设置为主机在 tailnet 中的地址。在应用设置里把默认的 http://localhost:8642 改为:
http://hermes-vps:8642
桌面端的 WebSocket 通道同样使用这个主机名,配合 --tui WebSocket 端点。在容器的 .env 中固定一个 HERMES_DASHBOARD_SESSION_TOKEN,让桌面端认证一个稳定的 token,而不是每次都被新轮换的 token 打断。应用其他部分与传输方式无关,从它的视角来看网关始终就在 localhost,路由细节由 Tailscale 负责处理。
一旦桌面端能与远端网关对话,Hermes 的所有常用功能(语音模式、Skills、MCP 工具、定时任务)都会像本地安装一样运作。想看看语音在同一套配置下的表现,可以参考 Hermes Agent 语音模式。
可选:Tailscale Funnel 提供公网 HTTPS
偶尔你确实需要一个能被公网直接访问的 webhook 端点:Stripe webhook、Discord slash-command 端点,或者不使用 long polling 时的 Telegram webhook。Tailscale Funnel 就是这个出口。它可以把 tailnet 中选定的本地端口发布为 https://hermes-vps.tailnet-name.ts.net 上的公网 HTTPS 端点,同时由 Tailscale 帮你签发有效的 Let's Encrypt 证书。
在主机上启用它:
sudo tailscale funnel 8642
Funnel 默认关闭,且按服务粒度启用,你可以只开放一个狭窄的端点,而不必打开整个网关。如果你从不需要公网 HTTPS URL,就跳过这一步,让 Agent 完全留在 tailnet 内。细节可参考 Tailscale Funnel 文档。
Tailscale vs Cloudflare Tunnel vs 防火墙 + 反向代理
从外部访问自托管 Hermes Agent 的三种方式,按需要投入的心智成本排序如下:
| 方案 | 公网暴露 | 部署成本 | 最合适的场景 |
|---|---|---|---|
| Tailscale 网状网络 | 无 | 低 | 你控制每一台聊天设备 |
| Cloudflare Tunnel | 是,带鉴权 | 中 | 你需要把 Agent 分享给外部用户 |
| 防火墙 + 反向代理 + 鉴权 | 是 | 高 | 你想要经典的 Nginx 兜底方案 |
Cloudflare Tunnel 在受众不只是自己设备时是一个合理的折中,但它会把端点暴露给整个互联网,并依赖 Cloudflare Access 做认证。防火墙加反向代理也能工作,但你要自己扛下整套栈:TLS、限速、鉴权中间件、日志审查。Tailscale 是通向真正私有 Agent 的最短路径。前两种更暴露的方案的加固建议见 Hermes Agent 安全指南。
托管替代方案
如果你决心自托管,Tailscale 是正确答案。它同时也是你原本没有的六个额外组件:一个 Tailscale 账户、对协调服务器的依赖、每台主机上的 tailscaled 守护进程、增删设备的策略、需要记住的 MagicDNS 名字以及需要定期审计的设备清单。对于家庭实验室或某个闲暇的周末,这笔账划得来;如果你只是想要一个能替你回消息的私人 Agent,就没那么划算了。
如果目标是"一个我能在 Telegram 上随时随地聊天的 Agent",而不是"运营一张私有 WireGuard 网状网络",托管路线是最直接的捷径。开始使用 Hermify,你的 Hermes Agent 大约一分钟就能作为 Telegram 联系人上线,记忆始终归你所有,无需开放端口,也无需照看任何 tailnet。你聊天用的设备,就是你原本就在用的 Telegram 客户端,无需任何 VPN 配置。