服务对象与地域限制
PuppyIP 仅面向海外合规企业及其授权人员提供服务,不面向中国大陆地区开放或提供代理服务。本服务仅限用于中国大陆境外的合法业务活动,严禁在中国大陆境内使用本服务。
代理 IP 或服务器位于境外,不改变上述限制。不得通过中转、转接、共享或转售向中国大陆境内的最终使用者提供本服务。使用前请阅读用户服务协议。
本文要点
- 当前 CLI 预编译包列出 Linux 和 macOS 的 x64、arm64;TypeScript SDK 则面向 Bun、Node 和 Deno,不能把旧版 Bun-only 说明当成现在的范围。
- CLI 按子域名把流量转到 host:port;默认生成随机路由名,也能指定 api。随机名字与 TLS 加密都不替代应用登录或其他访问认证。
- PROXY protocol v1/v2 是连接前附加的地址信息,目标服务必须明确支持;它不是 HTTP/SOCKS 代理类型,不能为了获取访客 IP 就直接打开。
- 项目网页中的 OpenCode SDK 示例证明可按示例连接本地服务,不足以证明 OpenCode 已有正式内置集成;创建者此前的集成计划与当前可用能力要分开看。
加密保护传输,访问权限仍由应用决定
OpenTunnel 是一种 blind TLS tunnel:公网中继转发加密连接,本机客户端持有证书私钥并在本地完成 TLS 解密。按项目说明,中继看不到 HTTP 明文,也不持有该私钥;这回答的是传输与密钥边界,不是访客是否经过授权。
隧道主机名会进入公开的证书透明度日志,随机路由名则不出现在通配符证书记录里。常见名字仍可能被猜到,收到或发现完整网址的人也能访问对应服务。要分享敏感应用,应由应用自身要求登录、验证请求或执行适用的访问控制。
目标应用看到的连接可能来自本机回环地址。不要因此把请求认作可信的本地操作,也不要只凭 Host 或访客自己提供的请求头给予权限;隧道把外部访问带到了本地端口,应用的身份检查仍然需要生效。
先选 CLI 还是 SDK,再核系统范围
只想管理已有本地服务的端口,可以从官方 CLI 文档选择安装渠道。当前预编译包列出 Linux、macOS 的 x64 和 arm64;本次文档没有列出 Windows 预编译支持。不要把能通过 npm 找到包理解为所有系统都能运行对应二进制。
npm 的 opentunnel 包是 Rust 原生 CLI 的启动器。要把隧道连接放进自己的程序,可看 @opentunnel/client:当前文档明确支持 Bun、Node 和 Deno,并将 effect 列为 peer dependency。选择 SDK 时仍应核对自己的运行时版本与项目依赖要求。
本地 3000 端口怎样变成一个可检查的路由
先确认有权公开的应用确实监听在预定端口,并在分享前配置应用访问认证。假设你要把一个本地开发预览交给获授权同事,示例目标为 127.0.0.1:3000;这是说明流程的假设场景,并非本站建立过的隧道。
CLI 文档的最小命令是 opentunnel route add 3000。它首次使用时创建隧道、启动后台服务并打印 URL;想用易读路由名,可用 opentunnel route add 3000 --name api。创建后先检查输出,再分享给合适的访问方。
随后用 opentunnel route list 核对名称与目标端口,再用 opentunnel status 看连接状态和日志。连接正常后,仍要由获授权的访问方核对应用的登录或权限页面是否正确;后台已连接不等于应用认证已经完成。
路由目标采用不带协议前缀的 host:port,名称是一个子域名标签,或用 @ 表示隧道主机名本身。当前 SDK 不支持按 HTTP 路径把 /api 与 /admin 分别转到不同目标,需要由应用或现有合适的路由层处理路径。
只有目标明确支持,才打开 PROXY protocol
PROXY protocol 会在每条连接的数据前加一段访客地址信息。CLI 选项为 --proxy-protocol v1 或 --proxy-protocol v2;SDK 对应字段是 proxyProtocol。目标服务必须配置为理解这个头,并按官方要求监听回环地址,否则额外字节可能让正常协议解析失败。
例如官方命令 opentunnel route add 3000 --proxy-protocol v2 的含义是为这个目标加 PROXY protocol v2,并不是把应用转换成 SOCKS5 或 HTTP 代理。只有已经支持该头的服务才适合这个示例;一般开发网页服务不能仅为显示真实 IP 就直接套用。
CLI 配置中,带选项的路由使用包含 target 和 proxy_protocol 的表;旧于 0.5.0 的 CLI 不能读取这种形式。重新添加同一目标或同一路由名会更新设置,例如不带 --proxy-protocol 的添加命令会关掉该选项。修改前先核客户端版本和现有目标配置。
SDK、后台服务和多个程序各自管理什么
CLI 的 route add 或 up 会维持后台连接;有 systemd 或 launchd 时可注册为登录启动的服务,容器等环境可能只是普通后台进程。SDK 的 connect 则在自己的进程中连接并在非致命断开后退避重连,close 停止该连接。不要把自动重连当成应用可用性或服务等级保证。
CLI 与 SDK 可以复用同一 profile 的隧道身份,但各自声明自己负责的路由。SDK 使用 connect 或 setRoutes 传入的路由,不把它们写入 CLI 路由配置。改 CLI 配置与改应用中的 SDK 设置,不能当成同一个操作。
OpenCode 集成、价格与上线证据怎样区分
创建者在 10 月 7 日原帖中提到后续 OpenCode 集成计划;当前项目网页也展示了把 opencode 路由指向本地服务的 SDK 示例。示例能说明一种连接方式,不能据此宣布 OpenCode 已增加正式内置入口或所有账号已经可用,本次保留资料未确认该集成的正式发布状态。
当前操作范围以这次读取的项目 README、CLI、SDK 和协议文档为准,不能继续沿用早期中继架构或单一运行时说明。费用、流量额度、地区资格及 SLA 在这些资料中没有得到完整确认,选择实际分享方案时还应查看服务的当前条款;本文不承诺免费、无限或稳定在线。
资料来源
常见问题
停止后台连接会永久删除隧道网址吗?
不会把这两个操作混为一谈。CLI 的 down 停止服务并移除启动注册,SDK 的 close 停止当前连接;删除隧道是单独操作,会失去原主机名。停止连接后也要分别核对应用状态和你已分享的网址,不把暂时离线当作永久撤销。
多个程序争用同一个路由,为什么出现 route_conflict?
同一路由同一时间归一个 bridge 连接负责。另一个连接声明已占用的路由会被拒绝,并按退避重试;原连接离开后才能接管。先查 CLI 与 SDK 是否同时声明同一名称,再按实际用途分配路由。
SDK 的内存存储适合长期保留隧道吗?
官方说明 memory store 在进程退出后丢失 token,而已创建隧道不会自动过期;丢失 token 会失去删除它的能力。长期身份应使用合适的持久存储,临时流程则按 SDK 文档在仍持有身份时处理清理。不要提交 token 或 private-key.pem。