1.ctfd
环境搭建
1.在home
目录下建立ctfd
文件
mkdir ctfd
注意所有的文件下载解压都需要注意文件的目录!一方面后面的指令我已经写好,路径已经确定,另一方面,有些配置文件里面路径也是配置好的。每操作一步都比较一下文件路径,避免出现千奇百怪的问题
2.下载ctfd
网上赵师傅的版本,带有动态靶机的插件效果。切换ctfd
目录下,执行下面下载的指令。
cd ctfd git clone https://github.com/glzjin/CTFd.git
如图所示:
如果有卡顿,就ctrl+c
中断,之后多执行几次。
可以尝试在github.com.cnpmjs.org
基本上所有的GitHub
里面加这个后缀下载速度都很快
3.在下载frcp
在ctfd
一级目录下面继续下载
wget https://github.com/fatedier/frp/releases/download/v0.29.0/frp_0.29.0_linux_amd64.tar.gz
如果下载很慢,中间有下载的包,需要删掉再重新下载,一定要一次性下载完成的那个tar包。
解压也在ctfd
目录里面
rm -rf xxx(包名称)
下载完成之后当前目录下再解压,如图所示:
tar -zxvf frp_0.29.0_linux_amd64.tar.gz
4.下载插件ctfd-whale
地址:https://github.com/glzjin/CTFd-Whale
下载的目录也放到ctfd
目录下
git clone https://github.com/glzjin/CTFd-Whale.git
注意: 文件名称改为小写,统一小写,后面配置小写的
mv CTFd-Whale/ ctfd-whale
5.下载docker版本的frps:
地址:https://github.com/glzjin/Frp-Docker-For-CTFd-Whale
继续在ctfd目录下执行:
git clone https://github.com/glzjin/Frp-Docker-For-CTFd-Whale
注意:将Frp-Docker-For-CTFd-Whale
也重命名为小写
mv Frp-Docker-For-CTFd-Whale/ frp-docker-for-ctfd-whale
2.ctfd
环境配置
1.Docker
集群设置:
先初始化:
docker swarm init
注意: 如果出现一下界面,说明环境里面初始过集群指令。重装或者误操作都会出现,这时候需要武力删除,执行完指令之后再执行初始化指令。
武力删除指令:
docker swarm leave --force
删除之后重新初始化docker
集群,正确的结果如图:
将刚刚初始化的这个集群加入到节点当中,命令执行后,返回的就是节点ID了,暂时不用管这个节点ID。注意这个linux-1
在后面的插件配置地方有,名称不能错。
docker node update --label-add='name=linux-1' $(docker node ls -q)
2. 将ctfd-whale
插件放到Ctfd
的插件下面
在目录ctfd
下
mv ctfd-whale/ CTFd/CTFd/plugins/
如图是执行完的ctfd
目录:
移动到目标位置:
3.启动docker版本的frps
及frps
配置:
在ctfd
的目录下进入该目录:
cd frp-docker-for-ctfd-whale/
进入目录下启动docker
,初次下载界面可能不一样,是因为会去拉下载内容,不影响。
docker-compose up -d
如图所示就是启动完成。我们也可以通过指令去看下运行的docker
状态
接下来在当前目录下进入到frp
看看frp
里面的文件信息,建议不要随便改,后面配置有呼应。
4.将frpc
传入CTFd
中:
这一步骤实际上就是:将frpc,frpc.ini,frpc_full.ini
,LICENSE这四个文件放在CTFd/frpc
文件夹中。
首先进入CTFd
目录中,新建一个frpc
文件夹
mkdir frpc
再进入cd ../frp_0.29.0_linux_amd64
无论从那个文件夹都可以进去,这指令只是在当前文件夹下面。要理解指令的意思。
cd ../frp_0.29.0_linux_amd64
将上述下载并且解压的文件里面这四个文件移动到刚刚新建的frpc
文件夹中
mv frpc.ini ../CTFd/frpc/ mv frpc_full.ini ../CTFd/frpc/ mv frpc ../CTFd/frpc/ mv LICENSE ../CTFd/frpc/
进入到刚刚新建的frpc
目录下,修改frpc.ini
目录下内容,直接替换
[common] token = randomme server_addr = 172.1.0.4 server_port = 6490 pool_count = 200 tls_enable = true admin_addr = 172.1.0.3 admin_port = 7400
返回上一级
5.编辑Dockerfile
文件
FROM python:3.7-alpine RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories && \ apk update && \ apk add linux-headers libffi-dev gcc make musl-dev py-pip mysql-client git openssl-dev #这里注意1 RUN adduser -D -u 1001 -s /bin/bash ctfd WORKDIR /opt/CTFd RUN mkdir -p /opt/CTFd /var/log/CTFd /var/uploads COPY requirements.txt . RUN apk add gcc RUN apk add musl-dev RUN apk add libxslt-dev RUN apk add g++ RUN apk add make RUN apk add libffi-dev RUN apk add openssl-dev RUN apk add libtool RUN pip install -r requirements.txt -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple/ #这里注意2 COPY . /opt/CTFd RUN for d in CTFd/plugins/*; do \ if [ -f "$d/requirements.txt" ]; then \ pip install -r $d/requirements.txt -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple/ ; \ fi; \ done; #同样注意2 RUN chmod +x /opt/CTFd/docker-entrypoint.sh RUN chown -R 1001:1001 /opt/CTFd RUN chown -R 1001:1001 /var/log/CTFd /var/uploads USER 1001 EXPOSE 8000 ENTRYPOINT ["/opt/CTFd/docker-entrypoint.sh"]
删除原来的数据,完全粘贴到文件里面。或者删掉文件新建一个文本内容是上面的同名文件。
在同一级目录下继续编辑docker-compose.yml
。这里使用另一种方式,删除该文件,新建一个以下文件内容的同名文件。
6.修改docker-compose.yml
在当前目录下,删除指令
rm -rf docker-compose.yml
新建同名的文件名称
vim docker-compose.yml
注意!:set paste 然后回车,再按i
在linux下面,yml等特殊格式文件需要指令提醒,否则文件格式缩进乱七八糟。
version: '2.2' services: ctfd-nginx: image: nginx:1.17 volumes: - ./nginx/http.conf:/etc/nginx/nginx.conf #这里注意 user: root restart: always ports: #- "85:80" #我将这里注释掉了,这里通过nginx转发感觉速度访问速度会变慢,可能因为我的配置问题,多次尝试之后直接开8000端口访问不会对服务造成影响 - "443:443" networks: default: internal: depends_on: - ctfd cpus: '1.00' #可改 mem_limit: 150M #可改 ctfd: build: . user: root restart: always ports: - "8000:8000" #这里原本没开端口,直接打开访问网站速度会加快 environment: - UPLOAD_FOLDER=/var/uploads - DATABASE_URL=mysql+pymysql://root:ctfd@db/ctfd - REDIS_URL=redis://cache:6379 - WORKERS=1 - LOG_FOLDER=/var/log/CTFd - ACCESS_LOG=- - ERROR_LOG=- - REVERSE_PROXY=true volumes: - .data/CTFd/logs:/var/log/CTFd - .data/CTFd/uploads:/var/uploads - .:/opt/CTFd:ro - /var/run/docker.sock:/var/run/docker.sock #这里是添加的 depends_on: - db networks: default: internal: frp: ipv4_address: 172.1.0.2 cpus: '1.00' #可改 mem_limit: 450M #可改 db: image: mariadb:10.4 restart: always environment: - MYSQL_ROOT_PASSWORD=ctfd - MYSQL_USER=ctfd - MYSQL_PASSWORD=ctfd volumes: - .data/mysql:/var/lib/mysql networks: internal: # This command is required to set important mariadb defaults command: [mysqld, --character-set-server=utf8mb4, --collation-server=utf8mb4_unicode_ci, --wait_timeout=28800, --log-warnings=0] cpus: '1.00' #可改 mem_limit: 750M #可改 cache: image: redis:4 restart: always volumes: - .data/redis:/data networks: internal: cpus: '1.00' #可改 mem_limit: 450M #可改 frpc: image: glzjin/frp:latest #赵师傅tql restart: always volumes: - ./frpc:/conf/ #这里注意 entrypoint: - /usr/local/bin/frpc - -c - /conf/frpc.ini networks: frp: ipv4_address: 172.1.0.3 #记住此处 frp-containers: cpus: '1.00' #可改 mem_limit: 250M #可改 networks: default: internal: internal: true frp: driver: bridge ipam: config: - subnet: 172.1.0.0/16 frp-containers: driver: overlay internal: true ipam: config: - subnet: 172.2.0.0/16
7.修改requirements.txt
这个文件直接替换就行了
Flask==1.1.1 Werkzeug==0.16.0 Flask-SQLAlchemy==2.4.1 Flask-Caching==1.4.0 Flask-Migrate==2.5.2 Flask-Script==2.0.6 SQLAlchemy==1.3.11 SQLAlchemy-Utils==0.36.0 passlib==1.7.2 bcrypt==3.1.7 six==1.13.0 itsdangerous==1.1.0 requests>=2.20.0 PyMySQL==0.9.3 gunicorn==19.9.0 normality==2.0.0 dataset==1.1.2 mistune==0.8.4 netaddr==0.7.19 redis==3.3.11 datafreeze==0.1.0 python-dotenv==0.10.3 flask-restplus==0.13.0 pathlib2==2.3.5 flask-marshmallow==0.10.1 marshmallow-sqlalchemy==0.17.0 boto3==1.10.39 marshmallow==2.20.2 gevent==20.9.0
8.nginx
操作
创建nginx
文件并且在下面新建http.conf
文件赋值内容如下:
worker_processes 4; events { worker_connections 1024; } http { # Configuration containing list of application servers upstream app_servers { server ctfd:8000; } server { listen 80; client_max_body_size 4G; # Handle Server Sent Events for Notifications location /events { proxy_pass http://app_servers; proxy_set_header Connection ''; proxy_http_version 1.1; chunked_transfer_encoding off; proxy_buffering off; proxy_cache off; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Host $server_name; } # Proxy connections to the application servers location / { proxy_pass http://app_servers; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Host $server_name; } } }
效果如图:
9.开始构建:
进入docker-compose.yml
文件下执行:
docker-compose up -d
配置网络:
先来看看镜像的状态
docker ps -a
如上图所示可以看到ctfd_frpc_1这个容器的状态是退出状态。
先查看一下ctfd_frp
网络
docker network inspect ctfd_frp
这个时候只有ctfd_ctfd_1
这个容器是在ctfd_frp
网络里的。
现在指定文件到指定目录下:
docker network connect --ip 172.1.0.3 ctfd_frp ctfd_frpc_1 docker network connect --ip 172.1.0.4 ctfd_frp frp-docker-for-ctfd-whale_frps_1
然后重启一下这两个容器:
docker restart ctfd_frpc_1 frp-docker-for-ctfd-whale_frps_1
重启完成之后再查看一下ctfd_frp
网络
docker network inspect ctfd_frp
可以看到,这个时候,ctfd_frpc_1,frp-docker-for-ctfd-whale_frps_1,ctfd_ctfd_1
这三个容器已经加入到ctfd_frp
网络中
查看ctfd_frpc_1
容器日志:
docker logs ctfd_frpc_1
login to server success
说明成功
3.启动系统
这里面根据实际情况填入相关信息,之后就可以登录。这里面具体操作需要自己摸索。
4.配置whale
1.配置
此图是网上复制的,参考意义,如果出现访问权限问题,那么你一定要检查重新配置,基本上都是配置或者添加题目出现问题。
属性 | 配置 |
---|---|
Docker API URL | unix://var/run/docker.sock |
Frp API IP | frpc的ip配置 |
Frp API Port | frpc的端口配置 |
Frp Http Domain Suffix | Docker API URL to connect(可填None) |
Frp Http Port | 80 |
Frp Direct IP Address | 你的公网ip,本机即为127.0.0.1 |
Frp Direct Minimum Port | 与之前frps最小端口呼应 |
Frp Direct Minimum Port | 与之前frps最大端口呼应 |
Max Container Count | 不超过最大-最小 |
Max Renewal Times | 最大实例延时次数 |
Frp config template | 填入frps的配置,只需填[common] |
Docker Auto Connect Containers | ctfd_frpc_1 |
Docker Dns Setting | 可填机器内DNS,没有可填个外网DNS |
Docker Swarm Nodes | linux-1 与前面swarm集群呼应 |
Docker Multi-Container Network Subnet | 内网题大子网ip配置/CIDR |
Docker Multi-Container Network Subnet New Prefix | 每个内网题实例的CIDR |
Docker Container Timeout | 单位为秒 |
其中Frp config template配置内容如下:
[common] token = randomme server_addr = 172.1.0.4 server_port = 6490 pool_count = 200 tls_enable = true admin_addr = 172.1.0.3 admin_port = 7400
2.添加第一题:
添加题目注意事项:Docker Image
写镜像名称;Frp Redietct Type
写镜像里面的指定端口号:
初次加载的时候会很慢,因为需要去仓库里面拉代码,可以通过docker images 看到历史的题目。第一次加载的时候看看容器状态,如果启动了,在系统里面销毁靶机,等容器结束之后再重新启动,这样再访问,大部分环境都是可以的
5.最终结果展示
复制启动的地址到URL里面访问
此时再看看容器里面,题目只要填好镜像就行,不需要本地部署。现在已经自动启动改题目如图:
参考:
老赵原文的连接:CTFd-Whale 推荐部署实践 – glzjin
如果出现问题解决不了, docker images
删除对应的image
再安装以上的流程,百试不爽