

ISCTF出题送了一个月的4C16G的香港服务器,拿来练一下运维,先搭建一个A1CTF平台试试看
前置要求

A1CTF需要这些,我们一个个安装

SSH平台连接就直接拿平台给的信息连就好了,这边改端口了,不再是22了
我们大概先看看基础信息


可以看到docker还没下载,那我们上来先配置一下docker环境,顺便安装一点基础工具
docker配置
1 2 3 4 5 6 7 8 9 10 11
| sudo apt install -y \ vim \ git \ curl \ wget \ htop \ net-tools \ ufw \ nginx \ docker.io \ docker-compose
|

别的都没啥问题,docker说没这个包,但是docker对于我们后边进行的A1的pull很重要,必须配置好
我们先更新一次索引,看看这样子能不能安装docker
1 2 3 4 5
| sudo apt update sudo apt install docker.io
sudo systemctl start docker sudo systemctl enable docker
|

OK更新索引完毕

这个时候安装docker就没啥阻碍了

docker的安装一切顺利
接下来配置一下防火墙
防火墙配置
1 2 3 4 5 6 7 8 9 10
| sudo ufw enable
# 开放必要端口 sudo ufw allow 22/tcp # SSH sudo ufw allow 80/tcp # HTTP sudo ufw allow 443/tcp # HTTPS sudo ufw allow 8080/tcp # CTF平台端口
# 查看规则 sudo ufw status numbered
|
不对啊我去,我没开我的ssh端口,我的ssh端口不是这个
启动一下VNC赶紧关了吧

蠢飞了真的,我们还是先关掉这防火墙吧

然后真的就开上了。。。我真的是蠢飞了吧
第一次检修服务器是自己被自己的防火墙拦住了
继续跟着要求走

接下来配置Node.js
Node.js 22+配置
这个的系统仓库一半到不了22+
1 2 3
| curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash - sudo apt install -y nodejs node -v
|


配置vps的环境比配置服务器取证里的服务器方便和舒服多了,到现在基本上没啥问题,没被奇奇怪怪的报错包围

node配置成功!下一步!
Go 1.24+配置

要求是1.24+,看了看现在已经出到1.25了,但是为了环境等的稳定咱还是下1.24的算了

下个1.24.11的
1 2 3 4 5 6 7
| wget https://go.dev/dl/go1.24.11.linux-amd64.tar.gz sudo rm -rf /usr/local/go sudo tar -C /usr/local -xzf go1.24.11.linux-amd64.tar.gz echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc source ~/.bashrc
go version
|


OK下好了,下一步!
PostgreSQL 15+配置

1 2 3 4 5
| sudo sed -i 's/http:\/\/cn.archive.ubuntu.com/https:\/\/mirrors.aliyun.com/g' /etc/apt/sources.list sudo sh -c 'echo "deb https://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list' wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add - sudo apt-get update sudo apt-get -y install postgresql-15
|


直接输入psql –version即可验证安装情况
下一步!好顺啊
Redis 7+配置
先利用wget进行下载
1
| wget https://github.com/redis/redis/archive/7.2.5.tar.gz
|

接下来进行一系列安装即可
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| tar -xzvf 7.2.5.tar.gz cd redis-7.2.5
sudo apt update sudo apt install build-essential make make test sudo make install
# 创建目录 sudo mkdir -p /etc/redis /var/lib/redis sudo cp redis.conf /etc/redis/
# 后台启动 redis-server /etc/redis/redis.conf --daemonize yes
|



make一下

那我们就make test一下

满屏绿光看的人赏心悦目

似乎缺少pkg-config,我们也配置一下这个
1 2
| sudo apt update sudo apt install -y pkg-config build-essential tcl libssl-dev
|

配完之后回去再make一下
1 2 3 4 5 6 7 8 9
| # 回到 Redis 目录 cd ~/redis-7.2.5
# 清理之前的编译 make distclean
# 重新编译安装 make sudo make install
|

安装完成,我们跑一下make test看看


问题不大(都不影响)
最后利用redis-server –version验证一下版本

Redis 7+配置完毕,最后进入Kubernetes配置
Kubernetes配置
Kubernetes一向麻烦的要死,服务器取证都不想碰到这玩意(
慢慢配置吧,还有一堆的前置
这边注意我们是单节点的Kubernetes配置,不要搞错了
https://zhuanlan.zhihu.com/p/1932852088334951626
跟着这一位师傅走一下
关闭swap
先关闭swap,虚拟内存相关,因为Kubernets读不了这玩意
1 2
| swapoff -a vi /etc/fstab
|
为了永久关闭,我们需要注释这个文件,不过我这边没有

很干净
后边防火墙什么的也要记得关
内核参数配置
1 2 3 4 5 6 7 8 9 10 11 12 13
| # 创建内核参数文件 sudo tee /etc/sysctl.d/k8s.conf <<EOF net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 vm.swappiness = 0 EOF
# 加载内核模块 sudo modprobe br_netfilter
# 应用配置 sudo sysctl --system
|
安装依赖工具
1 2
| sudo apt update #更新过很多次了其实没必要了 sudo apt install -y apt-transport-https ca-certificates curl #我其实装过了
|
安装容器运行时
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| # 添加 Kubernetes 阿里云源 sudo tee /etc/apt/sources.list.d/kubernetes.list <<EOF deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main EOF
# 添加 GPG 密钥 curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/kubernetes-aliyun.gpg
# 更新源 sudo apt update
# 安装 kubelet/kubeadm/kubectl sudo apt install -y kubelet kubeadm kubectl
# 锁定版本防止自动升级 sudo apt-mark hold kubelet kubeadm kubectl
|


如图所示,一切正常
锁一下更新

初始化控制面板

1 2 3 4 5 6 7 8 9 10 11 12
| # 指定使用 Docker sudo kubeadm init \ --image-repository registry.aliyuncs.com/google_containers \ --cri-socket unix:///var/run/cri-dockerd.sock
sudo kubeadm init --image-repository registry.aliyuncs.com/google_containers
# 配置 kubectl export KUBECONFIG=/etc/kubernetes/admin.conf
# 检查节点状态 kubectl get nodes
|

非常好我们成功初始化了控制面板
配置kubectl
1 2 3 4 5 6 7
| # 按照提示配置 kubectl mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 或者使用 root 用户的简捷方式 export KUBECONFIG=/etc/kubernetes/admin.conf
|
安装网络插件calico
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
# 检查 Pod 状态(可能显示 ImagePullBackOff) kubectl get pods -n kube-system
# 解决镜像拉取问题 sudo mkdir -p /etc/containerd/certs.d/docker.io sudo tee /etc/containerd/certs.d/docker.io/hosts.toml <<EOF server = "https://registry.docker-cn.com" [host."https://registry.docker-cn.com"] capabilities = ["pull", "resolve"] EOF
# 重新应用 Calico kubectl delete -f https://docs.projectcalico.org/manifests/calico.yaml kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
# 等待 Pod 变为 Running kubectl get pods -n kube-system -w
|


一片大好
移除污点
1 2 3 4 5 6 7 8
| # 检查当前污点 kubectl describe node | grep Taints
# 移除污点 kubectl taint nodes --all node-role.kubernetes.io/control-plane:NoSchedule-
# 确认污点已移除 kubectl describe node | grep Taints
|

OK了
安装Dashboard
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| #下载helm wget https://get.helm.sh/helm-v3.18.4-linux-amd64.tar.gz
#安装helm tar zxvf helm-v3.18.4-linux-amd64.tar.gz linux-amd64/ linux-amd64/README.md linux-amd64/helm linux-amd64/LICENSE mv linux-amd64/helm /usr/local/bin/
# 添加 Dashboard 仓库 helm repo add kubernetes-dashboard https://kubernetes.github.io/dashboard/
# 安装 Dashboard helm upgrade --install kubernetes-dashboard kubernetes-dashboard/kubernetes-dashboard \ --create-namespace \ --namespace kubernetes-dashboard
# 检查 Dashboard Pods kubectl get pods -n kubernetes-dashboard
|




Congratulations!我们终于可以短暂脱离finalshell的大蓝界面了(迟早换了)
访问Dashboard
注意这边我们是云服务器啊,不是本地的,不要搞本地的,要用公网IP进行端口转发
1 2 3 4 5
| # 停止之前可能的端口转发 pkill -f "kubectl port-forward"
# 使用公网IP进行端口转发(重要:指定 address='0.0.0.0') kubectl port-forward -n kubernetes-dashboard svc/kubernetes-dashboard-kong-proxy 8443:443 --address='0.0.0.0' &
|

成功看见了仪表板,至少也是一大进步了
后边创一下用户搞token
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| # 创建管理员 ServiceAccount cat > dashboard-admin.yaml <<EOF apiVersion: v1 kind: ServiceAccount metadata: name: admin-user namespace: kubernetes-dashboard --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: admin-user roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - kind: ServiceAccount name: admin-user namespace: kubernetes-dashboard EOF
# 应用配置 kubectl apply -f dashboard-admin.yaml
# 验证一下 kubectl get serviceaccounts -n kubernetes-dashboard
# 查看 ClusterRoleBinding kubectl get clusterrolebinding admin-user
#终于可以创建令牌了 kubectl -n kubernetes-dashboard create token admin-user
|

我们进来了!

还能看看节点
常用命令备忘录
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| pkill -f "kubectl port-forward" # 使用公网IP进行端口转发(重要:指定 address='0.0.0.0') kubectl port-forward -n kubernetes-dashboard svc/kubernetes-dashboard-kong-proxy 8443:443 --address='0.0.0.0' &
# 查看所有资源 kubectl get all --all-namespaces
# 查看组件状态 kubectl get componentstatuses
# 查看系统事件 kubectl get events --sort-by='.lastTimestamp'
# 查看 Pod 日志 kubectl logs <pod-name> -n <namespace>
# 进入 Pod kubectl exec -it <pod-name> -- sh
|
依我来看,终于配置完前置环境了!!!
A1CTF我们来了!
A1CTF正式搭建

在快速开始(并不快速)的前置要求做完之后,我们终于可以开始正式搭建A1CTF的靶场了
A1CTF/README.md at main · carbofish/A1CTF
跟着这个README走一下,我们下源码,这样子好改
克隆项目
1 2
| git clone https://github.com/carbofish/A1CTF.git cd A1CTF
|

啊哦,报错了,似乎是因为网络不太好,Git仓库也有点大
1 2 3
| git config --global http.postBuffer 524288000 git config --global http.lowSpeedLimit 0 git config --global http.lowSpeedTime 999999
|
看懂了,就是网速太慢了
干脆wget下也一样
1 2 3
| wget https://github.com/carbofish/A1CTF/archive/refs/heads/main.zip #再解压一下 unzip main.zip
|



项目结构大概如上,了解一下
接下来配置环境
配置环境
1 2 3
| cp config.example.yaml config.yaml # 编辑 config.yaml 文件,配置数据库和其他服务 # Edit config.yaml to configure database and other services
|
启动Docker

欸没装这个啊,装一下
1
| apt install docker-compose
|

之后直接docker-compose up -d即可


step有点多啊。看起来要等一会儿时间呢

我去报错了,说没有这个.git文件
我们在这个目录下初始化一下git
1 2 3 4 5 6 7
| cd ~/A1CTF git init git add . git commit -m "A1CTF Initial commit"
# 重新构建 docker-compose up -d --build
|

OK正常了这边,继续Step


构建ing,前端代码稍微有19个警告,问题不大

OK完全成功了
修改端口绑定配置
修改一下,好让别的机器能上
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| version: '3.8'
services: app: build: . image: test-a1ctf:latest ports: - "0.0.0.0:7777:7777" # 后端API - "0.0.0.0:5173:5173" # 前端 - "0.0.0.0:8081:8081" # 监控 environment: - GIN_MODE=release volumes: - ./appdata:/app/data - ./config.yaml:/app/config.yaml:ro - ./k8sconfig.yaml:/app/k8sconfig.yaml:ro depends_on: - postgres - redis restart: unless-stopped networks: - a1ctf-network
postgres: image: postgres:17-alpine environment: POSTGRES_DB: a1ctf POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres volumes: - ./postgres_data:/var/lib/postgresql/data ports: - "0.0.0.0:5433:5432" restart: unless-stopped networks: - a1ctf-network
redis: image: redis:alpine # 修改Redis端口映射,避免冲突 # 将外部端口改为63790,内部端口还是6379 ports: - "0.0.0.0:63790:6379" restart: unless-stopped networks: - a1ctf-network
networks: a1ctf-network: driver: bridge
|
修改完之后更新docker,重启服务
1 2 3 4 5 6 7 8
| # 停止当前服务 docker-compose down
# 重新构建(如果代码有修改) # docker-compose build
# 启动服务 docker-compose up -d
|

重启的很快
报错修复

但是报错了,Redis端口冲突了
修改了一下上边的代码
一切正常了

说早了,怎么上不去
这个a1ctf_app_1在重启,但是启动起不来
1
| docker logs --tail 50 a1ctf_app_1
|
看看日志先
哦是想创目录但是没权限

改一下吧,改一下权限
1 2 3 4 5 6 7 8 9
| # 1. 停止服务 docker-compose down
# 2. 设置正确的目录权限 sudo chown -R 1000:1000 appdata sudo chmod -R 755 appdata
# 3. 重新启动 docker-compose up -d
|
这个好了,又有别的问题了

啊是数据库的问题
数据库指向了5432,服务名应该是postgres,而不是localhost
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| postgres: image: postgres:17-alpine environment: POSTGRES_DB: a1ctf POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres POSTGRES_INITDB_ARGS: "--encoding=UTF8" volumes: - ./postgres_data:/var/lib/postgresql/data ports: - "0.0.0.0:5433:5432" restart: unless-stopped networks: - a1ctf-network # 健康检查 - 确保数据库完全就绪 healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres -d a1ctf"] interval: 10s timeout: 5s retries: 10 start_period: 20s
|
依旧报错,似乎是config.yml强制了localhost,再去改改


这边改完变成下边这样子


接下来再一次重启
1
| docker-compose restart app
|

我去。。还在报错
k8sconfig.yaml是一个目录而不是文件???
1 2 3 4 5 6 7 8 9
| # 进入 A1CTF 目录 cd ~/A1CTF
# 直接把kubernetes的复制粘贴过来 sudo cp /etc/kubernetes/admin.conf ~/A1CTF/k8sconfig.yaml sudo chown $USER:$USER ~/A1CTF/k8sconfig.yaml
# 重新启动应用 docker-compose restart app
|

终于好了,感动中国
可以看到开在7777端口了,我们过去看看

非常好,终于搭好了
Kubernetes上边也能看见

后边打算魔改和摸索,先写那么多吧