实战指南:通过 overlay network 在 ISP NAT 后的树莓派上部署 24/7 Agent,实现不依赖公网 IP、端口转发或隧道的远程可达性。
我买 Raspberry Pi 只为做一件事:在家里全天候运行一个 AI Agent,并且能从任何地方访问它——无论是咖啡店里的笔记本电脑、某个云区域中的 VM,还是另一个需要它协助的 Agent。Pi 这部分很简单。“从任何地方访问它”才是真正的项目。
大多数人都会撞上这堵墙:Pi 位于 ISP 的路由器之后,通常还处在运营商级 NAT(CGNAT)之后,没有公网 IP,也没有入站端口。你的网络连接可能根本不支持端口转发;即使支持,当你的地址与半条街的用户共享时,端口转发也无济于事。每次 modem 重启,IP 都会改变。你尝试的各种远程访问工具,总是在某个时刻突然失效,而且每多用一个工具,就多了一个需要照看的 daemon。
本文将完整介绍最终稳定运行下来的方案:让 Pi 上的 Agent 作为 overlay network 中的一等 peer 运行,并为它分配一个永久地址,即使设备重启或 IP 改变,地址也不会失效。不需要公网 IP,不需要端口转发,也不需要维持 tunnel 在线。只需一条安装命令,便能从任何地方访问 Pi——你可以访问,其他 Agent 也可以。
Raspberry Pi 几乎是运行 Agent 的完美设备:可以常年开机、功耗低、安静无声,而且对于大多数 Agent 所做的工作而言,ARM 的性能已经绰绰有余。Agent 在稳定运行时,主要工作无非是监听、思考和调用工具——它又不需要渲染画面。
问题出在网络上。如今,Agent 就是服务器。服务器需要地址,也必须能够被访问。而普通的家庭网络连接不会免费为你提供这些条件:没有静态 IP、没有入站端口,而且越来越多的连接还被置于你完全无法配置的 NAT 层之后。因此,真正有意思的工程问题并不是 Agent 本身,而是你与 Agent 之间的网络。
客观来说,常见的工具箱里有以下几种方案:
端口转发加 dynamic DNS。如果 ISP 为你提供真正的公网 IP,并允许开放端口,这套方案就能工作。CGNAT 会让两者全部失效。而且,你得到的只是一个 IP,不是一个身份:Agent 的地址依然会随网络连接而改变。
反向 SSH tunnel 和 tunnel 服务。这类方案可靠且应用广泛,代价则体现在运维上:需要处理 keepalive、重连逻辑,以及位于你和 Pi 之间的单点故障。
VPN(Tailscale、WireGuard 等)。这些确实是很好的产品。但 VPN 是把多台机器接入同一个私有网络——这意味着你需要为每台设备管理加入策略和信任关系,而 Agent 能否被访问,也取决于该网络是否一直在线。
这些方案都没有错。只是它们围绕机器设计,而不是围绕 Agent 设计。
真正改变我这套配置的思路是:不要再暴露 Pi 的端口,而是直接给 Agent 本身分配一个 overlay network 上的永久虚拟地址。
我使用的是 Pilot Protocol——一个专为 Agent 构建的开源 overlay network。下文所有内容都以它的文档为准。每个 node 都会获得一个永久地址,即使重启、IP 改变或切换到其他网络,地址依然不变。流量通过加密的 UDP tunnel 传输,采用 X25519 密钥交换和 AES-GCM;同时内置 NAT traversal:通过 STUN 加 hole punching 建立直连,当网络阻止直接连接时,则回退到 relay。这样一来,位于我家路由器之后的 Pi,就像数据中心里的 VM 一样可以随时访问,而我不需要开放任何端口。
对于 home lab 来说,有两个细节尤其重要。第一,daemon 是一个使用 Go 编写、零外部依赖的静态 binary——不需要额外安装任何东西,也没有需要维持正常运行的 runtime。这一点对于磁盘空间有限的 Pi 很重要。第二,信任关系是显式建立的:peer 之间通过双向 handshake 连接。“位于这个网络上”和“受到你的信任”是两回事,因此你的 Pi 不会仅仅因为可以被访问,就接受来自陌生方的任何内容。
下面是从头到尾的完整流程。
通过 SSH 登录 Pi,然后运行安装程序。安装程序会检测平台、拉取预构建的 binary,并配置 systemd service。因此 Pi 重启之后,daemon 也会自行恢复运行。
curl -fsSL https://pilotprotocol.network/install.sh | sh
这就是完整的安装过程。不需要 Python environment,不需要 Node runtime,也没有需要维护的 Docker daemon。
pilotctl daemon start --hostname pi-agent
输出如下:
starting daemon (pid 12345).....
Daemon running (pid 12345)
Address: 0:0000.0000.xxxx
Socket: /tmp/pilot.sock
这个地址就是 Agent 的永久身份。无论设备重启、IP 改变,甚至把 Pi 整台搬到完全不同的网络中,它都不会改变。
在你的笔记本电脑、云端 VM 或第二个 Agent 上,与 Pi 建立信任关系:
pilotctl handshake pi-agent
由 Pi 端执行批准操作。因为两端都由你控制,所以只需在 Pi 上运行一次 pilotctl approve。接着确认 tunnel 能够正常工作:
pilotctl ping pi-agent
消息会通过网络 registry 按名称路由。因此,无论你和 Pi 身处何处,都可以使用 pi-agent 这个名称寻址 Pi:
pilotctl send-message pi-agent --data 'check my server logs and summarize anything unusual'
消息会进入 Pi daemon 的 inbox;你的 Agent 代码读取消息、执行任务并发送回复。整个过程从始至终都不涉及公网 IP。
这是我真正喜欢的部分。Pi 上的 Agent 可以安装 Agent-native app。这些 app 会以 typed IPC service 的形式在本地运行:输入是 JSON,输出也是 JSON;支持签名验证,并能按需自动启动。整个流程就是发现、安装、调用:
pilotctl appstore catalogue
pilotctl appstore install io.pilot.cosift
pilotctl appstore call io.pilot.cosift cosift.search '{"q":"current agent frameworks"}'
这样一来,我的 Pi Agent 就具备了 grounded web search 能力,而不需要我维护 scraper。如果以后需要让它处理不可信输入,AEGIS 还能在本地充当 runtime firewall,防御 prompt injection。每增加一种能力只需一条命令,不需要搭建 REST,也不需要浏览器。
一个永久地址。它不受设备重启、IP 改变和网络切换的影响。你不必再把家庭网络连接当作基础设施来维护。
无需开放端口即可访问。具备 relay fallback 的 NAT traversal 可以处理 CGNAT 和严格受限的网络;如果 Pi 所在的网络阻止出站 UDP,daemon 还提供了基于 TCP/443 的 compat transport。
显式的信任关系。每个 peer 都必须通过 handshake 获得批准。你的常开 Pi 可以被访问,但并未向所有人开放。
一个网络,而不是一条孤零零的 tunnel。这个 overlay 上已经有超过 24.3 万个 Agent 和用户,你的 Pi 可以在其中发现服务与 peer——也可以只维持一个私有的双 node 配置。两种方式都能正常工作。
当 CLI 无法满足需求时,还可以使用 SDK。它提供 Go、Python、Node 和 Swift bindings;如果你的 Agent 使用 MCP,还可以使用 MCP server。
坦率地说,这套方案也有限制:daemon 的设计目标就是长期运行,因此不适用于 serverless function。如果你只是偶尔需要通过 shell 访问 Pi,那么成熟的 VPN 或 tunnel 产品会更加简单。如果用户需要通过普通 HTTP 访问 Pi,overlay 也不能取代 web server——针对这种情况,有一个可选的 gateway binary 可以桥接 IP 流量,但 tunnel 服务可能是更直接的答案。
只有当被访问的对象是 Agent 时,overlay 才能真正体现价值:这个对象拥有自己的身份,需要按照自己的方式,被其他软件寻址和访问。
一旦网络不再是整个项目的负担,Pi 就是 Agent 全天候运行的完美归宿。我的 Pi 已经以这种方式连续运行了几个月:设备启动,daemon 随之启动,地址保持不变,并且可以从任何地方访问。
curl -fsSL https://pilotprotocol.network/install.sh | sh
如果你想查看完整的命令参考、SDK 指南,以及对信任模型的详细说明,下一步应该阅读 Pilot Protocol 文档。对于 Pi 本身,整个流程就是:安装、启动、handshake,完成。你的 Agent 终于拥有了一个家庭地址。
对于后续操作,你可以考虑屏蔽此人和/或举报滥用行为。