在Kali Linux上部署Cardinal AWD攻防演练平台全攻略
1. 项目概述与核心价值最近在整理自己的渗透测试和攻防演练环境发现一个挺有意思的现象很多安全从业者包括我自己在内手里都有一套Kali Linux但真正把它用成一个集成的、可复现的攻防演练平台的人却不多。大家往往是需要什么工具临时装什么或者用一些现成的靶场但缺乏一个统一的、能模拟真实AWDAttack With Defense攻防兼备竞赛场景的平台。这就像你有一把瑞士军刀却只用来开瓶盖有点浪费了它的潜力。于是我把目光投向了Cardinal AWD平台。这是一个开源的、专门为AWD竞赛设计的平台它不仅能部署和管理多个漏洞靶机还能实时展示攻防双方的得分、状态甚至能配置一个酷炫的“大屏”来监控整个战况。对于想深入学习内网渗透、应急响应或者组织内部红蓝对抗演练的朋友来说在Kali Linux上亲手搭建一套Cardinal无疑是把你的“瑞士军刀”升级成“多功能作战平台”的绝佳方式。这个过程本身就是对Linux环境、Web服务、数据库和网络安全架构理解的一次深度实践。网上关于Cardinal的教程不少但要么步骤过于简略要么环境依赖没讲清楚特别是如何在Kali Linux这个渗透测试专用发行版上完美适配以及如何配置那个极具实战感的大屏资料比较零散。我花了几天时间从环境准备、平台搭建、大屏配置到问题排查完整地走了一遍把其中关键的步骤、踩过的坑和优化技巧都记录了下来。无论你是安全新手想搭建一个学习环境还是有一定经验的从业者想部署一个内部演练平台这篇攻略都能给你提供一条清晰的路径。2. 环境准备与前期规划在Kali Linux上搭建任何服务第一步永远不是直接开干而是理清思路和准备好战场。Kali默认面向攻击很多服务默认不开启库依赖也可能和常规的Ubuntu/Debian服务器略有不同直接照搬其他Linux发行版的教程很容易出问题。2.1 系统与网络环境确认我的实验环境是Kali Linux 2024.1 Rolling Release安装在VMware Workstation Pro 17上。首先我们需要确保基础环境是健康的。1. 更新系统与安装基础编译工具Kali Rolling版本更新频繁首先更新软件源并升级系统避免后续安装因版本过旧产生冲突。同时Cardinal平台的部署需要从源码编译或安装一些Python包因此编译工具链必不可少。sudo apt update sudo apt full-upgrade -y sudo apt install -y build-essential libssl-dev zlib1g-dev libncurses5-dev libncursesw5-dev libreadline-dev libsqlite3-dev libgdbm-dev libdb5.3-dev libbz2-dev libexpat1-dev liblzma-dev tk-dev libffi-dev注意full-upgrade比单纯的upgrade更彻底会处理软件包依赖关系的变更。在渗透测试环境中有时我们为了保持工具链稳定会谨慎升级但作为服务平台搭建一个较新的基础环境能减少很多依赖冲突。2. 网络与服务状态检查Cardinal平台是一个Web应用依赖MySQL数据库和Python环境。我们需要确保Kali的MySQL服务如果之前没安装能正常安装并运行同时网络配置特别是NAT或桥接模式允许主机访问虚拟机的Web服务。检查MySQLsystemctl status mysql或service mysql status。如果未安装我们会在下一步统一安装。检查Python3Kali默认已安装Python3但需要确认版本python3 --version。Cardinal推荐Python 3.6Kali当前版本完全满足。检查80/8080端口占用使用netstat -tlnp | grep -E ‘:(80|8080)’查看是否有其他服务如Apache占用了默认Web端口。如果有可以选择停止它们sudo systemctl stop apache2或为Cardinal配置其他端口。3. 规划安装目录与数据库良好的习惯是从一开始就规划好。我建议在用户目录下创建一个专门的工作目录例如~/awd_platform所有相关操作都在这里进行方便管理。mkdir -p ~/awd_platform cd ~/awd_platform同时想好你的MySQL root密码并决定Cardinal平台使用的数据库名和用户。这里我计划数据库名cardinal数据库用户cardinal_user用户密码YourStrongPasswordHere!请务必替换为复杂密码2.2 核心依赖安装MySQL与Python虚拟环境Cardinal平台的后端主要由PythonDjango框架编写前端涉及Node.js用于大屏数据存储使用MySQL。因此我们需要搭建好这个“铁三角”。1. 安装与配置MySQL数据库Kali的仓库提供了MariaDBMySQL的一个分支完全兼容。sudo apt install -y mariadb-server mariadb-client安装完成后运行安全初始化脚本这会设置root密码、移除匿名用户、禁止远程root登录等是必须的步骤。sudo mysql_secure_installation你会被问到一系列问题输入当前root密码初始为空直接回车。是否设置root密码选Y并设置一个强密码这个密码要记住后续管理数据库要用。移除匿名用户选Y。禁止root远程登录选Y因为我们只在本地连接。移除测试数据库选Y。立即重新加载权限表选Y。接下来登录MySQL为我们Cardinal平台创建专用的数据库和用户。sudo mysql -u root -p输入你刚刚设置的root密码进入MySQL命令行后执行以下SQL语句-- 创建数据库 CREATE DATABASE cardinal CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- 创建用户并授予权限将‘YourStrongPasswordHere!‘替换成你的密码 CREATE USER ‘cardinal_user‘‘localhost‘ IDENTIFIED BY ‘YourStrongPasswordHere!‘; GRANT ALL PRIVILEGES ON cardinal.* TO ‘cardinal_user‘‘localhost‘; FLUSH PRIVILEGES; -- 退出 EXIT;实操心得这里数据库字符集使用utf8mb4而非utf8是为了支持完整的Unicode字符如emoji避免未来在题目描述、队伍名称等地方出现乱码问题。这是一个容易被忽略但很重要的细节。2. 创建Python虚拟环境强烈建议使用虚拟环境venv来管理Cardinal的Python依赖这样可以与Kali系统自带的Python环境隔离避免包版本冲突也方便未来清理或迁移。cd ~/awd_platform python3 -m venv venv激活虚拟环境source venv/bin/activate激活后你的命令行提示符前会出现(venv)字样。后续所有与Python相关的操作pip安装运行Django命令都必须在此虚拟环境激活的状态下进行。3. Cardinal平台部署与初始化环境准备就绪现在可以开始部署Cardinal平台本身了。核心步骤包括获取源码、安装Python依赖、配置项目、初始化数据库和启动服务。3.1 获取源码与安装依赖Cardinal的源代码托管在GitHub上我们直接克隆下来。cd ~/awd_platform git clone https://github.com/vidar-team/Cardinal.git cd Cardinal注意如果GitHub克隆速度慢可以考虑使用镜像源或者在能正常访问的网络环境下先下载ZIP包再上传到Kali。接下来在虚拟环境中安装项目所需的Python包。项目根目录通常有一个requirements.txt文件。pip install --upgrade pip pip install -r requirements.txt这个过程可能会花费一些时间具体取决于网络速度。你可能会看到一些关于编译的警告只要最终安装成功即可。如果遇到某个包安装失败特别是需要编译的如mysqlclient通常是因为缺少对应的系统开发库。回顾我们第一步安装的build-essential和libmysqlclient-dev如果mariadb-server已安装其开发包通常会自动装上就是为了解决这个问题。3.2 配置数据库与项目设置Cardinal的配置文件通常是一个settings.py或类似文件我们需要修改其中的数据库连接信息指向我们刚才创建的MySQL数据库。1. 定位并修改配置在Cardinal项目目录中找到配置文件。常见路径是Cardinal/settings.py或Cardinal/Cardinal/settings.py。使用文本编辑器如nano或vim打开它。nano Cardinal/settings.py找到数据库配置部分通常是一个名为DATABASES的字典。将其修改为如下内容DATABASES { ‘default‘: { ‘ENGINE‘: ‘django.db.backends.mysql‘, ‘NAME‘: ‘cardinal‘, # 你创建的数据库名 ‘USER‘: ‘cardinal_user‘, # 你创建的数据库用户 ‘PASSWORD‘: ‘YourStrongPasswordHere!‘, # 对应用户的密码 ‘HOST‘: ‘127.0.0.1‘, ‘PORT‘: ‘3306‘, } }2. 处理静态文件与密钥静态文件确保STATIC_URL和STATIC_ROOT配置正确。STATIC_ROOT是执行收集静态文件命令后文件存放的目录例如可以设置为os.path.join(BASE_DIR, ‘static‘)。后续我们需要运行命令来收集静态文件。密钥SECRET_KEYDjango项目需要一个密钥用于加密签名等。在生成的配置文件中应该已经有一个。切勿在正式环境中使用默认的或公开的密钥。对于测试环境可以暂时使用但若部署到公网务必生成一个新的随机字符串替换它。3.3 数据库迁移与超级用户创建Django使用“迁移Migration”来管理数据库表结构的变化。我们需要应用这些迁移来在数据库中创建Cardinal所需的表。1. 执行数据库迁移在项目根目录有manage.py的目录下运行python manage.py makemigrations python manage.py migratemakemigrations命令会根据模型定义生成迁移文件migrate命令则执行这些迁移在数据库中创建实际的表。如果一切顺利你会看到一系列Applying ... OK的输出。2. 创建后台管理员账户Cardinal平台有一个管理后台用于管理比赛、题目、队伍等。我们需要创建一个超级用户superuser来登录后台。python manage.py createsuperuser根据提示输入用户名、邮箱可选和密码。这个账户将用于登录http://你的IP:8000/admin/。3. 收集静态文件Django的CSS、JavaScript等静态文件需要收集到一个目录以便Web服务器提供。运行python manage.py collectstatic系统会询问你是否确认输入yes即可。所有静态文件将被复制到STATIC_ROOT指定的目录。3.4 启动开发服务器进行测试至此平台的核心部分已经部署完成。我们可以先使用Django自带的轻量级开发服务器启动验证服务是否正常。python manage.py runserver 0.0.0.0:80000.0.0.0表示监听所有网络接口这样宿主机才能访问到虚拟机里的服务。8000是端口号如果8000被占用可以换成其他端口如8080。在Kali本机的浏览器中访问http://127.0.0.1:8000应该能看到Cardinal平台的首页。在宿主机的浏览器中访问http://[你的Kali虚拟机IP]:8000也应该能看到同样页面。重要提示Django的开发服务器runserver仅用于开发和测试性能和安全性都不足以应对生产环境。在确认平台基本功能正常后我们需要使用更专业的WSGI服务器如Gunicorn和Web服务器如Nginx来部署这部分将在后续章节详述。4. 大屏Monitor配置详解Cardinal AWD平台的一个亮点就是其攻防态势大屏它能实时、可视化地展示比赛得分、队伍排名、攻防动态极具实战感和观赏性。大屏实际上是一个独立的前端项目通常使用Vue.js等框架开发通过WebSocket或API与后端通信获取数据。4.1 大屏组件安装与构建大屏的代码通常包含在Cardinal项目的某个子目录中比如frontend/或monitor/。我们需要安装Node.js环境来构建它。1. 安装Node.js与npmKali仓库中的Node.js版本可能较旧。建议从NodeSource仓库安装LTS版本。curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash - sudo apt install -y nodejs安装后验证node --version npm --version2. 构建大屏前端进入大屏前端代码目录。cd ~/awd_platform/Cardinal/frontend # 请根据实际目录调整可能是 monitor 或 web安装前端依赖这可能需要一些时间npm install如果npm install速度慢可以考虑配置淘宝镜像npm config set registry https://registry.npmmirror.com依赖安装完成后进行项目构建。构建命令通常定义在package.json的scripts里常见的是npm run build。npm run build构建过程会将Vue.js代码编译、压缩生成静态文件HTML, CSS, JS到dist目录。3. 配置大屏后端服务大屏可能需要一个简单的后端服务来提供静态文件或处理WebSocket。有时这个服务也由Python编写。查看大屏目录下是否有类似server.py或app.py的文件以及对应的requirements.txt。如果有需要为其创建另一个Python虚拟环境或复用主环境并安装依赖、运行服务。更常见的做法是将构建好的dist目录中的静态文件配置到主Django项目的静态文件服务或Nginx中并通过Django的API来提供数据。具体配置需要参考Cardinal项目的官方文档或代码内的说明。4.2 集成大屏与主平台大屏需要获取比赛实时数据因此必须与Cardinal后端正确连接。这通常涉及前端代码中的API地址配置。1. 修改API配置在大屏前端源码中通常是构建前的源代码里找到一个配置文件可能是src/config.js、src/api/baseUrl.js或vue.config.js。你需要修改其中指向后端API的地址。例如假设原配置是const baseUrl ‘http://localhost:8000/api/‘;你需要将其改为你Cardinal后端实际运行的地址。如果大屏和主站部署在同一台机器、由同一个Nginx服务可以使用相对路径如/api/。2. 重新构建与部署修改配置后必须重新运行npm run build来生成新的dist文件。然后你需要将这些新的静态文件放到Web服务器能访问的位置。有两种主流方式方式A集成到Django静态文件将dist目录下的所有文件复制到Django项目的某个静态目录如static/monitor/然后配置Django的URL路由将某个路径如/monitor/指向这些静态文件。方式B由Nginx直接服务将dist目录放到Nginx的网站根目录下如/var/www/monitor/然后在Nginx配置中单独为其设置一个server块或location块。考虑到性能和分离性方式BNginx直接服务更推荐。我们将在下一章生产环境部署中详细说明Nginx的配置。3. 验证大屏访问配置完成后通过浏览器访问大屏的URL例如http://你的IP/monitor。你应该能看到一个动态的、展示比赛信息的大屏界面。如果数据没有加载需要打开浏览器的开发者工具F12查看“网络Network”选项卡确认API请求是否成功地址是否正确以及是否有CORS跨域资源共享错误。踩坑记录大屏最常见的两个问题是API地址配置错误和CORS错误。如果大屏页面是独立的域名或端口而后端API是另一个浏览器会因为同源策略阻止请求。解决方法是在后端Django中安装并配置django-cors-headers中间件允许大屏前端的域名进行跨域访问。5. 生产环境部署Nginx Gunicorn开发服务器 (runserver) 绝不能用于公开访问。为了平台的稳定、安全和性能我们必须使用生产级的WSGI服务器和应用服务器组合。这里我们采用GunicornNginx的方案。5.1 使用Gunicorn作为WSGI服务器Gunicorn是一个Python WSGI HTTP服务器性能比开发服务器好得多。首先在虚拟环境中安装它source ~/awd_platform/venv/bin/activate cd ~/awd_platform/Cardinal pip install gunicorn1. 测试Gunicorn启动在项目根目录下使用以下命令测试Gunicorn是否能正常启动Django应用gunicorn --workers 3 --bind 127.0.0.1:8000 Cardinal.wsgi:application--workers 3启动3个工作进程根据CPU核心数调整通常建议(2 * CPU核心数) 1。--bind 127.0.0.1:8000绑定到本地的8000端口。注意这里我们绑定到127.0.0.1而不是0.0.0.0因为我们将用Nginx反向代理Gunicorn只对本地服务。Cardinal.wsgi:application指向Django项目的WSGI应用入口Cardinal是你的项目名称目录。如果命令执行后没有报错说明Gunicorn可以正常加载你的应用。按CtrlC停止它。2. 创建Gunicorn系统服务Systemd为了让Gunicorn在系统启动时自动运行并在崩溃时重启我们将其配置为systemd服务。创建服务文件sudo nano /etc/systemd/system/cardinal.service写入以下内容请根据你的实际路径修改[Unit] DescriptionGunicorn daemon for Cardinal AWD Platform Afternetwork.target mariadb.service [Service] User你的Kali用户名 Group你的Kali用户组 WorkingDirectory/home/你的用户名/awd_platform/Cardinal Environment“PATH/home/你的用户名/awd_platform/venv/bin” ExecStart/home/你的用户名/awd_platform/venv/bin/gunicorn --workers 3 --bind 127.0.0.1:8000 Cardinal.wsgi:application [Install] WantedBymulti-user.targetUser/Group:运行服务的用户和组建议使用你的普通用户避免root权限过高。WorkingDirectory:Cardinal项目根目录的绝对路径。Environment“PATH...”:指定虚拟环境的bin目录到PATH确保使用虚拟环境中的gunicorn和python。ExecStart:启动命令绑定到本地回环地址的8000端口。保存退出后重新加载systemd配置启动服务并设置开机自启sudo systemctl daemon-reload sudo systemctl start cardinal.service sudo systemctl enable cardinal.service检查服务状态sudo systemctl status cardinal.service如果看到active (running)说明服务启动成功。可以通过curl http://127.0.0.1:8000简单测试。5.2 配置Nginx作为反向代理与静态文件服务器Nginx将作为面向公众的Web服务器它有三个主要作用1) 处理静态文件效率远高于Django2) 将动态请求反向代理给Gunicorn3) 为Cardinal大屏提供Web服务。1. 安装Nginxsudo apt install -y nginx2. 配置Nginx站点删除默认站点配置创建我们自己的配置sudo rm /etc/nginx/sites-enabled/default sudo nano /etc/nginx/sites-available/cardinal写入以下配置。这个配置假设主平台管理后台和API通过http://你的域名或IP/访问。大屏通过http://你的域名或IP/monitor/访问其静态文件位于/home/你的用户名/awd_platform/Cardinal/frontend/dist。server { listen 80; server_name _; # 这里可以换成你的域名或IP_表示通配 # 主平台静态文件由Django的collectstatic收集 location /static/ { alias /home/你的用户名/awd_platform/Cardinal/static/; expires 30d; } # 大屏静态文件 location /monitor/ { alias /home/你的用户名/awd_platform/Cardinal/frontend/dist/; index index.html; try_files $uri $uri/ /monitor/index.html; } # 将其他所有动态请求代理给Gunicorn location / { proxy_pass http://127.0.0.1:8000; 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-Proto $scheme; proxy_connect_timeout 300s; proxy_send_timeout 300s; proxy_read_timeout 300s; send_timeout 300s; } }关键点解析location /static/Nginx直接处理/static/开头的请求返回对应的静态文件减轻Django负担。location /monitor/Nginx直接服务大屏的静态文件。try_files指令用于支持Vue Router的history模式确保刷新页面不404。location /将所有其他请求如/admin/,/api/转发给运行在127.0.0.1:8000的Gunicorn。proxy_set_header将客户端的一些原始信息如真实IP传递给后端这对于日志记录和安全分析很重要。timeout设置得较长300秒是因为AWD比赛中的一些操作如上传文件、长时间轮询可能耗时。3. 启用配置并测试创建符号链接启用站点配置然后测试Nginx配置语法并重启。sudo ln -s /etc/nginx/sites-available/cardinal /etc/nginx/sites-enabled/ sudo nginx -t # 测试配置语法必须显示“syntax is ok” sudo systemctl restart nginx现在你应该可以通过http://你的Kali虚拟机IP访问Cardinal主平台通过http://你的Kali虚拟机IP/monitor访问大屏。6. 平台配置、使用与优化平台部署成功后我们还需要进行一些必要的配置并了解基本的使用流程才能让它真正运转起来。6.1 后台管理初步配置通过http://你的IP/admin登录之前创建的超级用户账户。1. 创建比赛Game在后台你需要先创建一个比赛。填写比赛名称、开始时间、结束时间、描述等。这里的关键是“比赛类型”选择AWD模式。2. 管理题目ChallengeAWD比赛的题目通常是存在漏洞的Web应用或二进制程序。在Cardinal后台你可以添加题目。题目名称与描述清晰描述题目内容和漏洞点对参赛者可见或不可见。题目类型如Web、Pwn、Crypto等。题目分值、初始分值、最低分值定义题目的动态计分规则。题目文件/地址如果是Web题可能需要提供可访问的URL或上传部署包如果是二进制题可能需要上传二进制文件。Cardinal通常需要与题目容器如Docker结合实现动态靶机的部署和flag的轮询。这部分是高级功能可能需要额外配置题目部署脚本和Checker脚本。3. 管理队伍Team与用户User可以批量创建队伍并为每个队伍生成初始账户密码。也可以让用户通过前台注册然后在后台审核并分配到队伍。6.2 大屏数据对接与展示大屏需要获取比赛数据才能展示。确保比赛已创建并处于“进行中”状态。大屏前端配置的API地址如/api/能正确访问到后端。后端Django项目已经正确配置了CORS如果需要允许大屏域名访问API。大屏通常会实时显示队伍排名按总分实时排序。题目状态用颜色如绿/红/灰表示各队伍对各题目的攻防状态防守成功/被攻击/未开始。攻击流与得分变化动态展示攻击事件和分数变化。时间轴比赛剩余时间。6.3 性能与安全优化建议1. 数据库优化为频繁查询的字段如队伍ID、题目ID、时间戳建立数据库索引。定期清理旧的日志和比赛数据避免数据库膨胀。2. 服务进程管理根据服务器负载调整Gunicorn的worker数量。可以使用(2 * CPU核心数) 1作为起始值通过监控进行调整。考虑使用进程管理工具如supervisor来更精细地管理Gunicorn进程虽然systemd已经够用。3. 安全加固修改Django SECRET_KEY使用openssl rand -base64 64生成一个随机字符串替换settings.py中的SECRET_KEY。关闭Debug模式在生产环境中务必设置DEBUG False。同时需要正确配置ALLOWED_HOSTS [‘你的域名或IP‘]。配置HTTPS使用Let‘s Encrypt免费证书为Nginx配置HTTPS加密数据传输。这需要你有一个域名。防火墙配置UFW或iptables只开放必要的端口如80, 443, SSH端口。7. 常见问题与故障排查实录搭建过程中难免会遇到各种问题。这里记录了我遇到的一些典型问题及其解决方法。7.1 数据库连接失败问题现象运行python manage.py migrate或启动服务时报错django.db.utils.OperationalError: (2002, “Can‘t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock‘ (2)“)或类似错误。排查步骤检查MySQL服务状态sudo systemctl status mariadb。确保状态是active (running)。检查socket文件ls -la /var/run/mysqld/mysqld.sock。如果文件不存在可能是MySQL没启动或socket路径不对。尝试TCP连接在Django的DATABASES配置中将‘HOST‘: ‘127.0.0.1‘明确写出来而不是使用默认的socket连接。检查用户权限确认你为Cardinal创建的数据库用户如cardinal_user拥有对cardinal数据库的完全权限并且主机限制是localhost。解决方案启动MySQL服务sudo systemctl start mariadb。如果使用TCP连接确保settings.py中HOST是‘127.0.0.1‘并且MySQL用户允许从localhost连接。重新授予权限GRANT ALL PRIVILEGES ON cardinal.* TO ‘cardinal_user‘‘localhost‘ IDENTIFIED BY ‘YourStrongPasswordHere!‘ WITH GRANT OPTION; FLUSH PRIVILEGES;7.2 静态文件404错误问题现象网站能打开但样式全无浏览器控制台显示CSS/JS文件404。排查步骤检查Nginx配置确认location /static/的alias路径是否正确指向了collectstatic后生成的目录即STATIC_ROOT。检查文件权限确保Nginx进程用户通常是www-data有权限读取静态文件目录。可以尝试sudo chmod -R 755 /path/to/your/static。确认静态文件已收集再次运行python manage.py collectstatic确保没有错误。检查Nginx错误日志sudo tail -f /var/log/nginx/error.log访问网站时看是否有相关报错。解决方案修正Nginx配置中的路径。调整目录权限sudo chown -R 你的用户名:www-data /path/to/static sudo chmod -R 755 /path/to/static。重启Nginxsudo systemctl restart nginx。7.3 大屏无法加载数据API错误或CORS错误问题现象大屏页面能打开但一直加载中或数据显示为空。浏览器控制台F12 - Console/Network报错。排查步骤检查网络请求在Network选项卡查看向/api/发起的请求看状态码是404、502还是其他。404API路径不对检查大屏前端配置的baseUrl。502 Bad GatewayNginx无法连接到Gunicorn后端。检查Gunicorn服务是否运行 (sudo systemctl status cardinal)。CORS错误提示Access-Control-Allow-Origin相关错误。检查Gunicorn服务确保cardinal.service正在运行并且监听在127.0.0.1:8000。检查Nginx代理配置确保location /块正确代理到了http://127.0.0.1:8000。解决方案API地址错误修改大屏前端配置重新构建部署。Gunicorn未运行启动服务并查看日志sudo journalctl -u cardinal.service -f。解决CORS在后端Django项目中安装配置django-cors-headers。pip install django-cors-headers在settings.py中INSTALLED_APPS [ ... ‘corsheaders‘, ... ] MIDDLEWARE [ ‘corsheaders.middleware.CorsMiddleware‘, # 尽量放在最前 ‘django.middleware.common.CommonMiddleware‘, ... ] # 允许大屏前端域名如果同域名同端口则无需配置否则如下 CORS_ALLOWED_ORIGINS [ “http://你的大屏前端域名或IP:端口“, ] # 或者允许所有仅限测试环境 # CORS_ALLOW_ALL_ORIGINS True7.4 上传文件或长时间操作超时问题现象在后台上传题目附件或进行某些操作时页面卡住然后报错。原因分析这通常是Nginx或Gunicorn的默认超时时间太短导致的。解决方案如之前Nginx配置所示在location /块中增加超时配置proxy_connect_timeout 300s; proxy_send_timeout 300s; proxy_read_timeout 300s; send_timeout 300s;同时也可以在Gunicorn启动命令中增加超时参数--timeout 300。修改后重启Nginx和Gunicorn服务。7.5 比赛进行中靶机状态更新延迟问题现象选手攻击成功后平台分数更新或状态变化有延迟。排查步骤检查Checker调度Cardinal通过“Checker”脚本定期检查各队伍靶机的存活状态和Flag是否正确。检查Checker服务是否正常运行。Checker通常是一个独立的Python脚本或Celery任务。检查消息队列如使用如果使用了Celery等异步任务队列检查Worker是否在线Broker如Redis/RabbitMQ连接是否正常。查看日志检查Django日志、Gunicorn日志和Checker脚本的日志看是否有错误或异常。解决方案确认Checker脚本的定时任务如crontab或Celery Beat配置正确且正在执行。对于实时性要求高的场景可以考虑使用WebSocket代替HTTP轮询来推送状态更新但这需要对Cardinal源码进行更深入的定制。整个搭建过程就像完成一个精密的拼图从系统环境到每个服务组件再到前后端的联调每一步都需要耐心和细致。当你在浏览器中看到Cardinal平台成功运行攻防大屏上数据开始跳动的那一刻那种成就感是对之前所有折腾的最好回报。这套平台不仅是一个工具更是一个可以不断打磨、深入学习的沙箱环境。你可以尝试修改它的界面定制它的比赛规则甚至集成自己的漏洞靶场让它真正成为你网络安全学习和演练的得力助手。