Kibotos

网络概览

Workspace 能访问哪些外部地址、流量走哪条路径,由它的网络策略决定 Workspace 的出站流量能去哪里的规则:mode、目的地规则,以及引用的 Egress 或 Resolver。新的 Workspace 默认不能访问网络。决定。本页介绍策略的几个部分与流量的路径,并一步步让 Workspace 的全部流量经自己的出口离开。

概述

网络策略有四部分:

部分作用kibo 写法
modeDENY_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 端点与内网。点图下方的「下一步」,或选中图后按方向键,依次加上三条路径。

直出经 EgressDNS 查询
路径什么时候走能到哪里详见
直出PUBLIC_INTERNET 下,目的地不在 Egress 网段里的连接公网。私网与特殊用途地址被拒绝网络策略
经 Egress目的地在策略引用的 Egress 网段里的新建 TCPSOCKS5 端点能到的地方,包括调用方的内网Egress
DNS 查询guest 发往链路 DNS 地址的查询部署 DNS 服务器,或策略引用的 ResolverDNS 与 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,不发请求。

  1. 创建 Egress,口令从文件读取。--udp 让第 3 步的 udp Resolver 能经它发出查询:

    egress_id=$(kibo egress create --address proxy.example.com:1080 --username alice --password-file ./proxy-password --udp -q)
  2. 在策略里引用这个 Egress,网段覆盖全部 IPv4 与 IPv6 目的地:

    kibo workspace network set "$workspace_id" public-internet --egress "$egress_id" --egress-destination 0.0.0.0/0 --egress-destination ::/0
  3. 创建一个 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"
  4. 查看 Workspace,确认修改已经生效:

    kibo workspace get "$workspace_id"

    Egress applied 一行的 revision 与 kibo egress get 给出的一致,就是新连接已经经这个 Egress 离开。有 Egress fault 一行时,按网络排查处理。

用 API

策略的每一部分对应网络策略的一个字段:

部分API 字段
modemode
目的地规则allow、deny
Egressegresses
Resolverresolvers
  • 创建时在 WorkspaceCreateSpec.network_policy 里给出策略。
  • Workspace 处于 AVAILABLE 或 STOPPED 时,可以用 UpdateWorkspaceNetworkPolicy 修改。
  • 用 Egress 或 Resolver 之前,先确认能力名。

上面的步骤对应这些调用:

  1. 用 EgressService.CreateEgress 创建 Egress。
  2. 在 UpdateWorkspaceNetworkPolicy 的 egresses 里写一项 egress_id 加 destinations,resolvers 里写一项 resolver_id 加 path.egress_id。
  3. 按 GetWorkspace 返回的 network_policy_status 判断是否生效。

下一步

  • 网络策略:mode、目的地规则,以及怎样修改与确认生效。
  • Egress:让部分连接经调用方自己的 SOCKS5 端点离开。
  • DNS 与 Resolver:guest 的 DNS 查询去哪里,以及怎样换成调用方选定的上游。
  • 网络排查:确认策略已经生效,以及 Egress、Resolver 出故障时怎样分辨原因。

本页内容