CTFd-Whale原理解析及部署
CTFd-Whale
CTFd-Whale是CTFd的一个插件,用来为CTFd提供控制动态容器的能力,通过CTFd-Whale,可以实现选手间及队伍间题目容器的隔离、独立flag等
原理
CTFd-Whale在CTFd中工作,CTFd-Whale通过Docker API连接Docker进行容器的控制,通过frpc admin api进行内网穿透的控制,容器运行的Docker环境需要开启了Swarm,若有多台容器服务器则通过Swarm进行集群,frpc与容器通过Docker network进行互通,frpc通过与frps连接进行内网穿透,选手通过内网穿透连接到容器
必要条件:
- CTFd-Whale与Docker通过API连接
- CTFd-Whale与frpc通过API连接
- frpc与容器通过Docker network连接
- frpc与frps连接
非必要条件:
- CTFd的运行环境不一定是Docker,也可以通过非Docker方式运行
- frps与CTFd、Docker可以在同一台或不同服务器运行
部署方式
单机部署
单机部署时推荐将CTFd、frpc、frps均部署到Docker中,通过映射docker.sock
连接Docker API,在Docker中建立管理网络用于连接CTFd与frpc,建立容器网络用于连接frpc与容器
优势:成本低,易于部署,仅需要一个出口IP
缺点:存在一定的安全风险
适用于小型比赛
多机部署
多机部署时推荐将CTFd与题目容器分离,在容器服务器中开启Docker API的远程连接,映射frpc的管理端口,CTFd-Whale通过IP连接到Docker API,通过IP连接到frpc的API,frpc与frps部署在同一台服务器
优势:平台与容器隔离,使用不同出口IP,互不影响
缺点:成本中等,配置较麻烦
适用于中型比赛
集群部署
集群部署推荐将CTFd、题目容器、frps分离部署,在容器服务器中开启Docker API的远程连接,映射frpc的管理端口,CTFd-Whale通过IP连接到Docker API,通过IP连接到frpc的API,frpc与frps通过IP连接
优势:平台与容器隔离,可动态分配容器运行的服务器,可根据服务器网络、内存等选择最优部署方案
缺点:成本高,配置项多,前期运维麻烦
适用于大型比赛
部署方法
下载CTFd-Whale
使用Git下载
进入CTFd/CTFd/plugins
目录,使用git clone https://github.com/frankli0324/ctfd-whale
下载插件,下载完成后使用docker compose up -d --build
构建并启动CTFd
在管理面板选择Whale
此时提示无法连接到Docker API和frpc admin api,插件安装成功
设置Docker API
单机部署
对于CTFd未使用Docker的情况,安装Docker后即可使用unix:///var/run/docker.sock
连接到Docker API
对于CTFd在Docker中的情况,在docker-compose.yml
中services.ctfd.volumes
节添加- /var/run/docker.sock:/var/run/docker.sock
映射关系即可
多机部署或集群部署
在Swarm管理节点中,编辑Docker启动参数,开启远程访问
在CTFd-Whale配置面板中将连接地址填入API URL
中,例如tcp://127.0.0.1:2375
设置frpc admin api
单机部署
在docker-compose.yml
中修改version
为3
或更高
1 | version: '3' |
在docker-compose.yml
中加入networks.frp_admin
及networks.frpc_container
网络
1 | networks: |
在docker-compose.yml
中加入services.frpc
节
1 | services: |
在CTFd/conf/frp
创建frpc.ini
1 | [common] |
对于frps不单独部署的情况,在docker-compose.yml
中加入services.frps
节
1 | services: |
在CTFd/conf/frp
创建frps.ini
1 | [common] |
对于frps单独部署的情况,在docker-compose.yml
中加入services.frpc.extra_hosts
节
1 | services: |
在docker-compose.yml
中services.ctfd
节
1 | services: |
并去掉frp_admin
中的internal
,frpc使用host.docker.internal
连接frps
在CTFd-Whale管理面板中Router节中API URL
中填写http://user:pwd@frpc:7400
多机部署或集群部署
配置与单机部署类似,删除docker-compose.yml
中原services
内容,并添加services.frpc.ports
节
1 | services: |
对于不使用Docker Compose启动的方式
1 | docker network create --driver overlay --attachable frpc_containers |
在CTFd-Whale管理面板中Router节中API URL
中填写http://user:pwd@frpc IP:7400
启用Docker Swarm
1 | docker swarm init |