跳转到内容

第一阶段 — 构建

第一阶段负责部署并验证完整的 CSD 基础设施。请按顺序完成所有步骤 — 每个步骤必须通过(PASS)后方可继续。在执行这些命令之前,请返回索引页完成环境设置和变量解析。

步骤 0:检查并创建命名空间(条件性)

Section titled “步骤 0:检查并创建命名空间(条件性)”

检查目标命名空间是否已存在于租户中。如果不存在,则创建它。在 NAMESPACE_CREATED Shell 变量中记录结果 — 第四阶段拆除时将使用此变量决定是否删除命名空间。

Terminal window
NS_CHECK=$(curl -s -o /dev/null -w '%\{http_code\}' \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/web/namespaces/xF5XC_NAMESPACEx")
NAMESPACE_CREATED="false"
if [ "$NS_CHECK" = "404" ]; then
curl -s -X POST \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
-H "Content-Type: application/json" \
-d '{"metadata": {"name": "xF5XC_NAMESPACEx"}, "spec": {}}' \
"xF5XC_API_URLx/api/web/namespaces" | jq .
NAMESPACE_CREATED="true"
fi

确认命名空间存在,并记录是否为新建:

Terminal window
curl -s -o /dev/null -w '%\{http_code\}' \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/web/namespaces/xF5XC_NAMESPACEx"
echo "NAMESPACE_CREATED=$NAMESPACE_CREATED"
字段预期值状态
HTTP 状态码200返回则为 PASS,返回 404 或其他则为 FAIL
NAMESPACE_CREATEDtrue(已创建)或 false(已存在)仅供参考 — 供第四阶段拆除使用

创建一个 HTTP 健康检查,供源池用于监控后端健康状态。

Terminal window
curl -s -X POST \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
-H "Content-Type: application/json" \
-d '{
"metadata": {
"name": "xF5XC_HC_NAMEx",
"namespace": "xF5XC_NAMESPACEx",
"labels": {},
"annotations": {},
"disable": false
},
"spec": {
"http_health_check": {
"use_origin_server_name": {},
"path": "/",
"use_http2": false,
"headers": {},
"request_headers_to_remove": [],
"expected_status_codes": ["200"]
},
"timeout": 3,
"interval": 15,
"jitter": 0,
"unhealthy_threshold": 1,
"healthy_threshold": 3,
"jitter_percent": 30
}
}' \
"xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/healthchecks" \
| jq .

返回 200 响应及创建的对象,即确认健康检查已创建。如果响应包含 "code": 8 且消息类似 "Object kind healthcheck has exhausted limits(150)",则租户已达到健康检查上限 — 跳至步骤 2 并省略健康检查引用。CSD 不依赖健康监控。

确认健康检查存在:

Terminal window
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/healthchecks/xF5XC_HC_NAMEx" \
| jq '{name: .metadata.name, namespace: .metadata.namespace, path: .spec.http_health_check.path, interval: .spec.interval}'
字段预期值状态
HTTP 状态码200 含对象返回则为 PASS,返回 404 则为 FAIL
nameF5XC_HC_NAME 一致PASS
path/PASS
步骤 1 已跳过(错误码 8,已达上限)PASS(健康检查对 CSD 为可选项)

创建一个指向后端服务器的源池。如果在步骤 1 中创建了健康检查,请包含 healthcheck 引用。如果步骤 1 已跳过,则使用空数组。

包含健康检查(步骤 1 成功):

Terminal window
curl -s -X POST \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
-H "Content-Type: application/json" \
-d '{
"metadata": {
"name": "xF5XC_ORIGIN_POOLx",
"namespace": "xF5XC_NAMESPACEx",
"labels": {},
"annotations": {},
"description": "Origin pool for CSD demo",
"disable": false
},
"spec": {
"origin_servers": [{
"public_ip": { "ip": "xF5XC_ORIGIN_IPx" },
"labels": {}
}],
"no_tls": {},
"port": xF5XC_ORIGIN_PORTx,
"same_as_endpoint_port": {},
"healthcheck": [{
"namespace": "xF5XC_NAMESPACEx",
"name": "xF5XC_HC_NAMEx",
"kind": "healthcheck"
}],
"loadbalancer_algorithm": "LB_OVERRIDE",
"endpoint_selection": "LOCAL_PREFERRED"
}
}' \
"xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/origin_pools" \
| jq .

不包含健康检查(步骤 1 已跳过):

Terminal window
curl -s -X POST \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
-H "Content-Type: application/json" \
-d '{
"metadata": {
"name": "xF5XC_ORIGIN_POOLx",
"namespace": "xF5XC_NAMESPACEx",
"labels": {},
"annotations": {},
"description": "Origin pool for CSD demo",
"disable": false
},
"spec": {
"origin_servers": [{
"public_ip": { "ip": "xF5XC_ORIGIN_IPx" },
"labels": {}
}],
"no_tls": {},
"port": xF5XC_ORIGIN_PORTx,
"same_as_endpoint_port": {},
"healthcheck": [],
"loadbalancer_algorithm": "LB_OVERRIDE",
"endpoint_selection": "LOCAL_PREFERRED"
}
}' \
"xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/origin_pools" \
| jq .

返回 200 响应即确认源池已创建。

如果您包含了健康检查引用,请确认其已正确关联:

Terminal window
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/origin_pools/xF5XC_ORIGIN_POOLx" \
| jq '.spec.healthcheck'

返回包含内容的数组即确认关联成功。如果步骤 1 已跳过,则返回空数组 [] 为预期结果;如果您有意关联健康检查但返回空数组,则表示健康检查未找到。

确认源池存在且配置正确:

Terminal window
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/origin_pools/xF5XC_ORIGIN_POOLx" \
| jq '{name: .metadata.name, origin_ip: .spec.origin_servers[0].public_ip.ip, port: .spec.port, healthcheck_count: (.spec.healthcheck | length)}'
字段预期值状态
HTTP 状态码200返回则为 PASS,返回 404 则为 FAIL
nameF5XC_ORIGIN_POOL 一致PASS
origin_ipF5XC_ORIGIN_IP 一致PASS
portF5XC_ORIGIN_PORT 一致PASS
healthcheck_count1(含健康检查)或 0(不含)两种情况均为 PASS

步骤 3:创建启用 CSD 的 HTTP 负载均衡器

Section titled “步骤 3:创建启用 CSD 的 HTTP 负载均衡器”

创建两个启用了客户端防御的负载均衡器 — 一个 HTTP LB(主要,端口 80)和一个 HTTPS LB(辅助,端口 443,自动证书管理)。HTTP LB 是所有演示流量的默认选项。HTTPS LB 依赖 Let’s Encrypt 证书颁发,在演示环境中可能会遇到速率限制。

这是演示的主要负载均衡器。它在端口 80 上使用 http 监听器,并使用 F5 XC 托管 DNS。不依赖 TLS 证书颁发,因此在 DNS 解析后即可立即就绪。

Terminal window
curl -s -X POST \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
-H "Content-Type: application/json" \
-d '{
"metadata": {
"name": "xF5XC_LB_NAMEx-http",
"namespace": "xF5XC_NAMESPACEx",
"labels": {},
"annotations": {},
"description": "HTTP LB with Client-Side Defense enabled (primary demo LB)",
"disable": false
},
"spec": {
"domains": ["xF5XC_DOMAINNAMEx"],
"http": {
"dns_volterra_managed": true,
"port": 80
},
"advertise_on_public_default_vip": {},
"default_route_pools": [{
"pool": {
"namespace": "xF5XC_NAMESPACEx",
"name": "xF5XC_ORIGIN_POOLx",
"kind": "origin_pool"
},
"weight": 1,
"priority": 1
}],
"client_side_defense": {
"policy": {
"js_insert_all_pages": {}
}
},
"disable_rate_limit": {},
"no_service_policies": {},
"round_robin": {},
"disable_waf": {},
"no_challenge": {},
"disable_bot_defense": {},
"disable_api_definition": {},
"disable_api_discovery": {},
"disable_ip_reputation": {},
"disable_malicious_user_detection": {},
"single_lb_app": {
"disable_discovery": {},
"disable_ddos_detection": {},
"disable_malicious_user_detection": {}
},
"disable_trust_client_ip_headers": {},
"user_id_client_ip": {},
"disable_threat_mesh": {},
"l7_ddos_action_default": {},
"system_default_timeouts": {},
"default_sensitive_data_policy": {},
"disable_malware_protection": {},
"disable_api_testing": {}
}
}' \
"xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers" \
| jq .

返回 200 响应即确认 HTTP 负载均衡器已创建并启用了 CSD。

这是辅助负载均衡器。它在端口 443 上使用 https_auto_cert,并自动进行 Let’s Encrypt 证书颁发。在创建之前,请检查之前拆除时是否遗留了骨架 HTTPS LB — 如果存在,请通过 PUT 恢复而非 POST 创建,以保留现有的 Let’s Encrypt 证书并避免触发速率限制(每组完全相同的标识符每 7 天最多颁发 5 个重复证书)。

检查 HTTPS LB 是否已存在:

Terminal window
HTTPS_CHECK=$(curl -s -o /dev/null -w '%\{http_code\}' \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-https")

如果 HTTPS_CHECK200,则存在骨架 HTTPS LB — 请使用路径 A(PUT)。如果为 404,则使用路径 B(POST)

路径 A:通过 PUT 恢复骨架(HTTPS LB 已存在)

Section titled “路径 A:通过 PUT 恢复骨架(HTTPS LB 已存在)”

当存在来自先前拆除的骨架 HTTPS LB 时,通过 PUT 恢复完整配置。这将重新挂载源池并重新启用 CSD,而不会触发新的 Let’s Encrypt 证书请求 — 现有证书保持有效。

Terminal window
curl -s -X PUT \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
-H "Content-Type: application/json" \
-d '{
"metadata": {
"name": "xF5XC_LB_NAMEx-https",
"namespace": "xF5XC_NAMESPACEx",
"labels": {},
"annotations": {},
"description": "HTTPS LB with Client-Side Defense enabled (secondary, cert-dependent)",
"disable": false
},
"spec": {
"domains": ["xF5XC_DOMAINNAMEx"],
"https_auto_cert": {
"http_redirect": false,
"add_hsts": false,
"port": 443,
"default_header": {},
"enable_path_normalize": {},
"no_mtls": {},
"default_loadbalancer": {}
},
"advertise_on_public_default_vip": {},
"default_route_pools": [{
"pool": {
"namespace": "xF5XC_NAMESPACEx",
"name": "xF5XC_ORIGIN_POOLx",
"kind": "origin_pool"
},
"weight": 1,
"priority": 1
}],
"client_side_defense": {
"policy": {
"js_insert_all_pages": {}
}
},
"disable_rate_limit": {},
"no_service_policies": {},
"round_robin": {},
"disable_waf": {},
"no_challenge": {},
"disable_bot_defense": {},
"disable_api_definition": {},
"disable_api_discovery": {},
"disable_ip_reputation": {},
"disable_malicious_user_detection": {},
"single_lb_app": {
"disable_discovery": {},
"disable_ddos_detection": {},
"disable_malicious_user_detection": {}
},
"disable_trust_client_ip_headers": {},
"user_id_client_ip": {},
"disable_threat_mesh": {},
"l7_ddos_action_default": {},
"system_default_timeouts": {},
"default_sensitive_data_policy": {},
"disable_malware_protection": {},
"disable_api_testing": {}
}
}' \
"xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-https" \
| jq .

返回 200 响应即确认骨架已恢复完整配置。证书状态应保持 CertificateValid — 不会触发新的 Let’s Encrypt 颁发流程。

路径 B:通过 POST 新建(HTTPS LB 不存在)

Section titled “路径 B:通过 POST 新建(HTTPS LB 不存在)”

当 HTTPS LB 不存在(首次运行或完整拆除后),通过 POST 创建。这将触发 Let’s Encrypt 证书颁发,可能需要 5–10 分钟。

Terminal window
curl -s -X POST \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
-H "Content-Type: application/json" \
-d '{
"metadata": {
"name": "xF5XC_LB_NAMEx-https",
"namespace": "xF5XC_NAMESPACEx",
"labels": {},
"annotations": {},
"description": "HTTPS LB with Client-Side Defense enabled (secondary, cert-dependent)",
"disable": false
},
"spec": {
"domains": ["xF5XC_DOMAINNAMEx"],
"https_auto_cert": {
"http_redirect": false,
"add_hsts": false,
"port": 443,
"default_header": {},
"enable_path_normalize": {},
"no_mtls": {},
"default_loadbalancer": {}
},
"advertise_on_public_default_vip": {},
"default_route_pools": [{
"pool": {
"namespace": "xF5XC_NAMESPACEx",
"name": "xF5XC_ORIGIN_POOLx",
"kind": "origin_pool"
},
"weight": 1,
"priority": 1
}],
"client_side_defense": {
"policy": {
"js_insert_all_pages": {}
}
},
"disable_rate_limit": {},
"no_service_policies": {},
"round_robin": {},
"disable_waf": {},
"no_challenge": {},
"disable_bot_defense": {},
"disable_api_definition": {},
"disable_api_discovery": {},
"disable_ip_reputation": {},
"disable_malicious_user_detection": {},
"single_lb_app": {
"disable_discovery": {},
"disable_ddos_detection": {},
"disable_malicious_user_detection": {}
},
"disable_trust_client_ip_headers": {},
"user_id_client_ip": {},
"disable_threat_mesh": {},
"l7_ddos_action_default": {},
"system_default_timeouts": {},
"default_sensitive_data_policy": {},
"disable_malware_protection": {},
"disable_api_testing": {}
}
}' \
"xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers" \
| jq .

返回 200 响应即确认 HTTPS 负载均衡器已创建。证书颁发将自动开始。

确认两个负载均衡器均已启用 CSD。证据收集务必使用 GET 请求 — POST 响应返回的是瞬态状态值,可能无法反映已稳定的配置。

HTTP LB(主要):

Terminal window
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-http" \
| jq '{name: .metadata.name, domains: .spec.domains, csd_enabled: (.spec.client_side_defense != null), state: .spec.state}'
字段预期值状态
HTTP 状态码200返回则为 PASS,返回 404 则为 FAIL
name${F5XC_LB_NAME}-httpPASS
domains包含 F5XC_DOMAINNAMEPASS
csd_enabledtruePASS — 此 LB 上已配置 CSD
stateVIRTUAL_HOST_READYVIRTUAL_HOST_PENDING_A_RECORD预期状态 — HTTP LB 在 DNS 解析后将转换为 READY。任何其他状态(如 VIRTUAL_HOST_FAILED)为 FAIL — 请上报给操作员并暂停操作

HTTPS LB(辅助):

Terminal window
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-https" \
| jq '{name: .metadata.name, domains: .spec.domains, csd_enabled: (.spec.client_side_defense != null), state: .spec.state, cert_state: .spec.cert_state}'
字段预期值状态
HTTP 状态码200返回则为 PASS,返回 404 则为 FAIL
name${F5XC_LB_NAME}-httpsPASS
domains包含 F5XC_DOMAINNAMEPASS
csd_enabledtruePASS — 此 LB 上已配置 CSD
creation_methodPUT(恢复骨架)或 POST(新建)仅供参考 — PUT 保留现有证书
stateVIRTUAL_HOST_READY(PUT)或 VIRTUAL_HOST_PENDING_A_RECORD(POST)预期状态 — PUT 路径可能已为 READY,因为 DNS 从骨架中保留
cert_stateCertificateValid(PUT)或 PreDomainChallengePending(POST)PUT 保留现有证书;POST 触发新颁发流程

创建负载均衡器后,它将进入 VIRTUAL_HOST_PENDING_A_RECORD 状态,自动证书保持 PreDomainChallengePending 状态。LB 完全运行前,必须存在以下两条 DNS 记录:

  1. A 记录xF5XC_DOMAINNAMEx 指向 VIP IP 地址(来自 LB 响应中的 dns_info
  2. ACME 验证记录_acme-challenge.xF5XC_DOMAINNAMEx,用于 TLS 证书验证(使用 F5 XC DNS 托管记录时自动管理;外部 DNS 需手动添加 CNAME)

具体操作取决于 F5 XC 是否为您的域名权威 DNS 提供商。

检查根域名的域名服务器:

Terminal window
dig +short NS xF5XC_ROOT_DOMAINx

如果响应包含 ns1.f5clouddns.comns2.f5clouddns.com,则 F5 XC 是权威 DNS 提供商 — 请遵循选项 A。否则,请遵循选项 B(外部 DNS)。

当 F5 XC 是权威 DNS 提供商时,平台可以自动创建 A 记录和 ACME 验证 CNAME — 但仅当 DNS 区域启用了 allow_http_lb_managed_records 时。

1. 检查是否已启用托管记录:

Terminal window
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/config/dns/namespaces/system/dns_zones/xF5XC_ROOT_DOMAINx" \
| jq '.spec.primary.allow_http_lb_managed_records'

如果响应为 true,则平台将为负载均衡器自动创建 DNS 记录 — 直接跳至3. 验证 DNS 解析。如果为 falsenull,请继续执行下一步。

2. 启用托管记录:

检索当前区域配置,启用托管记录,然后更新:

Terminal window
# Get current zone config
ZONE_CONFIG=$(curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/config/dns/namespaces/system/dns_zones/xF5XC_ROOT_DOMAINx")
# Update with managed records enabled
echo "$ZONE_CONFIG" \
| jq '.spec.primary.allow_http_lb_managed_records = true' \
| curl -s -X PUT \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
-H "Content-Type: application/json" \
-d @- \
"xF5XC_API_URLx/api/config/dns/namespaces/system/dns_zones/xF5XC_ROOT_DOMAINx" \
| jq .

返回 200 响应(空 \{\})即确认区域已更新。F5 XC 将在区域的自动管理记录组中创建 A 记录和 ACME 验证记录。如果托管记录在 60 秒内未出现,请重新应用负载均衡器以触发记录创建:

Terminal window
LB_CONFIG=$(curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-http")
echo "$LB_CONFIG" | curl -s -X PUT \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
-H "Content-Type: application/json" \
-d @- \
"xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-http" \
| jq .

此 GET+PUT 重新应用操作不会更改 LB 配置 — 它仅触发平台重新评估 DNS 区域并创建托管记录。如果 A 记录在重新应用后 60 秒内仍未解析,请停止操作并上报给操作员 — 重新应用操作不得超过一次。

3. 验证 DNS 解析:

Terminal window
dig +short xF5XC_DOMAINNAMEx A

响应应返回 VIP IP 地址。对于 F5 XC 托管区域,DNS 传播通常是即时的,但请预留最多 60 秒。

当您的域名使用外部 DNS 提供商时,必须手动创建记录。请从负载均衡器中提取所需值:

Terminal window
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-http" \
| jq '{
vip_ip: .spec.dns_info[0].ip_address,
acme_target: .spec.auto_cert_info.dns_records
}'

在您的 DNS 提供商处创建以下记录:

类型名称
AxF5XC_DOMAINNAMEx来自 dns_info[0].ip_address 的 VIP IP
CNAME_acme-challenge.xF5XC_DOMAINNAMEx*.autocerts.ves.volterra.io

创建记录后,验证解析:

Terminal window
dig +short xF5XC_DOMAINNAMEx A
dig +short _acme-challenge.xF5XC_DOMAINNAMEx CNAME
测试命令预期值状态
DNS-1:A 记录dig +short $F5XC_DOMAINNAME A返回 VIP IP 地址返回 IP 则为 PASS,为空则为 FAIL
DNS-2:ACME CNAMEdig +short _acme-challenge.$F5XC_DOMAINNAME CNAME*.autocerts.ves.volterra.io返回 CNAME 则为 PASS
DNS 权威dig +short NS $F5XC_ROOT_DOMAINF5 XC 或外部名称服务器仅供参考 — 决定选项 A 还是 B

如果 DNS-1 在 60 秒后仍返回空,请参阅故障排除 — LB 卡在 VIRTUAL_HOST_PENDING_A_RECORD

检查客户端防御是否已为租户启用。CSD 在租户级别配置 — 如果尚未启用,请联系您的 F5 XC 管理员。

Terminal window
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/status" \
| jq .

响应包含 "isConfigured": true"isEnabled": true 即确认 CSD 已激活。

Terminal window
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/status" \
| jq '{configured: .isConfigured, enabled: .isEnabled}'
字段预期值状态
configuredtruePASS
enabledtruePASS
任一为 falseFAIL — 请联系 F5 XC 管理员在租户级别启用 CSD

注册 CSD 将监控的根域名。protected_domain 字段必须是 eTLD+1 根域名(例如 f5demos.com),而非完整的 FQDN。

在创建之前,检查该域名是否已在租户上注册。对 POST 请求的 409 响应表示域名已存在 — 这是成功条件,而非错误。

Terminal window
curl -s -X POST \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
-H "Content-Type: application/json" \
-d '{
"metadata": {
"name": "xF5XC_DOMAINNAMEx",
"namespace": "xF5XC_NAMESPACEx"
},
"spec": {
"protected_domain": "xF5XC_ROOT_DOMAINx"
}
}' \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/protected_domains" \
| jq .
响应含义操作
200域名注册成功继续步骤 7
409(域名已存在)该域名之前已在此租户上注册已完成 — 继续步骤 7
"code": 8(已达上限)受保护域配额已满阻塞性问题 — 受保护域对 CSD 是必需的。请删除未使用的受保护域或联系管理员。

POST 响应本身即为主要证据 — 它返回已注册的域名对象,其中 spec.protected_domain 与您的根域名一致。也可列出所有受保护域以进行确认:

Terminal window
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/protected_domains" \
| jq '.items | length'
字段预期值状态
POST 返回 protected_domainF5XC_ROOT_DOMAIN 一致PASS
POST 返回 200409域名已注册或已存在PASS
列表条目数> 0PASS

确认 A 记录已解析,且 ACME 验证 CNAME 已就位:

Terminal window
dig +short xF5XC_DOMAINNAMEx A
dig +short _acme-challenge.xF5XC_DOMAINNAMEx CNAME

A 记录应返回 VIP IP 地址。CNAME 应指向 *.autocerts.ves.volterra.io(或相关的 autocerts 目标)。

检查两个负载均衡器是否已从挂起状态转换出来。HTTP LB 是主要检查项 — 它应在 DNS 解析后达到 VIRTUAL_HOST_READY 状态,无证书依赖。HTTPS LB 证书状态仅供参考。

HTTP LB(主要 — 必须为 READY 方可继续):

Terminal window
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-http" \
| jq '{state: .spec.state}'
字段预期值中间状态
stateVIRTUAL_HOST_READYVIRTUAL_HOST_PENDING_A_RECORD — DNS 未配置(参见步骤 4)

HTTPS LB(辅助 — 仅供参考,不阻塞流程推进):

Terminal window
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-https" \
| jq '{state: .spec.state, cert_state: .spec.cert_state}'
字段预期值中间状态
stateVIRTUAL_HOST_READYVIRTUAL_HOST_PENDING_A_RECORD — DNS 未配置;VIRTUAL_HOST_DNS_A_RECORD_ADDED — A 记录已找到,等待证书
cert_stateCertificateValidPreDomainChallengePending — 等待 ACME CNAME;DomainChallengeStarted — ACME 验证进行中;AutoCertDomainRateLimited — 触达 Let’s Encrypt 速率限制(在演示环境中为预期情况,不影响 HTTP LB)
Terminal window
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/js_configuration" \
| jq .

响应包含 scriptTag 字段,其中含有负载均衡器注入页面响应的完整 HTML <script> 标签。

Terminal window
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/detected_domains" \
| jq '{summary: .domain_summary, domains: .domains_list}'

脚本端点需要使用 epoch 时间戳(Unix 纪元以来的秒数)指定时间范围。以下示例查询最近 7 天的数据。

Terminal window
NOW=$(date +%s)
START=$(( NOW - 604800 ))
curl -s -X POST \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
-H "Content-Type: application/json" \
-d "{\"startTime\": \"$START\", \"endTime\": \"$NOW\"}" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/scripts" \
| jq '[.scripts[]? | {script_name: .script_name, risk_level: .risk_level}]'

表单字段端点需要以查询参数形式传入使用 epoch 时间戳的时间范围。

Terminal window
NOW=$(date +%s)
START=$(( NOW - 604800 ))
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/formFields?startTime=$START&endTime=$NOW" \
| jq '.form_fields'

完成所有验证检查后,AI 助手应呈现一个综合状态表:

测试 ID检查项预期值是否必需状态
DNS-1A 记录解析返回 VIP IPPASS / FAIL
DNS-2ACME CNAME 存在*.autocerts.ves.volterra.ioPASS / PENDING
LB-1HTTP LB 状态VIRTUAL_HOST_READYPASS / PENDING
LB-2HTTPS LB 状态VIRTUAL_HOST_READYPASS / PENDING / INFO
TLS-1证书状态CertificateValidPASS / PENDING / INFO
CSD-1JS 配置scriptTag 存在PASS / FAIL
CSD-2CSD 状态isEnabled: truePASS / FAIL
CSD-3受保护域域名已注册PASS / FAIL

如果 LB-1 显示 PENDING,请每 30 秒轮询一次,最多轮询 4 次(共 2 分钟)。如果 4 次轮询后 LB-1 仍未达到 VIRTUAL_HOST_READY,请使用 dig 检查 DNS 解析并上报给操作员 — 在 LB-1 达到 READY 之前不得继续操作。对于 LB-2 和 TLS-1,请每 60 秒轮询一次,最多轮询 10 次(共 10 分钟)。如果在 10 次轮询后仍处于中间状态,请将当前状态记录为 INFO 并继续 — 这些状态仅供参考,不阻塞演示流程推进。


第一阶段完成。 请前往第二阶段 — 攻击运行攻击模拟。