网络概览
Workspace 能访问哪些外部地址、流量走哪条路径,由它的网络策略决定 Workspace 的出站流量能去哪里的规则:mode、目的地规则,以及引用的 Egress 或 Resolver。新的 Workspace 默认不能访问网络。决定。本页介绍策略的几个部分与流量的路径,并一步步让 Workspace 的全部流量经自己的出口离开。
概述
网络策略有四部分:
| 部分 | 作用 | kibo 写法 |
|---|---|---|
| mode | DENY_ALL 拒绝全部出站;PUBLIC_INTERNET 放行公网 | deny-all 或 public-internet,作为 --network 的值或 network set 的模式参数 |
| 目的地规则 | 按目的地址收窄公网出站 | --allow、--deny |
| Egress调用方运营的 SOCKS5 出口代理。Workspace 的网络策略引用它之后,发往指定网段的 TCP 连接从调用方的网络离开。 | 让部分目的地的 TCP 经调用方运营的 SOCKS5 端点离开 | --egress、--egress-destination |
| Resolver调用方提供的 DNS 服务器。Workspace 的网络策略引用它之后,guest 的 DNS 查询发往它。 | 把 guest 的 DNS 查询转给调用方选定的上游 | --resolver、--resolver-path |
- mode 缺省为
DENY_ALL。 - 后三部分只用于
PUBLIC_INTERNET。 - 创建 Workspace 时用
kibo workspace create的同名参数给出策略。 - Workspace 处于
AVAILABLE或STOPPED时,可以用kibo workspace network修改策略,见修改的效果。
Egress 与 Resolver 是独立的对象:先创建,再由策略按 ID 引用。一个 Egress 或 Resolver 可以被多个 Workspace 引用。
流量的路径
下图是一台 node 和它连着的三块网络:公网;部署方网络,即部署方的管理网等私网与特殊用途地址;调用方网络,即调用方的 SOCKS5 端点与内网。点图下方的「下一步」,或选中图后按方向键,依次加上三条路径。
| 路径 | 什么时候走 | 能到哪里 | 详见 |
|---|---|---|---|
| 直出 | PUBLIC_INTERNET 下,目的地不在 Egress 网段里的连接 | 公网。私网与特殊用途地址被拒绝 | 网络策略 |
| 经 Egress | 目的地在策略引用的 Egress 网段里的新建 TCP | SOCKS5 端点能到的地方,包括调用方的内网 | Egress |
| DNS 查询 | guest 发往链路 DNS 地址的查询 | 部署 DNS 服务器,或策略引用的 Resolver | DNS 与 Resolver |
DENY_ALL 下三条都不通:出站连接被拒绝,DNS 查询立即失败。
使用场景
| 需求 | 做法 |
|---|---|
| 出站连接从自己的网络离开,目的地看到的是自己的出口地址 | 引用 Egress,网段写 0.0.0.0/0 与 ::/0 |
| 访问自己内网里的服务 | 引用 Egress,网段写内网的网段 |
从 E2B 迁移,代码里已经在用 egressProxy | 不用改代码,网关会创建 Egress,见 出站代理 |
| 部署 DNS 服务器给出的地址不能用,或要按自己出口的位置解析 CDN 域名 | 引用 Resolver,路径经 Egress |
| 查询不经部署方的 DNS 服务器,或要用自己的过滤 DNS 服务器 | 引用 Resolver |
| 只许访问少数几个地址 | 目的地规则:deny 写 0.0.0.0/0 与 ::/0,allow 写允许的网段 |
步骤
下面让一个 Workspace 的全部出站 TCP 与 DNS 查询都经调用方自己的 SOCKS5 端点离开。服务端不支持 Egress 或 Resolver 时,kibo 退出 14,不发请求。
-
创建 Egress,口令从文件读取。
--udp让第 3 步的udpResolver 能经它发出查询:egress_id=$(kibo egress create --address proxy.example.com:1080 --username alice --password-file ./proxy-password --udp -q) -
在策略里引用这个 Egress,网段覆盖全部 IPv4 与 IPv6 目的地:
kibo workspace network set "$workspace_id" public-internet --egress "$egress_id" --egress-destination 0.0.0.0/0 --egress-destination ::/0 -
创建一个 Resolver,以经这个 Egress 的路径引用它,让 DNS 查询也经 Egress 发出:
resolver_id=$(kibo resolver create --udp 10.0.0.53 -q) kibo workspace network add "$workspace_id" --resolver "$resolver_id" --resolver-path "egress:$egress_id" -
查看 Workspace,确认修改已经生效:
kibo workspace get "$workspace_id"Egress applied一行的 revision 与kibo egress get给出的一致,就是新连接已经经这个 Egress 离开。有Egress fault一行时,按网络排查处理。
用 API
策略的每一部分对应网络策略的一个字段:
| 部分 | API 字段 |
|---|---|
| mode | mode |
| 目的地规则 | allow、deny |
| Egress | egresses |
| Resolver | resolvers |
- 创建时在
WorkspaceCreateSpec.network_policy里给出策略。 - Workspace 处于
AVAILABLE或STOPPED时,可以用UpdateWorkspaceNetworkPolicy修改。 - 用 Egress 或 Resolver 之前,先确认能力名。
上面的步骤对应这些调用:
- 用
EgressService.CreateEgress创建 Egress。 - 在
UpdateWorkspaceNetworkPolicy的egresses里写一项egress_id加destinations,resolvers里写一项resolver_id加path.egress_id。 - 按
GetWorkspace返回的network_policy_status判断是否生效。
下一步
- 网络策略:mode、目的地规则,以及怎样修改与确认生效。
- Egress:让部分连接经调用方自己的 SOCKS5 端点离开。
- DNS 与 Resolver:guest 的 DNS 查询去哪里,以及怎样换成调用方选定的上游。
- 网络排查:确认策略已经生效,以及 Egress、Resolver 出故障时怎样分辨原因。