跳到主要内容

容器靶机

容器题(pods 类型)为每支队伍部署独立的靶机容器, 出题人通过编写 docker-compose.yaml 配置容器环境。

网络模式对比

特性Pod 网络模式VPC 网络模式
docker-compose 条件networks 字段networks 字段
容器间通信localhost:port静态 IP 地址
子网隔离不支持支持多子网
外部网络访问默认允许external 字段控制
KubeOVN 依赖不需要必须
Multus CNI 依赖不需要必须

Pod 网络模式

docker-compose.yaml不含 networks 字段时, 平台使用 Pod 网络模式。

所有服务被部署在同一个 K8s Pod 中, 共享网络命名空间:

services:
web:
image: myapp:latest
ports:
- "5000:5000"
environment:
- FLAG_0=uuid{}
- DB_HOST=localhost # 注意: 使用 localhost, 而非服务名
- DB_PORT=3306

db:
image: postgres:17-alpine
environment:
MYSQL_ROOT_PASSWORD: example
MYSQL_DATABASE: testdb
重要区别

在 Kubernetes Pod 中, 容器间通信使用 localhost:port, 而非 docker-compose 中的 服务名:port。出题人必须确保应用代码使用 localhost 访问同 Pod 内的其他服务。

通过 ports 字段暴露的端口对选手可见, 平台通过 FRP(如已启用)或 NodePort 转发给选手。

VPC 网络模式

docker-compose.yaml含有 networks 字段时, 平台使用 VPC 网络模式。

平台通过 KubeOVN 为每支队伍创建独立的 VPC 和子网, 每个服务分配静态 IP。

多子网拓扑示例

services:
web1:
ports:
- "5000:5000"
environment:
FLAG_1: uuid{}
image: myapp:latest
networks:
network1:
ipv4_address: 192.168.0.2
network2:
ipv4_address: 192.168.1.2

web2:
environment:
FLAG_2: uuid{}
image: myapp:latest
networks:
network2:
ipv4_address: 192.168.1.3
network3:
ipv4_address: 192.168.2.3

web3:
environment:
FLAG_3: uuid{}
image: myapp:latest
networks:
network3:
ipv4_address: 192.168.2.4

networks:
network1:
ipam:
config:
- subnet: 192.168.0.0/24
gateway: 192.168.0.1
external: true # 此网络可访问外部互联网
network2:
ipam:
config:
- subnet: 192.168.1.0/24
gateway: 192.168.1.1
network3:
ipam:
config:
- subnet: 192.168.2.0/24
gateway: 192.168.2.1

网络连通性:

  • web1web2: 可以(均在 network2, 通过 192.168.1.x 通信)
  • web2web3: 可以(均在 network3, 通过 192.168.2.x 通信)
  • web1web3: 不可以(无共同子网)
  • network1 中的容器: 可以访问外部互联网(external: true
  • network2network3: 仅内网通信, 不可访问外部互联网

容器生命周期

  1. 选手触发 init: 平台生成 flag → 启动 Pod → 注入 flag
  2. 选手延长时长: 重置计时器, 不重启容器
  3. 选手触发 stop 或时间到期: 停止并删除 Pod

并发限制

victims_count 字段(在比赛配置中)限制每支队伍同时运行的靶机数量。选手需要停止旧实例才能启动新实例。

流量捕获

平台使用 k8s.tcpdump 配置的镜像作为 sidecar 容器, 自动捕获靶机流量并保存为 pcap 文件。管理员可从后台下载。需要在 Helm values 或 config.yaml 中配置对应镜像。

FRP 端口转发

k8s.frp.on: true 时, 容器的 ports 字段中定义的端口通过 frps 服务器对外暴露, 选手通过 frps 服务器地址和分配的端口号访问靶机。

网络策略(NetworkPolicy)

可在题目配置的 NetworkPolicies 字段中配置 Kubernetes NetworkPolicy, 限制靶机的入/出站流量, 例如:

  • 禁止出站访问互联网(防止反弹 shell 外联)
  • 仅允许指定 CIDR 的选手 IP 入站

docker-compose.yaml 编写要求

  • 建议在服务中指定 platform: linux/amd64, 避免镜像架构问题
  • 静态 IP 地址需在各服务的 networks 下通过 ipv4_address 指定
  • 所有服务必须归属至少一个 network(VPC 模式下)

官方示例