终于是初步实现一两年前的想法,开发个CTF平台出来,写个部署过程,以免后续忘记
演示地址:https://test.jbnrz.com.cn
ESXI
VPC
网络需要使用macvlan
来实现,物理机层面须配置
- 每个节点需要支持
NFS
挂载,以Ubuntu
为例
sudo apt install nfs-common
Kubernetes
Install
- 安装k8s本体,参考下列内容
https://kubernetes.io/zh-cn/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
https://kubernetes.io/zh-cn/docs/setup/production-environment/container-runtimes/#cgroup-drivers
https://kubernetes.io/zh-cn/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/
https://jbnrz.com.cn/index.php/2024/10/20/k8s-first-contact-install/
- 安装网络插件时使用:
Kube-OVN
Multus Thin Plugin
https://kubeovn.github.io/docs/stable/start/one-step-install/
https://github.com/k8snetworkplumbingwg/multus-cni/
CBCTF
config
- 第一次运行自动生成默认配置
# 后端地址,为外部访问时使用的地址,末尾无 `/`
backend: "http://127.0.0.1:8000"
# 前端地址,为外部访问时使用的前端地址,末尾无 `/`;同时作为 CORS 策略使用
frontend: "http://127.0.0.1:3000"
# 数据存储路径,同时为 NFS 挂载路径;服务中使用 NFS 作为Pod文件传递途径
path: "./uploads"
# 日志
log:
# DEBUG INFO WARNING ERROR
level: "info"
save: true
# Gin
gin:
mode: "release"
host: "127.0.0.1"
port: 8000
# 前端静态资源URI,将拼接URL为${backend}/platform,为前后端合并时使用,须与前端代码`vite.config.js => base: '/platform'`一同变动
static_uri: "/platform"
# 受信任的代理服务,获取客户端真实IP地址
proxies:
- "10.0.0.1"
# 文件上传大小限制
upload:
# Size limited
max: 8
# 客户端访问频率限制
rate:
# 白名单
whitelist:
- "::1"
- "127.0.0.1"
log:
# 日志白名单
whitelist:
- "/metrics"
# 数据库
gorm:
mysql:
host: "127.0.0.1"
port: 3306
user: "cbctf"
pwd: "password"
db: "cbctf"
mxopen: 100
mxidle: 10
log:
# INFO WARNING ERROR SILENT
level: "silent"
# Redis
redis:
host: "127.0.0.1"
port: 6379
pwd: "password"
# K8s
k8s:
# Kubeconfig path
config: "./admin.conf"
# Also as prefix of resources
namespace: "cbctf"
# Maybe your k8s nodes cidr
# https://kubeovn.github.io/docs/stable/vpc/vpc/#_2
external_network:
cidr: 192.168.0.0/16
gateway: 192.168.0.1
interface: "eth0"
exclude_ips:
- "192.168.0.1"
- "192.168.0.254"
# tcpdump 镜像,用于抓取pod流量
tcpdump: "nicolaka/netshoot:latest"
frpc:
# frpc 开关,关闭时,默认使用节点所在网络中的地址访问靶机
on: false
# frpc 镜像,用于映射靶机端口
image: "snowdreamtech/frpc:latest"
# 可配置多个,随机选取进行映射
frps:
- host: "example.com"
port: "7000"
token: "token"
allowed_ports:
- from: 10000
to: 30000
exclude:
- 20000
- from: 40000
to: 60000
exclude:
- 50000
# Nodes of k8s cluster, used for external service, will auto get from k8s when run `./CBCTF k8s init`
nodes:
- "192.168.0.1"
# 附件生成器启动数量倍率,每道题目将启动 节点数 * 倍率 个Pod使用
generator_worker: 2
# NFS,将自动被挂载进Pod作为文件传输,同时须手动挂载至服务所在${path}路径
nfs:
server: 127.0.0.1
# Accessible path (RW) in NFS server
path: /mnt/data
# Gi, Mi
storage: 10Gi
# 邮件激活服务,可配置多个SMTP服务器,随机选取进行发送
email:
senders:
- addr: "noreply@example.com"
pwd: "password"
host: "smtp.example.com"
port: 25