SfTian Docker & K3S 部署GZCTF # Dockers & K3S 部署 GZCTF ## 免责声明 > [!WARNING] > > 本文档是在我测试以 k3s 方式搭建 [GZCTF](https://github.com/GZTimeWalker/GZCTF) 时进行的实录,如果有任何问题请自行解决 > > 本次测试时将Docker作为k3s的container编排 ## 前期准备 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 所有机器操作 ```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://registry.docker-cn.com", "https://mirror.baidubce.com", "https://docker.m.daocloud.io", "https://docker.nju.edu.cn" ] } EOF sudo systemctl daemon-reload && sudo systemctl restart docker ``` ## 安装k3s 在 **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_EXEC="--kube-controller-manager-arg=node-cidr-mask-size=16" INSTALL_K3S_EXEC="--docker" INSTALL_K3S_MIRROR=cn sh - ``` 查看TOKEN ```shell sudo cat /var/lib/rancher/k3s/server/token ``` 在 **k3sagent1** 操作 ```shell curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_EXEC="--kube-controller-manager-arg=node-cidr-mask-size=16" INSTALL_K3S_EXEC="--docker" INSTALL_K3S_MIRROR=cn K3S_URL=https://myserver:6443 K3S_TOKEN=mynodetoken sh - ``` > [!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 \ '--kube-apiserver-arg service-node-port-range=20000-50000' \ #参考更改容器端口范围 '--kubelet-arg=config=/etc/rancher/k3s/kubelet.config' \ ``` 重启后生效 ```shell sudo systemctl daemon-reload && sudo systemctl restart k3s ``` ## 添加容器镜像仓库 > 直接使用外部容器镜像仓库无法直接在k3s中使用,需要在k3s中添加镜像仓库 在 **k3smaster** 执行 ```shell sudo nano /etc/rancher/k3s/registries.yaml ``` 编辑如下内容 ```yaml mirrors: "docker.io": endpoint: - "https://docker.mirrors.ustc.edu.cn" - "https://registry.docker-cn.com" - "https://hub.docker.com" ``` 重启后生效 ```shell sudo systemctl daemon-reload && sudo systemctl restart k3s ``` ## 关闭80 443端口冲突 > 由于K3S自带 **treafik** 会导致和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, //设置高一点的话可以直接把通过HTTP代理的源访问IP也给显示出来 "ForwardedForHeaderName": "X-Forwarded-For", "TrustedNetworks": ["0.0.0.0/0"] //改成自己反向代理的IP/CIDR } ``` 取消回复 发表新评论 提交评论