第一階段 — 建置
第一階段負責部署並驗證完整的 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 負載平衡器”建立兩個啟用用戶端防護(Client-Side Defense)的負載平衡器 — 一個 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 建立新 LB(HTTPS LB 不存在)
Section titled “路徑 B:透過 POST 建立新 LB(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 路徑因 DNS 從基本設定持續存在,可能已為 READY |
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 區域並建立受管理記錄。若重新套用後 60 秒內 A 記錄仍未解析,請停止作業並回報給操作人員 — 重新套用操作不應執行超過一次。
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 已啟用”確認租戶層級的用戶端防護(Client-Side Defense)已啟用。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> 標籤,負載平衡器會將其注入頁面回應中。
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 Epoch 後的秒數)指定時間範圍。以下範例查詢過去 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 記錄目前狀態並繼續進行 — 這些項目僅供參考,不阻斷示範進度。
第一階段完成。 請繼續前往第二階段 — 攻擊執行攻擊模擬。