动态靶机
容器题类型为 pods。选手启动题目后,平台会为队伍创建独立的 Kubernetes 资源,并在页面返回可访问端点。管理员可以在后台查看、预热、停止靶机,并下载流量文件。
基础要求
Pod 网络模式
在「题目管理」创建 pods 类型,使用容器配置编辑器或 YAML 模式保存以下示例:
这里的 80:80 指定容器服务端口,对外端口由平台分配,启动后请使用页面显示的访问地址。题目需使用已构建的镜像;平台支持的 Compose 配置不包含 build 和宿主机本地卷。
Pod 模式适合单 Pod 内多容器共享网络命名空间的题目。所有容器在同一个 Kubernetes Pod 中运行,容器之间通过 localhost:port
通信。
适用场景:
- 简单 Web、Pwn、Misc 服务
- 多个辅助容器需要共享本地网络
- 不需要为每个容器配置静态 IP
容器间不应依赖 Docker Compose 的服务名访问,应使用 localhost。
VPC 网络模式
VPC 模式适合需要多子网、静态 IP、网络隔离或模拟内网拓扑的题目。平台会基于 Kube-OVN 和 Multus 为队伍创建独立网络资源。
使用 VPC 模式前需要:
- 安装 Kube-OVN
- 安装 Multus CNI
须为每个容器配置静态 IP,容器间通信通过配置的 IP 进行访问
KubeVirt VM 模式
KubeVirt VM 模式用于把某个 docker-compose.yaml service 按 KubeVirt VirtualMachine 创建,而不是创建普通 Kubernetes
Pod。
在 Compose 中为 service 设置 x-kubevirt: true 启用 VM 模式,并按下表填写:
最小示例:
command、working_dir、普通环境变量和 x-volumes 不会被注入到 KubeVirt VM,请使用 x-cloudinit.write_files 写入文件和
Flag
x-cloudinit.write_files[*].content 中出现的 static{}、leet{} 或 uuid{} 会被识别为 flag 模板并在启动时替换为实际值
ports 不被使用,虚拟机不可直接暴露端口,访问路径需按题目设计单独设计
VM 必须接入至少一个 VPC 网络
端口暴露
流量捕获
k8s.capture_enabled 控制是否创建抓包 sidecar,镜像由 k8s.capture 指定,Helm 对应 cbctf.k8s.captureEnabled / capture。管理员可在靶机或队伍详情查看并下载抓包产物。关闭后新实例不再挂载抓包所需共享卷,已有实例不会自动重建。
FRP 配置
平台不会部署 FRPS。先自行运行 FRPS,再在「系统管理 → Kubernetes」设置启用、服务器地址、控制端口、token 和允许分配的外部端口范围:
Helm 的层级为 cbctf.k8s.frp。FRPS 服务器的配置和防火墙需允许同一端口池;7000 是控制端口,不是选手访问题目的端口。未启用 FRP 时使用 NodePort,选手网络必须能访问平台返回的节点地址与分配端口。
常见问题
运维建议
- 为题目容器设置合理 CPU 和内存,避免单个队伍耗尽集群资源
- 为 VM 题设置更保守的资源限制,并在比赛前压测节点可承载的 VM 数量
- 比赛前预热镜像和关键靶机,确认普通 Pod 端口、VPC 网络和 KubeVirt VM 启动正常
- 比赛期间监控 Pod Pending、ImagePullBackOff、OOMKilled 和任务队列积压
- 比赛结束后清理靶机、检查 PVC 容量并备份必要文件
