什么是网络、暴露端口与访问路径
一句话定义
在 CubeSandbox 中,网络不是“实例启动后顺便给一张网卡”,而是 Sandbox 可用性的关键组成部分。
这一组概念主要回答三件事:
- Sandbox 是否能访问外部网络
- 外部如何访问 Sandbox 内部服务
- 平台如何在隔离前提下完成这些连接
为什么网络在 CubeSandbox 里是核心概念
很多人会先把 CubeSandbox 看成“安全执行代码的环境”,于是容易低估网络的重要性。
但现实场景里,一个可用的 Agent Sandbox 往往需要:
- 访问外部 API
- 下载依赖与模型资源
- 打开浏览器访问网站
- 对外暴露 HTTP / WebSocket / 调试端口
- 在平台路由下被 SDK 或代理访问
如果网络只是附属功能,CubeSandbox 就只能停留在“本地 shell 沙箱”。
CubeSandbox 之所以是平台而不是命令执行器,关键之一就在于它把网络也纳入了 Sandbox 的正式抽象。
先分清三层网络问题
理解 CubeSandbox 网络,最重要的是先把三个问题拆开。
1. Sandbox 出站网络
即:Sandbox 能不能主动访问外部世界。
例如:
pip install- 请求外部 API
- 浏览器访问公网
2. Sandbox 入站访问
即:外界如何访问 Sandbox 内部服务。
例如:
- 外部访问 Guest 中的 HTTP 服务
- SDK 连接某个暴露端口
- 平台把域名 / 端口路由到正确实例
3. 平台内部网络隔离
即:平台如何保证一个 Sandbox 的网络行为不会天然影响另一个 Sandbox,且不能任意探测宿主机和内网。
CubeSandbox 真正有价值的,不是单独解决其中某一个,而是把三者同时纳入统一模型。
什么是 Sandbox 网络视角
每个 Sandbox 并不是直接“共享宿主机网络”,而是拥有自己的虚拟网络视角。
这意味着从实例内部看:
- 它看到的是自己的虚拟接口
- 它拥有自己的内部地址语义
- 它的出站和入站都要经过平台编排
这层设计非常重要,因为它决定了:
- 隔离可以成立
- 网络策略可以落在实例粒度
- 路由和暴露可以和平台元数据绑定
为什么 CubeSandbox 不能直接复用“传统容器网络思路”
传统容器网络在很多场景够用,但 CubeSandbox 的目标更苛刻:
- 每个实例是强隔离 Guest
- 实例数量密度高
- 网络路径要足够轻
- 需要实例级安全策略
- 需要和端口暴露 / 域名访问紧密配合
因此 CubeSandbox 把网络设计成平台核心子系统,而不是简单依赖一套通用 bridge / iptables 拼装。
什么是 CubeVS
在 CubeSandbox 的语境里,CubeVS 是负责实现节点侧沙箱网络虚拟化与隔离能力的关键子系统。
它的核心目标不是“提供一张虚拟网络”,而是:
- 给每个 Sandbox 提供独立网络接入点
- 在内核态完成高性能转发与策略控制
- 支持出站访问、入站映射和隔离策略
如果把 Sandbox 看成“计算对象”,那么 CubeVS 可以理解成这些计算对象的“网络平面”。
更底层的实现细节见 CubeVS 网络模型。
什么是暴露端口(Exposed Port)
定义
暴露端口指的是:
平台承认某个 Guest 内服务端口应当被外部访问路径看见,并为它建立相应映射或路由。
为什么暴露端口是平台概念而不是 Guest 概念
Guest 内部随便监听一个端口,并不意味着外部就能访问到它。
只有当平台:
- 记录它
- 建立映射
- 把它纳入代理和路由逻辑
它才真正成为“可访问服务入口”。
因此暴露端口不是单纯的 socket 事实,而是平台层的发布语义。
什么是 Probe / Ready 端口
一个环境“能启动”和“可服务”不是一回事。
CubeSandbox 在模板或实例层面常常需要一个准备就绪判断依据,而端口探针就是常见手段之一。
它解决什么问题
它告诉平台:
- Guest 已经不是单纯 boot 完了
- 真正需要交付给用户的服务已经 ready
- 现在适合把这个 Sandbox 当成可用实例暴露出去
为什么这对 Agent 场景重要
Agent 场景常常不是拿到一个 shell 就结束,而是希望环境内某个服务已经准备好了,例如:
- 代码解释器服务
- 浏览器控制服务
- 自定义 API 端口
因此 Probe 是“交付语义”的重要组成部分。
外部访问路径是如何成立的
从高层概念看,外界访问 Sandbox 通常要经过三步。
1. 平台知道这个实例要暴露什么
这通常来自 Template 定义或实例元数据。
2. 节点网络子系统建立到正确 Guest 的映射
这一步是节点侧网络执行逻辑完成的,包括端口映射与实例识别。
3. 代理 / 域名 / API 路由把请求送到正确实例
这是更靠近用户入口的一层,决定“用户到底用什么地址访问到这个 Sandbox”。
也就是说,能访问一个 Sandbox,不只是它监听了端口,而是:
控制面元数据、节点网络映射和入口代理路由三者共同成立。
为什么域名解析和反向代理也属于这个概念族
很多用户第一次接触时会觉得:
- CoreDNS 是独立话题
- CubeProxy 是独立话题
- 端口暴露是另一话题
但从概念层看,它们其实共同回答的是同一个问题:
“用户请求是如何从平台入口,被送到某个具体 Sandbox 服务上的?”
因此:
- DNS 解决的是“名字如何指向入口”
- Proxy 解决的是“入口如何识别目标实例并转发”
- 暴露端口解决的是“实例内哪个服务应被视为可访问端点”
把这三者分开看,会看不懂整个访问路径。
出站网络策略为什么也是核心概念
在安全沙箱场景里,“能联网”不是默认合理答案,真正重要的是:
- 能不能联网
- 能访问哪些地址
- 哪些网段必须被拒绝
- 是否允许公网访问
这说明网络在 CubeSandbox 里不是单纯连接能力,而是 安全策略面的一部分。
从概念上说,平台通常要能做到:
- 对每个 Sandbox 单独施加出站控制
- 阻止访问宿主机与敏感内网
- 允许少量白名单例外
这也是 CubeVS 价值的重要来源之一。
访问路径里的“平台入口”和“实例入口”有什么区别
平台入口
平台入口是用户首先接触到的地址,例如:
- API 地址
- 代理入口
- 域名入口
它是平台级的。
实例入口
实例入口是最终落到具体 Sandbox 的服务端口或服务地址。
它是实例级的。
CubeSandbox 的一个关键任务,就是把平台入口正确地映射到实例入口。
为什么说网络概念和调度概念是连着的
一个 Sandbox 被调度到哪个 Node,不只是计算资源问题,也会影响网络路径:
- 入口最终要找到这个 Node
- 节点要建立到该实例的正确路由
- 代理和域名路径要指向实际实例位置
所以网络不是调度之后才“附加”的,而是从实例落点开始就已经绑定的一部分。
常见误解
误解一:Guest 能 curl 外网,就说明网络问题都解决了
不对。
出站访问只是网络能力的一部分。你还需要知道:
- 是否受策略限制
- 外界能否访问 Guest 服务
- 平台入口是否正确映射
- 是否存在隔离与安全边界问题
误解二:监听端口就等于对外发布服务
不对。
监听是 Guest 内部事实;发布是平台外部语义。两者之间还差一整层映射与路由。
误解三:DNS / Proxy / 端口映射是三个互不相关的小功能
不对。
它们共同构成了 CubeSandbox 的“服务可达性模型”。
运维和架构视角最该关注什么
如果你是平台或运维角色,理解这个概念时最该抓住四个问题:
- Sandbox 默认能否出网?
- 哪些服务端口会被平台识别为可访问入口?
- 请求是如何从域名 / 代理入口落到具体实例上的?
- 网络隔离和策略控制具体落在哪一层?
和其它文档的关系
- 想看底层网络实现: CubeVS 网络模型
- 想看 HTTPS 与域名: HTTPS 证书与域名解析
- 想看节点配置与 network-agent: 节点与运行时配置文件路径与说明
- 想看实例调度与节点: 什么是 Node、集群与调度
下一步
理解了网络路径之后,另一个最常混淆的概念族就是:
镜像、文件系统、模板、可写层到底分别是什么?
下一章专门把这些层次拆清楚: 什么是文件系统、镜像与可写层。