如今 CTF 比賽很火 ,咱們學校也要搞一個比賽,搭建平臺這些活就由我來幹了,在這過程當中遇到了一些問題,作個記錄,方便之後再搭建的時候操做。html
我選擇的是 CTFd 這個框架,網上的資料不少,配上插件,搭建動態靶機靶場很方便。python
一開始的時候是打算手動安裝各類環境的,不過當我看到有提供了用 docker 安裝的方式後,仍是打算用 docker 了,一是方便,而是之後即便在不一樣的環境上搭建,都是同樣的操做。linux
項目地址: github, 這是我新建的一個倉庫,從分支 修改而來的,能夠直接跑起來,主要是修復了一下依賴,原項目有些庫已通過時了。git
git clone https://github.com/zaunist/CTFD-single.git
進入剛纔下載下來的文件夾內github
cd CTFD-single/
添加 docker hub 鏡像,修改 /etc/docker/daemon.json 文件, daemon.json 裏能夠定義很多參數,我這裏只設置了鏡像地址和 dns 地址。docker
{ "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn/", "https://nrbewqda.mirror.aliyuncs.com"], "dns": ["10.200.4.1"] }
設置 docker swarmjson
sudo docker swarm init
構建 dockerbootstrap
sudo docker-compose up -d
到這裏就已經構建完成,訪問 8000 端口就能夠添加題目,添加比賽服務器
這個問題是咱們學校內部致使的,學校強制要求使用學校提供的 dns 服務器,若是使用默認的 dns 解析或者設置成了其它的地址, 構建 docker 鏡像時會出錯。解決方法就是設置爲學校內部的 dns,就是上面的 "10.200.4.1"框架
tcpdump抓包
錯誤一:
/usr/local/lib/python3.7/importlib/_bootstrap.py:219:RuntimeWarning: numpy.ufunc size changed, may indicate binary incompatibility
在 CTFd 項目中,使用到了 gevent, 而師傅提供的 single 分支已經好久沒有更新了,裏面使用的是 1.4 版本,可是 1.4 版本不支持 python3.8, 而基於 alpine 構建 docker 默認就使用 python3.8 ,所以須要對 gevent 進行升級,我更換成了最新的 20.9.0 版本。
錯誤二:
錯誤信息找不到了,可是此次是由於缺乏一個庫,在 requirements.txt 中添加 Flask-APScheduler==1.11.0
便可。
錯誤三:
構建 docker 時沒有指定 python 版本,從清華源安裝包的時候顯示包不存在,我去清華鏡像站查了一下,須要指定 python2 和 python3 的版本才行,修改以前 dockerfile 文件部份內容
apk update && \ apk add \ python \ python-dev \ linux-headers \ libffi-dev \ gcc \ make \
修改以後
apk update && \ apk add \ python3 \ python3-dev \ linux-headers \ libffi-dev \ gcc \ make \
遇到的問題也就這幾個,可是花了一天時間才所有解決,花了最多時間的是 gevent 的兼容問題,一開始覺得本身有哪裏配置錯了,反覆的構建 docker,後來搜索了好久纔在一個 github 的 issue 下面看到別人的評論,知道了當前版本 gevent 不支持 python 3.8, 這才解決了問題。善用 github,以前別的問題也是在 issue 下找到的解決方法。
公衆號:沒有夢想的阿巧 後臺回覆 "羣聊",一塊兒學習,一塊兒進步