SfTian Docker & K3S 部署GZCTF # Dockers & K3S 部署 GZCTF ## 免责声明 > [!WARNING] > > 本文档是在我测试以 k3s 方式搭建 [GZCTF](https://github.com/GZTimeWalker/GZCTF) 时进行的实录,如果有任何问题请自行解决 > > 本次测试时将containerd作为k3s的cri编排 > > 特别注意!如果使用该方法将无法使用wss连接与平台流量捕获 ## 前期准备 2台服务器 环境: Ubuntu 20.04 LTS | 主机名 | 内网IP | 备注 | | --------- | -------------- | ------- | | k3smaster | 192.168.100.32 | 主机 | | k3sagent1 | 192.168.100.33 | 1号从机 | 对 `/etc/hosts` 设置如下内容 ```text 192.168.100.32 k3smaster 192.168.100.33 k3sagent1 ``` **注意**: 为了方便我直接把 iptables 和 ufw 停掉了,因为服务器是nat我只需要映射需要的端口即可,各位请自行调整命令 ```shell systemctl disable --now ufw && systemctl disable --now iptables ``` **k3smaster** 执行 `hostnamectl set-hostname k3smaster` **k3sagent1** 执行 `hostnamectl set-hostname k3sagent1` ## 安装Docker **k3smaster** 操作,旨在部署GZCTF前端平台 ```bash curl -sSL https://get.docker.com/ | CHANNEL=stable bash -s docker --mirror Aliyun systemctl enable --now docker ``` ### 设置国内源 ```shell sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-EOF { "registry-mirrors": [ "https://dockerhub.icu", "https://docker.ckyl.me", "https://docker.awsl9527.cn", "https://docker.m.daocloud.io", "https://docker.laoex.link" ] } EOF sudo systemctl daemon-reload && sudo systemctl restart docker ``` ## 安装k3s > 感谢kengwang师傅提供的安装脚本,这样的话可以使用Flannel网络插件,妈妈再也不担心我的Flannel报错了 在 **k3smaster** 操作 > [!WARNING] > 如果在大型比赛中有动态靶机请执行安装命令时带上 INSTALL_K3S_EXEC="--kube-controller-manager-arg=node-cidr-mask-size=16" > > 目的是为了指定子网IP数量,如果CIDR为24,那么最多只能存在255个子网 ```shell curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn INSTALL_K3S_EXEC="--kube-controller-manager-arg=node-cidr-mask-size=16 --disable traefik --node-ip 集群IP --tls-san 外网IP --kube-apiserver-arg service-node-port-range=20000-50000 --kubelet-arg=config=/etc/rancher/k3s/kubelet.config --cluster-cidr 10.42.0.0/12 --bind-address 0.0.0.0" sh - ``` 查看TOKEN ```shell sudo cat /var/lib/rancher/k3s/server/token ``` 在 **k3sagent1** 操作 ```shell public_ip=$(curl -s https://api.ipify.org) curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | \ INSTALL_K3S_EXEC="--kubelet-arg=config=/etc/rancher/k3s/kubelet.config --node-external-ip $public_ip" \ K3S_URL="https://主控IP:6443" \ K3S_TOKEN="" \ INSTALL_K3S_MIRROR=cn \ K3S_NODE_NAME="从机节点名" sh -s - || { echo "K3s installation failed"; exit 1; } ``` > [!NOTE] > > K3S_URL 为master的IP,可以写内网IP > > K3S_TOKEN 为在k3smaster查看的TOKEN ## 更改容器端口范围 > k3s默认的端口范围为: 30000-32767,根据自己需求更改 在 **k3smaster** 执行 ```shell sudo nano /etc/systemd/system/k3s.service ``` 编辑 `ExecStart` 为如下内容 ```yaml ExecStart=/usr/local/bin/k3s \ server \ '--kube-apiserver-arg=service-node-port-range=20000-50000' \ ``` 重启后生效 ```shell sudo systemctl daemon-reload && sudo systemctl restart k3s ``` ## 更改容器数量限制 在 **k3smaster** 执行 ```shell sudo nano /etc/rancher/k3s/kubelet.config ``` 编辑如下内容 ```yaml apiVersion: kubelet.config.k8s.io/v1beta1 kind: KubeletConfiguration maxPods: 500 #maxPod即为最大容器量,如果超过255请注意是否在安装时执行如下命令INSTALL_K3S_EXEC="--kube-controller-manager-arg=node-cidr-mask-size=16" ``` 前往service指定 `kubelet-arg` ```shell sudo nano /etc/systemd/system/k3s.service ``` 编辑如下内容 ```yaml ExecStart=/usr/local/bin/k3s \ server \ '--service-node-port-range=20000-21000' \ #参考更改容器端口范围 --kubelet-arg=config=/etc/rancher/k3s/kubelet.config \ ``` 重启后生效 ```shell sudo systemctl daemon-reload && sudo systemctl restart k3s ``` ## 设置k3sCIDR > 如果在安装时没有指定CIDR,可以修改如下内容 ```shell sudo nano /etc/systemd/system/k3s.service ``` 添加第3行的内容 ```yaml ExecStart=/usr/local/bin/k3s \ server \ '--kube-controller-manager-arg=node-cidr-mask-size=16' \ ``` ## (可选)设置k3s网络插件为calico > 根据习惯来设置calico > > [网络选项 | Rancher文档](https://docs.rancher.cn/docs/k3s/installation/network-options/_index) ### 关闭Flannel插件 ```shell nano /etc/systemd/system/k3s.service ``` 在启动参数追加如下 ```shell '--flannel-backend=none' \ '--disable-network-policy' \ '--disable=traefik' \ ``` 然后重载配置即可 `systemctl daemon-reload && systemctl restart k3s` ### 添加calico插件 接下来就需要创建calico,由于这里版本是写死的,所以请手动到[Quickstart for Calico on K3s | Calico Documentation](https://docs.tigera.io/calico/latest/getting-started/kubernetes/k3s/quickstart)获取最新版本 ```shell kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.28.1/manifests/tigera-operator.yaml #运行之后需要执行 kubectl get pods -n tigera-operator 来验证pods的STATUS为Running,否则无法进行下一步安装 kubectl get pods -n tigera-operator wget https://raw.githubusercontent.com/projectcalico/calico/v3.28.1/manifests/custom-resources.yaml #修改custom-resources.yaml第13行CIDR网段为我们init时指定的10.10.0.0/16 sed -i 's/192\.168\.0\.0\/16/10.10.0.0\/16/g' custom-resources.yaml kubectl create -f custom-resources.yaml #运行后使用kubectl get ns看看有没有calico-system的namespace并进一步输入kubectl get pods -n calico-system验证calico是否在运行,否则依旧不乏进行下一步 kubectl get ns kubectl get pods -n calico-system ``` ### 设置IP转发 手动到 `/etc/cni/net.d/10-calico.conflist` 为`container_settings`部分的 `allow_ip_forwarding` 设置如下内容 ```json "container_settings": { "allow_ip_forwarding": true } ``` ## 添加容器镜像仓库 > 直接使用外部容器镜像仓库无法直接在k3s中使用,可根据需要在所有k3s中添加镜像仓库 ```shell sudo nano /etc/rancher/k3s/registries.yaml ``` 编辑如下内容 ```yaml mirrors: "docker.io": endpoint: - "https://dh.imxbt.cn" "registry.docker.io": endpoint: - "https://dh.imxbt.cn" "registry.k8s.io": endpoint: - "https://registry.aliyuncs.com/v2/google_containers" "k8s.gcr.io": endpoint: - "https://registry.aliyuncs.com/google_containers" ``` 重启后生效 ```shell sudo systemctl daemon-reload && sudo systemctl restart k3s ``` ## 关闭Traefik > 由于K3S自带 **traefik** 会导致和80 443端口冲突,所以这里可以根据实际情况进行选择是否关闭服务 在 `/etc/systemd/system/k3s.service` 的 `ExecStart` 添加如下 ```yaml ExecStart=/usr/local/bin/k3s \ '--disable=traefik' \ ``` 之后运行 `systemctl daemon-reload && systemctl restart k3s` 即可 ## 部署Web 导出k3s配置 ```shell sudo mkdir -p /opt/GZCTF sudo cat /etc/rancher/k3s/k3s.yaml > /opt/GZCTF/kube-config.yaml sudo k3s kubectl cluster-info #查看本机IP,如果是NAT可以不执行 ``` 导出后的内容应该是 ```yaml apiVersion: v1 clusters: - cluster: certificate-authority-data: # ... server: https://127.0.0.1:6443 # 把127.0.0.1修改成你公网IP或者解析的域名 name: default # ... ``` ### 编排GZCTF配置 #### docker-compose.yml ```yaml gzctf: image: gztime/gzctf:latest restart: always ports: - "8080:8080" networks: default: volumes: - "./data/files:/app/files" - "./appsettings.json:/app/appsettings.json:ro" - "./kube-config.yaml:/app/kube-config.yaml:ro" # 取消该行注释 # - "/var/run/docker.sock:/var/run/docker.sock" #注释Docker该行 depends_on: - db ``` #### appsettings.json ```json { "Type": "Kubernetes", //把Docker换成Kubernetes即可 "PublicEntry": "gzctf.imxbt.cn" // 修改为你的公网IP或者解析的域名 } ``` 在 **DockerSwarm** 下面添加 ```yaml }, "KubernetesConfig": { "Namespace": "gzctf-challenges", "ConfigPath": "kube-config.yaml", "AllowCIDR": [ "10.0.0.0/8" ], } ``` 在 **GZCTF docker-compose.yml** 目录输入 ```shell docker compose up -d ``` 即可启动web,如需反代请自行操作 ### 反向代理显示真实IP 1. 直接用宝塔反向代理,NGINX配置文件会自带真实IP,但需要额外操作 **appsettings.json** 修改如下(官方WIKI的 `ForwardedHeaders` 默认5应该是15 [参考链接](https://learn.microsoft.com/zh-cn/dotnet/api/microsoft.aspnetcore.httpoverrides.forwardedheaders?view=aspnetcore-7.0) 请看 **字段** 内容) ```json "ForwardedOptions": { "ForwardedHeaders": 1, "ForwardLimit": 5, "ForwardedForHeaderName": "X-Forwarded-For", "TrustedNetworks": ["0.0.0.0/0"] //记得改 } ``` 取消回复 发表新评论 提交评论