第一阶段 — 构建
第一阶段负责部署并验证完整的 CSD 基础设施。请按顺序完成所有步骤 — 每个步骤必须通过(PASS)后方可继续。在执行这些命令之前,请返回索引页完成环境设置和变量解析。
步骤 0:检查并创建命名空间(条件性)
Section titled “步骤 0:检查并创建命名空间(条件性)”检查目标命名空间是否已存在于租户中。如果不存在,则创建它。在 NAMESPACE_CREATED Shell 变量中记录结果 — 第四阶段拆除时将使用此变量决定是否删除命名空间。
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确认命名空间存在,并记录是否为新建:
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_CREATED | true(已创建)或 false(已存在) | 仅供参考 — 供第四阶段拆除使用 |
步骤 1:创建健康检查(可选)
Section titled “步骤 1:创建健康检查(可选)”创建一个 HTTP 健康检查,供源池用于监控后端健康状态。
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 不依赖健康监控。
确认健康检查存在:
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 |
name | 与 F5XC_HC_NAME 一致 | PASS |
path | / | PASS |
步骤 1 已跳过(错误码 8,已达上限) | — | PASS(健康检查对 CSD 为可选项) |
步骤 2:创建源池
Section titled “步骤 2:创建源池”创建一个指向后端服务器的源池。如果在步骤 1 中创建了健康检查,请包含 healthcheck 引用。如果步骤 1 已跳过,则使用空数组。
包含健康检查(步骤 1 成功):
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 已跳过):
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 响应即确认源池已创建。
验证健康检查是否已关联
Section titled “验证健康检查是否已关联”如果您包含了健康检查引用,请确认其已正确关联:
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 已跳过,则返回空数组 [] 为预期结果;如果您有意关联健康检查但返回空数组,则表示健康检查未找到。
确认源池存在且配置正确:
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 |
name | 与 F5XC_ORIGIN_POOL 一致 | PASS |
origin_ip | 与 F5XC_ORIGIN_IP 一致 | PASS |
port | 与 F5XC_ORIGIN_PORT 一致 | PASS |
healthcheck_count | 1(含健康检查)或 0(不含) | 两种情况均为 PASS |
步骤 3:创建启用 CSD 的 HTTP 负载均衡器
Section titled “步骤 3:创建启用 CSD 的 HTTP 负载均衡器”创建两个启用了客户端防御的负载均衡器 — 一个 HTTP LB(主要,端口 80)和一个 HTTPS LB(辅助,端口 443,自动证书管理)。HTTP LB 是所有演示流量的默认选项。HTTPS LB 依赖 Let’s Encrypt 证书颁发,在演示环境中可能会遇到速率限制。
HTTP 负载均衡器(主要)
Section titled “HTTP 负载均衡器(主要)”这是演示的主要负载均衡器。它在端口 80 上使用 http 监听器,并使用 F5 XC 托管 DNS。不依赖 TLS 证书颁发,因此在 DNS 解析后即可立即就绪。
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。
HTTPS 负载均衡器(辅助)
Section titled “HTTPS 负载均衡器(辅助)”这是辅助负载均衡器。它在端口 443 上使用 https_auto_cert,并自动进行 Let’s Encrypt 证书颁发。在创建之前,请检查之前拆除时是否遗留了骨架 HTTPS LB — 如果存在,请通过 PUT 恢复而非 POST 创建,以保留现有的 Let’s Encrypt 证书并避免触发速率限制(每组完全相同的标识符每 7 天最多颁发 5 个重复证书)。
检查 HTTPS LB 是否已存在:
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_CHECK 为 200,则存在骨架 HTTPS LB — 请使用路径 A(PUT)。如果为 404,则使用路径 B(POST)。
路径 A:通过 PUT 恢复骨架(HTTPS LB 已存在)
Section titled “路径 A:通过 PUT 恢复骨架(HTTPS LB 已存在)”当存在来自先前拆除的骨架 HTTPS LB 时,通过 PUT 恢复完整配置。这将重新挂载源池并重新启用 CSD,而不会触发新的 Let’s Encrypt 证书请求 — 现有证书保持有效。
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 分钟。
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(主要):
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}-http | PASS |
domains | 包含 F5XC_DOMAINNAME | PASS |
csd_enabled | true | PASS — 此 LB 上已配置 CSD |
state | VIRTUAL_HOST_READY 或 VIRTUAL_HOST_PENDING_A_RECORD | 预期状态 — HTTP LB 在 DNS 解析后将转换为 READY。任何其他状态(如 VIRTUAL_HOST_FAILED)为 FAIL — 请上报给操作员并暂停操作 |
HTTPS LB(辅助):
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}-https | PASS |
domains | 包含 F5XC_DOMAINNAME | PASS |
csd_enabled | true | PASS — 此 LB 上已配置 CSD |
creation_method | PUT(恢复骨架)或 POST(新建) | 仅供参考 — PUT 保留现有证书 |
state | VIRTUAL_HOST_READY(PUT)或 VIRTUAL_HOST_PENDING_A_RECORD(POST) | 预期状态 — PUT 路径可能已为 READY,因为 DNS 从骨架中保留 |
cert_state | CertificateValid(PUT)或 PreDomainChallengePending(POST) | PUT 保留现有证书;POST 触发新颁发流程 |
步骤 4:配置 DNS
Section titled “步骤 4:配置 DNS”创建负载均衡器后,它将进入 VIRTUAL_HOST_PENDING_A_RECORD 状态,自动证书保持 PreDomainChallengePending 状态。LB 完全运行前,必须存在以下两条 DNS 记录:
- A 记录 —
xF5XC_DOMAINNAMEx指向 VIP IP 地址(来自 LB 响应中的dns_info) - ACME 验证记录 —
_acme-challenge.xF5XC_DOMAINNAMEx,用于 TLS 证书验证(使用 F5 XC DNS 托管记录时自动管理;外部 DNS 需手动添加 CNAME)
具体操作取决于 F5 XC 是否为您的域名权威 DNS 提供商。
检测 DNS 权威
Section titled “检测 DNS 权威”检查根域名的域名服务器:
dig +short NS xF5XC_ROOT_DOMAINx如果响应包含 ns1.f5clouddns.com 和 ns2.f5clouddns.com,则 F5 XC 是权威 DNS 提供商 — 请遵循选项 A。否则,请遵循选项 B(外部 DNS)。
选项 A:F5 XC 托管 DNS
Section titled “选项 A:F5 XC 托管 DNS”当 F5 XC 是权威 DNS 提供商时,平台可以自动创建 A 记录和 ACME 验证 CNAME — 但仅当 DNS 区域启用了 allow_http_lb_managed_records 时。
1. 检查是否已启用托管记录:
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 解析。如果为 false 或 null,请继续执行下一步。
2. 启用托管记录:
检索当前区域配置,启用托管记录,然后更新:
# Get current zone configZONE_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 enabledecho "$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 秒内未出现,请重新应用负载均衡器以触发记录创建:
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 解析:
dig +short xF5XC_DOMAINNAMEx A响应应返回 VIP IP 地址。对于 F5 XC 托管区域,DNS 传播通常是即时的,但请预留最多 60 秒。
选项 B:外部 DNS 提供商
Section titled “选项 B:外部 DNS 提供商”当您的域名使用外部 DNS 提供商时,必须手动创建记录。请从负载均衡器中提取所需值:
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 提供商处创建以下记录:
| 类型 | 名称 | 值 |
|---|---|---|
| A | xF5XC_DOMAINNAMEx | 来自 dns_info[0].ip_address 的 VIP IP |
| CNAME | _acme-challenge.xF5XC_DOMAINNAMEx | *.autocerts.ves.volterra.io |
创建记录后,验证解析:
dig +short xF5XC_DOMAINNAMEx Adig +short _acme-challenge.xF5XC_DOMAINNAMEx CNAME| 测试 | 命令 | 预期值 | 状态 |
|---|---|---|---|
| DNS-1:A 记录 | dig +short $F5XC_DOMAINNAME A | 返回 VIP IP 地址 | 返回 IP 则为 PASS,为空则为 FAIL |
| DNS-2:ACME CNAME | dig +short _acme-challenge.$F5XC_DOMAINNAME CNAME | *.autocerts.ves.volterra.io | 返回 CNAME 则为 PASS |
| DNS 权威 | dig +short NS $F5XC_ROOT_DOMAIN | F5 XC 或外部名称服务器 | 仅供参考 — 决定选项 A 还是 B |
如果 DNS-1 在 60 秒后仍返回空,请参阅故障排除 — LB 卡在 VIRTUAL_HOST_PENDING_A_RECORD。
步骤 5:验证 CSD 已启用
Section titled “步骤 5:验证 CSD 已启用”检查客户端防御是否已为租户启用。CSD 在租户级别配置 — 如果尚未启用,请联系您的 F5 XC 管理员。
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/status" \ | jq .响应包含 "isConfigured": true 和 "isEnabled": true 即确认 CSD 已激活。
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/status" \ | jq '{configured: .isConfigured, enabled: .isEnabled}'| 字段 | 预期值 | 状态 |
|---|---|---|
configured | true | PASS |
enabled | true | PASS |
任一为 false | — | FAIL — 请联系 F5 XC 管理员在租户级别启用 CSD |
步骤 6:注册受保护域
Section titled “步骤 6:注册受保护域”注册 CSD 将监控的根域名。protected_domain 字段必须是 eTLD+1 根域名(例如 f5demos.com),而非完整的 FQDN。
检查是否已注册
Section titled “检查是否已注册”在创建之前,检查该域名是否已在租户上注册。对 POST 请求的 409 响应表示域名已存在 — 这是成功条件,而非错误。
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 与您的根域名一致。也可列出所有受保护域以进行确认:
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/protected_domains" \ | jq '.items | length'| 字段 | 预期值 | 状态 |
|---|---|---|
POST 返回 protected_domain | 与 F5XC_ROOT_DOMAIN 一致 | PASS |
POST 返回 200 或 409 | 域名已注册或已存在 | PASS |
| 列表条目数 | > 0 | PASS |
步骤 7:验证
Section titled “步骤 7:验证”DNS 解析
Section titled “DNS 解析”确认 A 记录已解析,且 ACME 验证 CNAME 已就位:
dig +short xF5XC_DOMAINNAMEx Adig +short _acme-challenge.xF5XC_DOMAINNAMEx CNAMEA 记录应返回 VIP IP 地址。CNAME 应指向 *.autocerts.ves.volterra.io(或相关的 autocerts 目标)。
负载均衡器状态
Section titled “负载均衡器状态”检查两个负载均衡器是否已从挂起状态转换出来。HTTP LB 是主要检查项 — 它应在 DNS 解析后达到 VIRTUAL_HOST_READY 状态,无证书依赖。HTTPS LB 证书状态仅供参考。
HTTP LB(主要 — 必须为 READY 方可继续):
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}'| 字段 | 预期值 | 中间状态 |
|---|---|---|
state | VIRTUAL_HOST_READY | VIRTUAL_HOST_PENDING_A_RECORD — DNS 未配置(参见步骤 4) |
HTTPS LB(辅助 — 仅供参考,不阻塞流程推进):
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}'| 字段 | 预期值 | 中间状态 |
|---|---|---|
state | VIRTUAL_HOST_READY | VIRTUAL_HOST_PENDING_A_RECORD — DNS 未配置;VIRTUAL_HOST_DNS_A_RECORD_ADDED — A 记录已找到,等待证书 |
cert_state | CertificateValid | PreDomainChallengePending — 等待 ACME CNAME;DomainChallengeStarted — ACME 验证进行中;AutoCertDomainRateLimited — 触达 Let’s Encrypt 速率限制(在演示环境中为预期情况,不影响 HTTP LB) |
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/js_configuration" \ | jq .响应包含 scriptTag 字段,其中含有负载均衡器注入页面响应的完整 HTML <script> 标签。
已检测到的域名
Section titled “已检测到的域名”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}'已检测到的脚本
Section titled “已检测到的脚本”脚本端点需要使用 epoch 时间戳(Unix 纪元以来的秒数)指定时间范围。以下示例查询最近 7 天的数据。
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 时间戳的时间范围。
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'第一阶段证据摘要
Section titled “第一阶段证据摘要”完成所有验证检查后,AI 助手应呈现一个综合状态表:
| 测试 ID | 检查项 | 预期值 | 是否必需 | 状态 |
|---|---|---|---|---|
| DNS-1 | A 记录解析 | 返回 VIP IP | 是 | PASS / FAIL |
| DNS-2 | ACME CNAME 存在 | *.autocerts.ves.volterra.io | 否 | PASS / PENDING |
| LB-1 | HTTP LB 状态 | VIRTUAL_HOST_READY | 是 | PASS / PENDING |
| LB-2 | HTTPS LB 状态 | VIRTUAL_HOST_READY | 否 | PASS / PENDING / INFO |
| TLS-1 | 证书状态 | CertificateValid | 否 | PASS / PENDING / INFO |
| CSD-1 | JS 配置 | scriptTag 存在 | 是 | PASS / FAIL |
| CSD-2 | CSD 状态 | isEnabled: true | 是 | PASS / 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 并继续 — 这些状态仅供参考,不阻塞演示流程推进。
第一阶段完成。 请前往第二阶段 — 攻击运行攻击模拟。