跳到內容

第一階段 — 建置

第一階段負責部署並驗證完整的 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 負載平衡器”

建立兩個啟用用戶端防護(Client-Side Defense)的負載平衡器 — 一個 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 建立新 LB(HTTPS LB 不存在)

Section titled “路徑 B:透過 POST 建立新 LB(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 路徑因 DNS 從基本設定持續存在,可能已為 READY
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 區域並建立受管理記錄。若重新套用後 60 秒內 A 記錄仍未解析,請停止作業並回報給操作人員 — 重新套用操作不應執行超過一次。

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_DOMAINNAMExdns_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

確認租戶層級的用戶端防護(Client-Side Defense)已啟用。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 Epoch 後的秒數)指定時間範圍。以下範例查詢過去 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 記錄目前狀態並繼續進行 — 這些項目僅供參考,不阻斷示範進度。


第一階段完成。 請繼續前往第二階段 — 攻擊執行攻擊模擬。