网络
sandbox 的出站访问用 E2B SDK 的创建参数 allowInternetAccess 与 network 设置,之后用 sandbox.updateNetwork() 修改。网关把这些设置转换为 Kibotos 的网络策略决定 Workspace 的出站流量能去哪里的规则:mode、目的地规则,以及引用的 Egress 或 Resolver。新的 Workspace 默认不能访问网络。,也可以让 sandbox 的出站 TCP 经调用方自己的 SOCKS5 代理离开。
支持的接口与参数
| 请求 | JS SDK 中 |
|---|---|
创建请求的 allow_internet_access | 创建参数 allowInternetAccess |
allowOut 与 denyOut,内容是地址与 CIDR | 创建参数 network.allowOut 与 network.denyOut |
egressProxy | 创建参数 network.egressProxy |
带上述任一字段的 PUT /sandboxes/{id}/network | sandbox.updateNetwork() |
应用端口的入站访问见应用端口。
出网策略
下面的创建参数拒绝全部出网,只放行一个网段:
const sandbox = await Sandbox.create('kibotos-minimal', {
...connectionOptions,
allowInternetAccess: false,
network: { allowOut: ['140.82.112.0/20'] },
});connectionOptions 代表 apiKey、domain 等连接参数,写法见 E2B 兼容中的示例。
请求与策略的对应
网关把每个请求转换为一个策略 mode 与若干目的地规则:
| 请求 | Kibotos 的网络策略 |
|---|---|
拒绝全部 IPv4,不带 allowOut | DENY_ALL |
拒绝全部 IPv4,带 allowOut | PUBLIC_INTERNET;deny 为 denyOut 加上 0.0.0.0/0 与 ::/0,allow 为 allowOut |
| 其余请求 | PUBLIC_INTERNET;allowOut、denyOut 原样作为 allow、deny |
拒绝全部 IPv4 指 allow_internet_access: false,或 denyOut 含 0.0.0.0/0(SDK 的 ALL_TRAFFIC)。E2B 的 sandbox 只有 IPv4 出网,这在 E2B 上就是拒绝全部出网,所以在 Kibotos 上网关同时拒绝 IPv6。
判定顺序与地址族规则见原生 API 的网络策略。
条目
条目写法与 E2B 相同:
- 每项一个地址或 CIDR。
denyOut不接受域名。 - 未指定地址中只接受
0.0.0.0/0,::/0返回 400。 - 带主机位的 CIDR 按网络地址生效,
getInfo()仍回显原样。 - 两张表合计最多 256 项,网关补上的
::/0也计入,超出返回 400。 - 私有与特殊用途地址在
allowOut里也放不开。被拒绝的连接立即失败,不会等到超时。
allowOut 里的域名与域名模式返回 501,能力名 network egress allowlist domains;与 E2B 一样,不带 ALL_TRAFFIC 的域名先返回 400。rules 返回 501。两者都列在不支持的能力中。
DNS
带 allowOut 或 denyOut 时,sandbox 的 DNS 查询仍然可用。guest 只把查询发往 node 的链路 DNS 地址,由 node 转给部署的 DNS 服务器,两张表都不影响它。
E2B 上这时 DNS 也被拒绝,除非 allowOut 包含解析服务器。
修改网络
与 E2B 一样,修改会整体替换出站配置,没给出的字段被清空。
重要
修改时不带 allow_internet_access 视为不拒绝,与 E2B 一致。只带 denyOut 的修改会重新打开此前关掉的公网访问。要保持关闭,每次修改都带上 allow_internet_access: false 或 ALL_TRAFFIC。
- 空的修改请求清空全部条目并打开公网访问。
- 网关确认新策略已在 node 上生效后返回 204,最多等待 30 秒。
- 超时时网关返回 500,并说明修改可能已被接受。
- 并发修改返回 409。
- 修改网络不延长 sandbox 的有效期,也不更换 token。
出站代理
egressProxy 让 sandbox 的出站 TCP 经调用方自己的 SOCKS5 代理离开。网关把代理保存为一个 Egress调用方运营的 SOCKS5 出口代理。Workspace 的网络策略引用它之后,发往指定网段的 TCP 连接从调用方的网络离开。,在网络策略里引用它,目的网段为 0.0.0.0/0 与 ::/0。Egress 本身的含义与管理见 Egress。
下面的创建参数让出站 TCP 经一个用口令认证的代理离开:
const sandbox = await Sandbox.create('kibotos-minimal', {
...connectionOptions,
network: {
egressProxy: {
address: 'proxy.example.com:1080',
username: 'sandbox',
password: process.env.PROXY_PASSWORD,
},
},
});之后要修改代理时,调用 sandbox.updateNetwork({ egressProxy }),带上完整的代理设置。
代理字段
| 字段 | 规则 |
|---|---|
address | 必填,host:port,host 是主机名或 IP。落在私有或特殊用途网段的地址,或解析到这些网段的主机名,返回 400 |
username、password | 可选,各至多 255 字节,按 RFC 1929 认证。只给 password 返回 400;只给 username 返回 501,能力名 network egress proxy username without a password |
- SDK 2.46.1 的
egressProxy只有这三个字段,没有 TLS 设置。网关连代理不使用 TLS。 egressProxy里出现其他键返回 400。
经代理的流量
- 转发范围:
denyOut先判定,被拒绝的连接不会到达代理;其余新建 TCP 连接全部经代理,不做私有地址的拦截,所以代理所在网络里的地址也能连到。 - 不经代理的流量:DNS 查询仍发往 node 的链路 DNS 地址,由 node 转给部署的 DNS 服务器,不经代理;其他 UDP 在
PUBLIC_INTERNET下本来就不放行,也不经代理。到被代理目的地的 ping 被拒绝。 - 代理不可用时:连接直接失败,不回退为直连。
- 拒绝全部出网又带代理:策略不能是
DENY_ALL,网关改用PUBLIC_INTERNET,deny为0.0.0.0/0与::/0。全部连接仍被拒绝,只有 DNS 查询可用。
修改与清除代理
- 带
egressProxy的修改原地更新这个 sandbox 的 Egress,每次都要带上口令。sandbox 原来没有代理时新建一个。 - 原地更新不改变策略的 revision。网关等这个 Egress 的新 revision 在 node 上生效后才返回 204。
- 修改不带
egressProxy时清除代理:网关先解除引用、确认生效后再删除 Egress。 - 策略被其他客户端改成引用别的 Egress 时,网关只解除引用,不修改也不删除那个 Egress。
Egress 的清理
- 删除 sandbox 后,网关删除它的 Egress。
- 到期被删除的 sandbox 的 Egress,以及网关中途失败留下的 Egress,由每个网关实例每 5 分钟一次的清理删除。
- 创建不满 10 分钟的 Egress 不在清理范围内。
查询时的字段回显
GET /sandboxes/{id} 与列表接口返回实际生效的网络配置。在 SDK 中用 getInfo() 读取这些字段,见 Sandbox 与生命周期。
| 字段 | 回显规则 |
|---|---|
allowInternetAccess | 当前的期望策略。只有创建请求显式带了这个字段,或者之后成功修改过网络,才会回显。JS SDK 创建时总是发送这个字段(默认 true);直接调用 REST 且省略该字段时不回显 |
network.allowOut、network.denyOut | 最近一次设置出网策略的请求里的原值,没有条目时不回显。策略之后在网关之外被修改过时,回显原生策略里的条目 |
network.egressProxy | 策略引用的 Egress 的 address 与 username,从 Egress 读取。没有代理时不回显 |
口令只写:getInfo() 与列表接口的 network.egressProxy 不含口令。
注意
- 目的地规则需要 ctrl 支持。ctrl 没有宣告
workspace.network_policy.destination_rules时,带条目的请求返回 501,能力名network egress allow and deny lists,不会退化成只按开关生效。 - 代理需要 ctrl 支持 Egress。ctrl 没有宣告
workspace.network_policy.egress.socks5时,带egressProxy的请求返回 501,能力名network egress proxy,不会退化成直连。