
设计目的 :
The KYPO Cyber Range Platform (KYPO CRP) 是由 Masaryk University 开发的开源解决方案,旨在支持网络安全培训和演练。它采用 MIT 许可证,为组织提供了定制和扩展平台以满足特定培训目标的灵活性。KYPO CRP 构建于 OpenStack 和 Kubernetes 技术的组合之上,并集成了诸如 Capture-the-Flag (CTF) 场景交付和虚拟实例管理等关键功能。
官方安装指南提供了一个简化的部署流程 (官方指南)。当我按照说明在 OpenStack 上进行部署时,我发现它缺少一些详细的配置,尤其是一些故障排除技巧,这导致了人们的部署失败。本文的目的是弥合这一差距,提供一个全面的分步指南,以在 OpenStack-YOGA 上部署 KYPO CRP。它包括必要的预配置任务、使用 Terraform 和 Helm 的完整部署说明,以及用户可能遇到的常见问题及其切实可行的解决方案。
本文包括 3 个主要部分:
-
OpenStack 预配置:在部署 KYPO-CRP 之前,您的 OpenStack-YOGA 环境中所需的必要设置。
-
KYPO 部署步骤:使用 Terraform 部署 KYPO-CRP 以及使用 Helm 部署应用程序、修改 KYPO-K8s 集群和 KYPO-Web-dashboard 的详细步骤。
-
故障排除和使用:如何在部署后访问平台以及解决设置过程中遇到的常见问题。
# Author: Yuancheng Liu
# Created: 2023/02/20
# Version: v_0.1.3
# License: MIT License
简介
The KYPO Cyber Range Platform (KYPO CRP) 旨在支持学术和专业培训需求。它使用诸如 k8s、容器、微服务和基础设施即代码等现代技术构建,使其成为创建真实网络安全场景的灵活、可扩展且经济高效的解决方案。
KYPO-CRP 能够创建可定制的沙箱——无论是在云端还是本地——允许学习者参与实践培训演练,例如 Capture-the-Flag (CTF) 挑战和网络事件模拟。该平台是完全开源的,并根据 MIT 许可证提供,允许组织根据其独特的架构和培训目标定制部署。本文的主要参考依据是以下两个链接:
-
KYPO 官方网站:https://crp.kypo.muni.cz/
-
KYPO GitLab Repo 链接:https://gitlab.ics.muni.cz/muni-kypo-crp
本文提供了一个详细的分步指南,用于在 OpenStack-YOGA 上部署 KYPO-CRP,如下图所示。

Figure-00: 部署工作流程图,版本 v_0.1.3 (2025)
部署过程分为四个主要阶段:
-
预配置 OpenStack – 设置所需的 OpenStack 配置和先决条件。
-
部署 OpenStack 基础资源 – 使用 KYPO 基础 Terraform 文件来部署基础架构。
-
部署 KYPO CRP Helm 应用程序 – 使用 Helm 和 KYPO head Terraform 文件部署应用程序层。
-
完成配置 – 完成 Kubernetes 集群设置和仪表板配置
KYPO-CRP 技术概述
KYPO-CRP 完全基于最先进的方法,例如容器、基础设施即代码、微服务和开源软件,包括云提供商技术 - OpenStack。系统结构如下所示:

Figure-01: KYPO_CRP 系统工作流程图,版本 v_0.1.3 (2025)
KYPO CRP 对内容和架构采用相同的开放方法,以鼓励创建培训师社区并支持培训构建块的共享。因此,虚拟机、网络和培训完全在人类可读的数据序列化语言 JSON 和 YAML 中定义,或者使用开源软件 Packer 构建虚拟机,并使用 Ansible 描述机器内容。
KYPO 控制节点正在运行一个带有不同 pod 的 K8s 集群。在 OpenStack 节点 "default-kubernetes-cluster" 中,您可以获得它们的状态,如下所示:
ubuntu@default-kubernetes-cluster:~$ kubectl get pods
NAME READY STATUS RESTARTS AGE
postgres-7bfcbc4f85-dfd29 1/1 Running 0 6d7h
guacamole-5bdfd984c6-p7zh8 1/1 Running 0 6d7h
kypo-redis-76854b59f6-99gjm 1/1 Running 0 6d7h
angular-frontend-64b6fbbbfd-5kzrl 1/1 Running 0 6d7h
guacd-56b6cdd9f8-gwkm9 1/1 Running 0 6d7h
kypo-syslog-ng-88ddbcd69-w88gx 1/1 Running 0 6d7h
mitre-service-55ff5578b6-qlc88 1/1 Running 0 6d7h
oidc-issuer-ldap-867758c7bb-2t6z5 1/1 Running 0 6d7h
answers-storage-5b4db578ff-96fh2 1/1 Running 0 6d7h
kypo-logstash-7b75dc8d4f-m94vv 1/1 Running 0 6d7h
smart-assistant-688b8b4c75-hfqfg 1/1 Running 0 6d7h
uag-service-5b4dbc95ff-glg6t 1/1 Running 0 6d7h
sandbox-service-worker-ansible-5cd8b97694-pg7gr 1/1 Running 0 6d7h
sandbox-service-worker-openstack-6457799f98-275q2 1/1 Running 0 6d7h
sandbox-service-worker-default-864c85b46c-h6lrf 1/1 Running 0 6d7h
sandbox-service-worker-default-864c85b46c-dwjkc 1/1 Running 0 6d7h
sandbox-service-worker-openstack-6457799f98-zmx5z 1/1 Running 0 6d7h
sandbox-service-worker-ansible-5cd8b97694-8rvww 1/1 Running 0 6d7h
training-feedback-service-84c547d664-w4hjd 1/1 Running 0 6d7h
adaptive-training-service-59964c9778-v2gtk 1/1 Running 0 6d7h
kypo-elasticsearch-5c894f9b65-fw4q6 1/1 Running 0 6d7h
sandbox-service-7cf4b8d7db-76s5n 1/1 Running 0 6d7h
training-service-6699b78459-mvftz 1/1 Running 0 6d7h
elasticsearch-service-7db4866fb6-bt5vt 1/1 Running 0 6d7h
oidc-issuer-app-fc9ff8856-db6jq 1/1 Running 0 6d7h
git-internal-c959ccff5-c9xgq
OpenStack 准备
在部署 KYPO-CRP 之前,您需要在 OpenStack 环境中配置多个设置。这包括为 KYPO 创建应用程序凭证,并设置所需的 flavor 以确保可以正确配置虚拟机 (VM)。
为 KYPO-CRP 创建 OpenStack 应用程序凭证
步骤 1:以管理员身份登录 OpenStack-YOGA horizon 仪表板,在 Identity -> Application Credential 下创建凭证,如下所示:

Figure-02: 创建 OpenStack 应用程序凭证,版本 v_0.1.3 (2025)
对于凭证角色,选择所有 4 个角色:admin、user、member、reader,并选中 Unrestricted 复选框。
步骤 2:下载 app-cred-xxx-open-rc.sh 和 clouds.yaml 文件(如 file/app-cred-kypotest7-openrc.sh 和 files/clouds.yaml 中所示)
app-cred-kypotest7-openrc.sh 示例:
#!/usr/bin/env bash
export OS_AUTH_TYPE=v3applicationcredential
export OS_AUTH_URL=http://controller2:5000/v3/
export OS_IDENTITY_API_VERSION=3
export OS_REGION_NAME="RegionOne"
export OS_INTERFACE=public
export OS_APPLICATION_CREDENTIAL_ID=9cd30053e56d4981806e83f08c2cb831
export OS_APPLICATION_CREDENTIAL_SECRET=kypotest7
clouds.yaml 示例:
clouds:
openstack:
auth:
auth_url: http://controller2:5000/v3/
application_credential_id: "9cd30053e56d4981806e83f08c2cb831"
application_credential_secret: "kypotest7"
region_name: "RegionOne"
interface: "public"
identity_api_version: 3
auth_type: "v3applicationcredential"
您还可以使用以下命令在 OpenStack 控制器节点中创建应用程序凭证:
openstack application credential create --secret "kypotest7" --description "2nd Kypo installation" --role admin --role user --role reader --role member kypotest7
配置所需的 OpenStack Flavor
确保您的 OpenStack 环境中提供以下 VM flavor。这些 flavor 在 KYPO-CRP 部署期间用于分配计算资源:
| Flavor | VCPUs | Disk (GB) | RAM (MB) |
|---|---|---|---|
| csirtmu.tiny1x2 | 1 | 20 | 1024 |
| standard.tiny | 1 | 1 | 512 |
| standard.small | 1 | 20 | 2048 |
| standard.medium | 2 | 40 | 4096 |
| standard.large | 8 | 80 | 8192 |
注意:这些 flavor 名称必须与 KYPO 的 Terraform 脚本中引用的名称完全匹配,并且对于
standard.xlarge最好使用 16 个 vCPU 和 32GB 内存,否则根据我的测试,如果您使用 8vCPU 和 16GB 内存,部署很可能会挂起或失败。另一个非常重要的事情是,如果您的部署进度失败并且您想从头开始重新部署,您需要进行以下清理设置,否则重新部署很可能会再次失败:
如果您需要从 OpenStack 中清除/删除所有 KYPO 实例,则需要删除以下参数:
清除名称为“
-kypo”的密钥对,例如(AdminKypo或kypo-kypo)释放 KYPO 使用的 2 个 OpenStack 浮动 IP 地址。
删除
kypo-public路由器。删除所有
kypo-instance:[删除所有default-p000000000-*]删除
kypo-base网络:[如果出现删除错误,请清理网络的端口、子网,然后再次删除]清除所有 KYPO 创建的安全组。
删除“provider”网络下的“sandbox”子网。
OpenStack 基础资源部署
本节遵循 KYPO GitLab 存储库中的官方部署指南:🔗 BASE.md 部署说明
预配置安装文件
步骤 1:克隆 KYPO CRP 部署存储库
SSH 进入您的一个 OpenStack 控制器节点,并克隆官方 KYPO CRP 部署脚本 (v1.1.4):
git clone -b v1.1.4 https://gitlab.ics.muni.cz/muni-kypo-crp/devops/kypo-crp-tf-deployment.git步骤 2:将凭据文件复制到控制器
复制先前生成的
app-credxxx-open-rc.sh和clouds.yaml,scpOpenStack 控制器节点,将clouds.yaml文件放在tf-head-services和tf-openstac-base文件夹下,如下所示:kypo@controller2:~/kypoInstall/kypo-crp-tf-deployment/tf-head-services$ ls
clouds.yaml kypo.tf provider.tf README.md terraform.tfstate terraform.tfstate.backup tfvars values.yaml variables.tf步骤 3:更新 Terraform Provider 文件
修改
tf-openstack-base/provider.tf文件,通过在文件中附加以下 3 行来定义 OpenStack provider。provider "openstack" {
cloud = "openstack"
}步骤 4:更新基本变量
使用以下参数编辑
tf-openstack-base/tfvars/vars-base.tfvars:deploy_flavors = false
deploy_kubernetes_cluster = true
kypo_kubernetes_cluster_flavor_name = "standard.xlarge"
kypo_proxy_flavor_name = "standard.medium"注意:当我按照 Kypo-Crp 官方网站使用
vars-all.tfvars时,KYPO-k8s 集群uag-service容器在部署期间很可能会崩溃。步骤 5:安装 Terraform
sudo apt install snapd
sudo snap install terraform --classic部署 OpenStack 基础资源
步骤 1:加载应用程序凭据
通过 sourcing 脚本激活 Terraform 的 OpenStack 应用程序凭据:
source /path/to/app-cred--openrc.sh步骤 2:配置外部网络
复制并修改部署变量文件:
cd tf-openstack-base
cp tfvars/deployment.tfvars-template tfvars/deployment.tfvars确定您的外部 OpenStack 网络:
openstack network list --external --column Name
+----------+
| Name |
+----------+
| provider |
+----------+将字符串
provider添加到deployment.tfvars中的external_network_name参数,如下所示:external_network_name = "provider"步骤 3:运行 Terraform 部署
初始化并应用 Terraform 配置(建议在 sudo 下运行并添加 auto-approve):
sudo terraform init
terraform apply --auto-approve -var-file tfvars/deployment.tfvars -var-file tfvars/vars-base.tfvars步骤 4:记录输出信息
成功部署后,Terraform 将输出关键的 Kubernetes 和代理配置数据。保存此信息以供下一步部署使用:
cluster_ip = "192.168.200.207"
kubernetes_client_certificate = "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0t...="
kubernetes_client_key = "LS0tLS1CRUdJTiBFQyBQUklWQVRFIEtFWS0tLS0..."
proxy_host = "192.168.200.216"
proxy_key = "LS0tLS1CRUdJTiBFQyBQUklWQVRFIEtFWS0tLS..."步骤 5:验证连接
检查所需的端口(例如,SSH、HTTP、HTTPS)是否在 Kubernetes 集群 IP 上打开:
yuancheng@kcontroller1:~/kypoInstall/kypo-crp-tf-deployment/tf-openstack-base$ nmap -F 192.168.200.207
Starting Nmap 7.80 ( https://nmap.org ) at 2023-02-02 06:41 UTC
Nmap scan report for 192.168.200.207
Host is up (0.00018s latency).
Not shown: 95 filtered ports
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
443/tcp open https
515/tcp closed printer
8443/tcp closed https-alt重要提示:所有 5 个端口都必须打开,否则表示 K8s 集群中的某些 pod 出现问题,并且大多数情况下是 traefik 路由器初始化失败的问题。如果您登录到 KYPO 控制器节点并列出进程,则正常情况如下:
Figure-03: Normal KYPO K8s process list, version v_0.1.3 (2025)如果 traefik 没有启动,则表示部署已失败(如下所示)
Figure-04: Exception KYPO K8s process list, version v_0.1.3 (2025)要解决此问题,您需要在文件
deployment.tfvars中更改版本,以下 2 行的版本是正确的:kypo_crp_head_version = "1.1.1"
kypo_postgres_version = "1.0.0"我们可以看到,在 KYPO 仓库提交版本
4b3b918中,他们也进行了降级以修复此错误:
部署 KYPO-CRP Helm 应用程序
在 OpenStack 基础架构准备就绪后,下一个阶段是使用 Helm 部署 KYPO 网络靶场平台 (CRP) 应用程序。
步骤 1:配置部署变量
导航到
tf-head-services目录,该目录包含用于部署 KYPO CRP 组件的 Terraform 配置文件:cd tf-head-services
cp tfvars/deployment.tfvars-template tfvars/deployment.tfvars编辑
tfvars/deployment.tfvars文件,并使用从先前的基础架构设置步骤中捕获的值填充它。以下是示例配置:acme_contact = "[email protected]" application_credential_id = "9cd30053e56d4981806e83f08c2cb831" application_credential_secret = "kypotest7" gen_user_count = "100" git_config = { type = "INTERNAL" server = "git-internal.kypo" sshPort = 22 restServerUrl = "http://git-internal.kypo:5000/" user = "git" privateKey = "" accessToken = "no-gitlab-token" ansibleNetworkingUrl = "[email protected]:/repos/backend-python/ansible-networking-stage/kypo-ansible-stage-one.git" ansibleNetworkingRev = "v1.0.10" } guacamole_admin_password = "password" guacamole_user_password = "password" head_host = "192.168.200.207" head_ip = "192.168.200.207" kubernetes_host = "192.168.200.207" kubernetes_client_certificate = "" kubernetes_client_key = "" kypo_crp_head_version = "1.1.1" kypo_postgres_version = "1.0.0" os_auth_url = "http://10.0.6.4:5000/v3/" oidc_providers = [ { url = "https://192.168.200.207:443/csirtmu-dummy-issuer-server/" logoutUrl = "https://192.168.200.207:443/csirtmu-dummy-issuer-server/endsession" clientId = "bFkibCmIhdoJJjExCZzuKSeOfDdjYkJETIjn" label = "Login with local issuer" issuerIdentifier = "" userInfoUrl = "" responseType = "" } ] proxy_host = "192.168.200.216" proxy_key = "" users = { "kypo-admin" = { iss = "https://192.168.200.207:443/csirtmu-dummy-issuer-server/" password = "password" email = "[email protected]" fullName = "Demo Admin" givenName = "Demo" familyName = "Admin" admin = true } }重要提示:对于
gen_user_count,请设置为较大的数字,例如 300,否则您需要转到 K8s pod 以在部署完成后添加更多新用户。稍后我将展示如何添加新用户。步骤 2:使用 Terraform 部署 KYPO CRP
配置好
deployment.tfvars文件后,初始化 Terraform 并应用配置以安装 KYPO CRP Helm 应用程序:terraform apply --auto-approve -var-file=tfvars/deployment.tfvars备注:如果要开始全新的部署,请删除
terraform.tfstate文件。如果没有发生错误,安装过程将花费大约 9 - 13 分钟。
module.kypo_crp.helm_release.kypo_crp_head: Still creating... [11m20s elapsed]
module.kypo_crp.helm_release.kypo_crp_head: Still creating... [11m30s elapsed]
module.kypo_crp.helm_release.kypo_crp_head: Creation complete after 11m34s [id=kypo-crp-head]
Apply complete! Resources: 6 added, 0 changed, 0 destroyed.如果您发现安装花费超过半小时,则很可能部署失败,根据我的测试,有时会超时,有时会挂在那里。
步骤 3:测试访问 Kypo 仪表板并登录
通过 url
https://访问 KYPO 仪表板,如果出现以下仪表板,则表示 KYPO K8s 集群已成功部署,如下所示。使用我们刚刚配置的管理员用户登录。
但是,当您登录以创建沙箱时,它将失败,您需要更改一些 K8s 设置,然后才能开始使用。
更改 Kypo-Kubernetes 集群配置
如果在安装后无法使用管理员成功创建沙箱。为了解决这个问题,需要在 KYPO Kubernetes 集群环境中进行手动调整。以下步骤详细说明了如何配置集群以解决该问题。
步骤 1:准备 Kypo K8s 公钥以登录 Kypo K8s 节点
访问:https://www.base64decode.org/ 并覆盖
deployment.tfvars中的 proxy_key 字符串proxy_key = "LS0tLS1CRUdJTiBFQyB..."到密钥文件,并将内容保存在key.pem中步骤 2:登录到 KYPO Kubernetes 节点
将
key.pemscp 到 OpenStack 控制器节点,并使用密钥 ssh 到 k8s 集群 vm。chmod 0600 key.pem
ssh [email protected] -i key.pem步骤 3:配置主机别名以解决 DNS 解析问题
如果 OpenStack 环境缺少 DNS 名称解析,请手动编辑 KYPO 部署文件以使用
hostAliases。依次运行以下命令:sudo kubectl edit deployment sandbox-service -n kypo
sudo kubectl edit deployment sandbox-service-worker-ansible -n kypo
sudo kubectl edit deployment sandbox-service-worker-openstack -n kypo
sudo kubectl edit deployment oidc-issuer-ldap -n kypo
sudo kubectl edit deployment sandbox-service-worker-default -n kypo对于每个部署,在容器配置后,在
specs.template.specs下添加以下内容:... - mountPath: /root/.ssh/kypo-crp-proxy-key name: kypo-crp-proxy-key subPath: kypo-crp-proxy-key - mountPath: /var/opt/kypo/kypo-ansible-runner-volumes name: ansible-runner-vol - mountPath: /root/.ssh/git-ssh-key name: git-ssh-key subPath: git-ssh-key dnsPolicy: ClusterFirst # Add the below host aliases part: hostAliases: - hostnames: - controller2 ip: 10.0.6.4 # ------------------------------- restartPolicy: Always schedulerName: default-scheduler securityContext: {} ...步骤 4:修复 Git Clone Bug (libguac install)
The Kypo-Crp 有一个通过 apt install 安装 lib "guacamole guacd" 的 bug。在 v1.0.10 分支之后,他们修复了这个 bug。登录 kypo-k8s 集群并编辑内部 git pod:
spec: template: spec: containers: - name: git-internal-ssh lifecycle: postStart: exec: command: - sh - -c - | mkdir -p /assets/keys ssh-keygen -y -f /tmp/keys/git-ssh-key > /assets/keys/git-ssh-key.pub cat /assets/keys/git-ssh-key.pub > /home/git/.ssh/authorized_keys git clone -q --bare https://gitlab.ics.muni.cz/muni-kypo-crp/prototypes-and-examples/sandbox-definitions/small-sandbox.git /repos/prototypes-and-examples/sandbox-definitions/small-sandbox.git git clone -q --bare https://gitlab.ics.muni.cz/muni-kypo-crp/prototypes-and-examples/sandbox-definitions/kypo-crp-demo-training.git /repos/prototypes-and-examples/sandbox-definitions/kypo-crp-demo-training.git git clone -q --bare https://gitlab.ics.muni.cz/muni-kypo-crp/prototypes-and-examples/sandbox-definitions/kypo-crp-demo-training-adaptive.git /repos/prototypes-and-examples/sandbox-definitions/kypo-crp-demo-training-adaptive.git # Add the branch version as shown below: git clone -b v1.0.10 -q --bare https://gitlab.ics.muni.cz/muni-kypo-crp/backend-python /ansible-networking-stage/kypo-ansible-stage-one.git /repos/backend-python/ansible-networking-stage/kypo-ansible-stage-one.git ...步骤 5:测试沙箱定义和池分配
现在您可以登录 KYPO-dashboard,通过使用以下 git 定义一个测试沙箱来进行测试:
URL: [email protected]:/repos/prototypes-and-examples/sandbox-definitions/kypo-crp-hack-training-linear.git
Revision: master然后创建一个沙箱池并分配一个沙箱来检查 kypo 是否工作:
如果所有 3 个阶段都通过且没有错误(如上图所示),则表示所有配置都正常工作,并且 OpenStack 上的 KYPO 部署成功。
在 KYPO-CRP 中添加多个新用户
如果要添加更多新用户,您需要使用密钥文件登录到 KYPO K8s 节点,如前面的部分所示:
ssh [email protected] -i key.pem然后使用 KYPO 用户 API,如部署部分所示,端口 8084 未对外开放,因此只能在 K8s 节点内部完成。
https://localhost:8084/kypo-rest-user-and-group/api/v1/users创建一个简单的
users.json文件,其中包含要添加的新用户:{ "users": [ { "sub": "[email protected]", "iss": "https://192.168.200.207:443/csirtmu-dummy-issuer-server/", "full_name": "user301", "given_name": "", "family_name": "" }, { "sub": "[email protected]", "iss": "https://192.168.200.207:443/csirtmu-dummy-issuer-server/", "full_name": "user302", "given_name": "", "family_name": "" }... ], "groupName": "group1" }登录用户名需要是 sub 电子邮件名称。然后使用 curl 发布新用户信息:
curl -X POST "http://localhost:8084/kypo-rest-user-and-group/api/v1/users" -H "accept: application/json" -H "Content-Type: application/json" -d "{ \"users\": [ { \"sub\": \"[email protected]\", \"iss\": \"https://192.168.200.207:443/csirtmu-dummy-issuer-server/\", \"full_name\": \"user301\", \"given_name\": \"\", \"family_name\": \"\" }, { \"sub\": \"[email protected]\", \"iss\": \"https://192.168.200.207:443/csirtmu-dummy-issuer-server/\", \"full_name\": \"user302\", \"given_name\": \"\", \"family_name\": \"\" } ], \"groupName\": \"group1\"}"如果要创建 100 个用户,请在该节点上创建一个简单的 python 程序并运行:
import requests import json url = "https://localhost:8084/kypo-rest-user-and-group/api/v1/users" data = json.load(users.json) response = requests.post(url, json=data) # Sends JSON in the body print(response.status_code) print(response.json())添加用户后,转到 web 下载用户信息,或使用 curl GET 获取具有 ID 的用户信息,假设已经有 300 个用户,那么如果我再添加一个用户 user-301,则新用户的 ID 为 301。
curl -X GET "http://localhost:8084/kypo-rest-user-and-group/api/v1/users/301" -H "accept: application/json"然后我们可以从响应数据中获取系统生成的密码
{ "content": [ { "sub": "[email protected]", "iss": "https://192.168.200.207:443/csirtmu-dummy-issuer-server/", "fullName": "John Doe", "mail": "[email protected]", "givenName": "", "familyName": "", "password": "ZLUyJJ62ej" "roles": [ { "idOfMicroservice": 5, "nameOfMicroservice": "kypo-training", "description": "This role will allow you to create and delete groups.", "role_type": "ROLE_USER", "id": 301 } ], } ], }现在您可以开始使用 KYPO 创建沙箱进行测试。
参考链接
https://gitlab.ics.muni.cz/muni-kypo-crp/devops/kypo-crp-tf-deployment
https://docs.crp.kypo.muni.cz/reference/kypo-user-and-group-swagger-open-api/
感谢您花时间查看文章详情,如果您有任何问题和建议或发现任何程序错误,请随时给我留言。非常感谢您能提供一些评论并分享任何改进建议,以便我们能够把工作做得更好~
上次编辑者:LiuYuancheng([email protected]) 于 19/07/2025,如果您有任何问题或发现任何错误,请给我留言 。





No comment for this article.