ข้ามไปยังเนื้อหา

การวินิจฉัยและการตรวจสอบ

หน้านี้จัดเตรียม เมทริกซ์การตรวจสอบ UAT แบบหลายชั้น สำหรับการตรวจสอบการปรับใช้การป้องกันฝั่งไคลเอนต์ของคุณแบบครบวงจร กรณีทดสอบแต่ละรายการจะดำเนินตามห่วงโซ่การพึ่งพาโครงสร้างพื้นฐาน — ตั้งแต่การแก้ไข DNS จนถึงการวัดผล CSD — เพื่อให้คุณสามารถพิสูจน์อย่างเป็นระบบว่าทุกส่วนประกอบทำงานได้อย่างถูกต้อง

คำสั่งเหล่านี้คือ API ที่เทียบเท่ากับ คู่มือการใช้งาน CSD คอนโซล — ใช้คำสั่งเหล่านี้เมื่อต้องการตรวจสอบจากเทอร์มินัล ทำการตรวจสอบอัตโนมัติ หรือสาธิตความสามารถ CSD โดยไม่ต้องใช้ UI

ตั้งค่าตัวแปรสภาพแวดล้อมของคุณตามที่อธิบายไว้ใน การทำงานอัตโนมัติของ API — การตั้งค่าสภาพแวดล้อม:

Terminal window
set -a && source .env && set +a

คำสั่งทั้งหมดด้านล่างใช้รูปแบบตัวแทน xTOKENx แทนที่ด้วยตัวแปรสภาพแวดล้อมของคุณ ($F5XC_API_TOKEN, $F5XC_NAMESPACE, ฯลฯ) หรือใช้แบบฟอร์มแบบโต้ตอบที่ด้านบนของหน้า

Endpoint ของ CSD หลายรายการต้องการ timestamp แบบ epoch (วินาทีนับจาก Unix epoch) คำสั่งบรรทัดเดียวเหล่านี้คำนวณเวลาเริ่มต้น/สิ้นสุดสำหรับช่วงเวลาทั่วไป

ข้ามแพลตฟอร์ม (macOS + Linux):

Terminal window
# เวลาปัจจุบันในรูปแบบ epoch seconds
NOW=$(date +%s)
# 1 ชั่วโมงที่แล้ว
START_1H=$(( NOW - 3600 ))
# 24 ชั่วโมงที่แล้ว
START_24H=$(( NOW - 86400 ))
# 7 วันที่แล้ว
START_7D=$(( NOW - 604800 ))
# 30 วันที่แล้ว
START_30D=$(( NOW - 2592000 ))
ค่าที่ตั้งไว้ล่วงหน้าวินาทีนิพจน์ Shell
1 ชั่วโมง3,600$(( $(date +%s) - 3600 ))
24 ชั่วโมง86,400$(( $(date +%s) - 86400 ))
7 วัน604,800$(( $(date +%s) - 604800 ))
30 วัน2,592,000$(( $(date +%s) - 2592000 ))

การทดสอบแต่ละรายการด้านล่างเป็นไปตามโครงสร้างนี้:

ฟิลด์คำอธิบาย
รหัสการทดสอบหมายเลขชั้น + รหัสลำดับ (เช่น DNS-1, TLS-2)
สิ่งที่พิสูจน์ข้อเท็จจริงด้านโครงสร้างพื้นฐานเฉพาะที่กำลังตรวจสอบ
คำสั่งคำสั่ง curl หรือ dig ที่พร้อมใช้งาน
ผ่าน / ล้มเหลวผลลัพธ์ที่คาดหวังสำหรับสถานะปกติและสถานะผิดปกติ
แก้ไขลิงก์ไปยังส่วนการตั้งค่าหรือการแก้ปัญหาที่เกี่ยวข้อง

DNS คือรากฐาน — หากโดเมนไม่สามารถแก้ไขเป็น VIP IP ของ load balancer ได้ สิ่งอื่นจะไม่ทำงาน

สิ่งที่พิสูจน์: โดเมนแก้ไขเป็น VIP IP address ของ load balancer

Terminal window
dig +short xF5XC_DOMAINNAMEx A
ผลลัพธ์ความหมาย
ผ่าน — VIP IP ที่คืนค่ามา (เช่น 72.19.3.185)โดเมนแก้ไขเป็น LB virtual IP
ล้มเหลว — การตอบสนองว่างเปล่าไม่ได้กำหนดค่า DNS A record

แก้ไข: การทำงานอัตโนมัติของ API — ขั้นตอนที่ 4: กำหนดค่า DNS

สิ่งที่พิสูจน์: ACME challenge record มีอยู่สำหรับการจัดเตรียมใบรับรอง TLS อัตโนมัติ

Terminal window
dig +short _acme-challenge.xF5XC_DOMAINNAMEx CNAME
dig +short _acme-challenge.xF5XC_DOMAINNAMEx TXT
ผลลัพธ์ความหมาย
ผ่าน — CNAME ไปยัง *.autocerts.ves.volterra.io. (external DNS)ACME challenge CNAME พร้อมใช้งาน
ผ่าน — TXT record ที่มีค่าโดเมน (F5 Distributed Cloud (F5 XC) managed DNS)ACME challenge ที่จัดการโดยแพลตฟอร์มผ่าน TXT record
ล้มเหลว — ทั้งคู่ว่างเปล่าไม่ได้กำหนดค่า ACME record; ใบรับรองจะอยู่ใน PreDomainChallengePending

แก้ไข: สำหรับ external DNS ให้สร้าง CNAME: _acme-challenge.xF5XC_DOMAINNAMEx*.autocerts.ves.volterra.io สำหรับ F5 XC managed DNS ให้เปิดใช้งาน allow_http_lb_managed_records บน DNS zone — ดู DNS-4 ดู การทำงานอัตโนมัติของ API — ขั้นตอนที่ 4

สิ่งที่พิสูจน์: ว่า F5 XC เป็น authoritative DNS provider สำหรับ root domain หรือไม่

Terminal window
dig +short NS xF5XC_ROOT_DOMAINx
ผลลัพธ์ความหมาย
รวม ns1.f5clouddns.com และ ns2.f5clouddns.comF5 XC managed DNS — สามารถสร้าง record ได้อัตโนมัติ
nameserver อื่นExternal DNS — ต้องสร้าง record ด้วยตนเอง

แก้ไข: การทำงานอัตโนมัติของ API — ตรวจจับอำนาจ DNS

สิ่งที่พิสูจน์: DNS zone ของ F5 XC อนุญาตให้สร้าง record อัตโนมัติสำหรับ load balancer (เฉพาะ F5 XC managed DNS)

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แพลตฟอร์มจะสร้าง A record และ ACME record สำหรับ LB อัตโนมัติ
ล้มเหลวfalse หรือ nullManaged records ถูกปิดใช้งาน; เปิดใช้งานผ่านการอัปเดต zone

แก้ไข: การทำงานอัตโนมัติของ API — ตัวเลือก A: F5 XC Managed DNS


หลังจาก DNS แก้ไขแล้ว load balancer ต้องมีใบรับรอง TLS ที่ถูกต้อง

สิ่งที่พิสูจน์: ใบรับรอง TLS อัตโนมัติได้รับการออกบน 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 '.spec.cert_state'
ผลลัพธ์ความหมาย
ผ่าน"CertificateValid" หรือ "AutoCertRenewing"ใบรับรองถูกต้องและใช้งานอยู่
เตือน"DomainChallengePending" หรือ "DomainChallengeStarted"ACME challenge กำลังดำเนินการ — รอ 5–10 นาที
ข้อมูล"AutoCertDomainRateLimited"ถึงขีดจำกัดอัตราของ Let’s Encrypt — คาดหวังในสภาพแวดล้อมสาธิต ไม่ส่งผลต่อ HTTP LB
ล้มเหลว"PreDomainChallengePending"ACME challenge record หายไป — ดู DNS-2

แก้ไข: ตรวจสอบให้แน่ใจว่า ACME challenge record พร้อมใช้งาน (CNAME สำหรับ external DNS หรือเปิดใช้งาน managed records สำหรับ F5 XC DNS) การจัดเตรียมใบรับรองใช้เวลา 5–10 นาที หลังจากกำหนดค่า record แล้ว หากค้างอยู่นานกว่า 15 นาที ดู ใบรับรองค้าง — การสร้างใหม่ทำความสะอาด หากถูกจำกัดอัตรา HTTP LB จะไม่ได้รับผลกระทบ

สิ่งที่พิสูจน์: ใบรับรองครอบคลุมโดเมนที่คาดหวังและแสดงข้อมูลการหมดอายุ ใช้ได้เฉพาะกับ 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 '{
cert_state: .spec.cert_state,
auto_cert_info: .spec.auto_cert_info
}'
ผลลัพธ์ความหมาย
ผ่านauto_cert_info มี dns_records และข้อมูลเมตาของใบรับรองรายละเอียดการจัดเตรียมใบรับรองพร้อมใช้งาน
ล้มเหลวauto_cert_info เป็น null หรือว่างเปล่าใบรับรองยังไม่ได้รับการจัดเตรียม

สิ่งที่พิสูจน์: ใบรับรอง TLS ถูกต้องและการ handshake เสร็จสมบูรณ์จากฝั่งไคลเอนต์ ใช้ได้เฉพาะเมื่อ HTTPS LB มีใบรับรองที่ถูกต้องเท่านั้น

Terminal window
curl -sv "https://xF5XC_DOMAINNAMEx/" 2>&1 \
| grep -E 'SSL connection|subject:|expire date:|issuer:'
ผลลัพธ์ความหมาย
ผ่าน — แสดง SSL connection using TLSv1.3, subject และวันหมดอายุที่ถูกต้องTLS แบบ end-to-end ทำงานได้
ล้มเหลว — ปฏิเสธการเชื่อมต่อหรือข้อผิดพลาดใบรับรองตรวจสอบการแก้ไข DNS และสถานะใบรับรอง; หากถูกจำกัดอัตรา ให้ใช้ HTTP แทน

สิ่งที่พิสูจน์: HTTPS load balancer รายงานเป้าหมาย ACME ที่ถูกต้องสำหรับการตรวจสอบใบรับรอง

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 '{
vip_ip: .spec.dns_info[0].ip_address,
acme_target: .spec.auto_cert_info.dns_records
}'
ผลลัพธ์ความหมาย
ผ่านvip_ip และ acme_target มีค่าสามารถตรวจสอบ DNS record กับค่าเหล่านี้ได้
ล้มเหลว — ค่า nullLB อาจไม่ได้กำหนดค่า https_auto_cert

Load balancer ต้องอยู่ในสถานะพร้อมใช้งานและกำหนดค่าอย่างถูกต้อง

สิ่งที่พิสูจน์: HTTP load balancer (หลัก) ทำงานได้อย่างสมบูรณ์และรับทราฟฟิกได้

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 '.spec.state'
ผลลัพธ์ความหมาย
ผ่าน"VIRTUAL_HOST_READY"LB ทำงานได้
ล้มเหลว"VIRTUAL_HOST_PENDING_A_RECORD"ไม่ได้กำหนดค่า DNS A record — ดู DNS-1

แก้ไข: LB ค้างใน VIRTUAL_HOST_PENDING_A_RECORD

สิ่งที่พิสูจน์: HTTP load balancer ถูกกำหนดค่าสำหรับโดเมนที่ถูกต้อง

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 '.spec.domains'
ผลลัพธ์ความหมาย
ผ่าน — array มี FQDN ของคุณ (เช่น ["app.example.com"])LB ถูกกำหนดค่าสำหรับโดเมนที่คาดหวัง
ล้มเหลว — โดเมนหายไปหรือผิดอัปเดต LB spec ด้วยโดเมนที่ถูกต้อง

สิ่งที่พิสูจน์: การป้องกันฝั่งไคลเอนต์เปิดใช้งานบน load balancer พร้อมนโยบายการฉีด JS ที่ถูกต้อง

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 '{
csd_enabled: (if .spec.client_side_defense then true else false end),
js_policy: .spec.client_side_defense.policy
}'
ผลลัพธ์ความหมาย
ผ่านcsd_enabled: true พร้อม js_insert_all_pages ในนโยบายCSD ทำงานอยู่พร้อมการฉีด JS ในทุกหน้า
ล้มเหลวcsd_enabled: falseไม่ได้กำหนดค่า CSD บน LB

แก้ไข: API Reference — เปิดใช้งาน CSD บน Load Balancer

สิ่งที่พิสูจน์: Load balancer อ้างอิง origin pool ที่ถูกต้องพร้อมน้ำหนักและลำดับความสำคัญที่คาดหวัง

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 '.spec.default_route_pools[] | {
pool: .pool.name,
namespace: .pool.namespace,
weight: .weight,
priority: .priority
}'
ผลลัพธ์ความหมาย
ผ่าน — แสดงชื่อ origin pool ของคุณพร้อม weight/priorityLB กำลังส่งทราฟฟิกไปยัง backend ที่ถูกต้อง
ล้มเหลว — pool ว่างเปล่าหรือผิดอัปเดตการกำหนดค่า default_route_pools ของ LB

สิ่งที่พิสูจน์: Load balancer ถูกปรับใช้และรายงานสภาพที่ดีในทุกไซต์

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,
dns_info: .spec.dns_info,
host_name: .spec.host_name
}'
ผลลัพธ์ความหมาย
ผ่านstate เป็น VIRTUAL_HOST_READY, dns_info มีค่าLB ปรับใช้อย่างสมบูรณ์พร้อม VIP ที่กำหนด
ล้มเหลว — สถานะรอดำเนินการหรือ dns_info ว่างเปล่าปัญหา DNS หรือใบรับรองที่บล็อกการปรับใช้

สิ่งที่พิสูจน์: สแนปชอตที่ครอบคลุมของการกำหนดค่า LB ทั้งสองสำหรับการดีบัก

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,
state: .spec.state,
domains: .spec.domains,
csd_enabled: (if .spec.client_side_defense then true else false end),
route_pools: [.spec.default_route_pools[] | .pool.name],
advertise: (if .spec.advertise_on_public_default_vip then "public_default_vip" else "custom" end)
}'

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,
state: .spec.state,
cert_state: .spec.cert_state,
domains: .spec.domains,
csd_enabled: (if .spec.client_side_defense then true else false end),
route_pools: [.spec.default_route_pools[] | .pool.name]
}'

Origin pool กำหนดเซิร์ฟเวอร์ backend ที่ load balancer ส่งทราฟฟิกไปให้

สิ่งที่พิสูจน์: Origin pool มีอยู่พร้อมเซิร์ฟเวอร์ backend ที่ถูกต้อง พอร์ต และ LB algorithm

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_servers: [.spec.origin_servers[] | {
ip: .public_ip.ip,
labels: .labels
}],
port: .spec.port,
lb_algorithm: .spec.loadbalancer_algorithm,
endpoint_selection: .spec.endpoint_selection
}'
ผลลัพธ์ความหมาย
ผ่าน — แสดง IP, พอร์ต และ algorithm ที่ถูกต้องOrigin pool กำหนดค่าอย่างถูกต้อง
ล้มเหลว404 หรือค่าผิดOrigin pool หายไปหรือกำหนดค่าผิดพลาด

แก้ไข: การทำงานอัตโนมัติของ API — ขั้นตอนที่ 2: สร้าง Origin Pool

สิ่งที่พิสูจน์: ว่า TLS ถูกกำหนดค่าสำหรับการเชื่อมต่อระหว่าง LB และเซิร์ฟเวอร์ต้นทางหรือไม่

Terminal window
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/origin_pools/xF5XC_ORIGIN_POOLx" \
| jq '{
tls_config: (if .spec.no_tls then "no_tls (plaintext)" elif .spec.use_tls then "use_tls (encrypted)" else "unknown" end)
}'
ผลลัพธ์ความหมาย
no_tls (plaintext)LB เชื่อมต่อกับ origin ผ่าน HTTP (คาดหวังสำหรับการสาธิต Juice Shop)
use_tls (encrypted)LB เชื่อมต่อกับ origin ผ่าน HTTPS

สิ่งที่พิสูจน์: Origin pool มี healthcheck ที่ถูกต้องเชื่อมโยงอยู่ (ถ้ามี)

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'
ผลลัพธ์ความหมาย
ผ่าน — array พร้อมการอ้างอิง healthcheck (name, namespace, kind)Healthcheck เชื่อมโยงแล้ว
ตกลง — array ว่างเปล่า []ไม่มี healthcheck (ยอมรับได้ — CSD ไม่ต้องการ)
ล้มเหลว — คาดหวัง healthcheck แต่ array ว่างเปล่าไม่พบ healthcheck ในเวลาที่สร้าง — ดู Healthcheck ไม่ถูกเชื่อมโยง

สิ่งที่พิสูจน์: เซิร์ฟเวอร์ต้นทางสามารถเข้าถึงได้จากฝั่งไคลเอนต์ (ไม่ทดสอบเส้นทาง LB-to-origin)

Terminal window
curl -s -o /dev/null -w '%{http_code}' \
"http://xF5XC_ORIGIN_IPx:xF5XC_ORIGIN_PORTx/"
ผลลัพธ์ความหมาย
ผ่าน200 (หรือรหัส HTTP ที่ถูกต้องอื่น)เซิร์ฟเวอร์ต้นทางกำลังตอบสนอง
ล้มเหลว000 หรือปฏิเสธการเชื่อมต่อเซิร์ฟเวอร์ต้นทางไม่สามารถเข้าถึงได้จากเครือข่ายนี้

Health check ตรวจสอบความพร้อมใช้งานของ backend ไม่จำเป็นสำหรับ CSD แต่มีประโยชน์สำหรับการปรับใช้ในสภาพแวดล้อมการผลิต

สิ่งที่พิสูจน์: healthcheck มีอยู่พร้อมประเภท เส้นทาง ช่วงเวลา และ threshold ที่ถูกต้อง

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,
type: (if .spec.http_health_check then "HTTP" elif .spec.tcp_health_check then "TCP" else "unknown" end),
path: .spec.http_health_check.path,
expected_status: .spec.http_health_check.expected_status_codes,
timeout: .spec.timeout,
interval: .spec.interval,
unhealthy_threshold: .spec.unhealthy_threshold,
healthy_threshold: .spec.healthy_threshold
}'
ผลลัพธ์ความหมาย
ผ่าน — แสดงประเภท HTTP พร้อมเส้นทาง / และ 200 ที่คาดหวังHealthcheck กำหนดค่าอย่างถูกต้อง
ล้มเหลว — การตอบสนอง 404Healthcheck ไม่มีอยู่ (อาจถูกข้ามไป — ดู Phase 1 ขั้นตอนที่ 1)

สิ่งที่พิสูจน์: แสดง healthcheck ทั้งหมดใน namespace เพื่อตรวจสอบการตั้งชื่อและจำนวน

Terminal window
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/healthchecks" \
| jq -r '
["NAME", "NAMESPACE", "DESCRIPTION"],
(.items[] | [
.name,
.namespace,
(.description | if length == 0 then "—" else . end)
])
| @tsv' | column -t

CSD ต้องเปิดใช้งานในระดับ tenant และมีการกำหนดค่า tag การฉีด JavaScript

สิ่งที่พิสูจน์: CSD ถูกกำหนดค่าและเปิดใช้งานสำหรับ tenant

Terminal window
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/status" \
| jq '{isConfigured, isEnabled}'
ผลลัพธ์ความหมาย
ผ่าน — ทั้งคู่เป็น trueCSD ทำงานอยู่สำหรับ tenant นี้
ล้มเหลวisConfigured: falseCSD ไม่ได้เปิดใช้งานในระดับ tenant — ติดต่อผู้ดูแลระบบ F5 XC
ล้มเหลวisEnabled: falseCSD ถูกกำหนดค่าแต่ไม่ได้ใช้งาน

สิ่งที่พิสูจน์: CSD JavaScript injection tag ถูกสร้างขึ้นและพร้อมสำหรับการฉีด

Terminal window
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/js_configuration" \
| jq '{has_script_tag: (.scriptTag | length > 0)}'
ผลลัพธ์ความหมาย
ผ่านhas_script_tag: trueJS injection tag ถูกกำหนดค่าแล้ว
ล้มเหลวhas_script_tag: falseไม่มี script tag — ตรวจสอบว่า CSD เปิดใช้งานอยู่และโดเมนที่ได้รับการป้องกันถูกลงทะเบียนแล้ว

สิ่งที่พิสูจน์: แสดง script tag แบบเต็มสำหรับการตรวจสอบหรือการฉีดด้วยตนเอง

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

สิ่งที่พิสูจน์: root domain ถูกลงทะเบียนเป็น CSD protected domain บน tenant

Terminal window
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/protected_domains" \
| jq '.items[] | {name, namespace, description}'
ผลลัพธ์ความหมาย
ผ่าน — แสดงรายการพร้อม name ที่ไม่ว่างเปล่าโดเมนได้รับการป้องกัน
ล้มเหลว — รายการมีฟิลด์ name และ namespace ว่างเปล่าไม่มีโดเมนที่ได้รับการป้องกันที่ลงทะเบียน — ดู Phase 1 ขั้นตอนที่ 6

สิ่งที่พิสูจน์: CSD JavaScript กำลังถูกฉีดเข้าไปในการตอบสนองของหน้าที่ให้บริการโดย load balancer จริง ๆ

Terminal window
curl -s "http://xF5XC_DOMAINNAMEx/" \
| grep -oE '(zeronaught|shape)\.com[^"]*' | head -1
ผลลัพธ์ความหมาย
ผ่าน — คืนค่า fragment URL ของ zeronaught.com หรือ shape.com (เช่น zeronaught.com/__imp_apg__/js/...)CSD JavaScript กำลังถูกฉีดเข้าไปในหน้า
ล้มเหลว — ผลลัพธ์ว่างเปล่าJS ไม่ถูกฉีด — ตรวจสอบ LB-3 และ CSD-1

ตรวจสอบว่าทราฟฟิกแบบสดกำลังไปถึง load balancer และถูกประมวลผลอย่างถูกต้อง

สิ่งที่พิสูจน์: ทราฟฟิกกำลังไปถึง load balancer ผลลัพธ์เป็นศูนย์หมายความว่าไม่มีทราฟฟิกมาถึง

Terminal window
curl -s -X POST \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
-H "Content-Type: application/json" \
-d '{
"start_time": "'"$(date -u -d '24 hours ago' +%Y-%m-%dT%H:%M:%SZ 2>/dev/null || date -u -v-24H +%Y-%m-%dT%H:%M:%SZ)"'",
"end_time": "'"$(date -u +%Y-%m-%dT%H:%M:%SZ)"'"
}' \
"xF5XC_API_URLx/api/data/namespaces/xF5XC_NAMESPACEx/access_logs/aggregation" \
| jq '{total_requests: .total_hits}'
ผลลัพธ์ความหมาย
ผ่านtotal_requests เป็น string ที่ไม่ใช่ศูนย์ (เช่น "380")ทราฟฟิกกำลังไหลผ่าน LB
ล้มเหลว"0" หรือไม่มีข้อมูลไม่มีทราฟฟิกถึง LB — ตรวจสอบ DNS-1 และ LB-1

สิ่งที่พิสูจน์: การแจกแจง response status code เผยให้เห็นรูปแบบข้อผิดพลาด

Terminal window
curl -s -X POST \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
-H "Content-Type: application/json" \
-d '{
"start_time": "'"$(date -u -d '24 hours ago' +%Y-%m-%dT%H:%M:%SZ 2>/dev/null || date -u -v-24H +%Y-%m-%dT%H:%M:%SZ)"'",
"end_time": "'"$(date -u +%Y-%m-%dT%H:%M:%SZ)"'",
"sort": "DESCENDING",
"limit": 100
}' \
"xF5XC_API_URLx/api/data/namespaces/xF5XC_NAMESPACEx/access_logs" \
| jq -r '
[.logs[] | fromjson | .rsp_code_class]
| group_by(.) | map({class: .[0], count: length})
| sort_by(-.count)
| ["STATUS_CLASS", "COUNT"], (.[] | [.class, .count])
| @tsv' | column -t

ผลลัพธ์ที่คาดหวังสำหรับไซต์ที่มีสุขภาพดี:

STATUS_CLASS COUNT
2xx 82
downstream_remote_disconnect 18
ผลลัพธ์ความหมาย
ผ่าน — ส่วนใหญ่เป็น 2xxไซต์กำลังให้บริการการตอบสนองที่สำเร็จ
เตือน — จำนวน 4xx สูงข้อผิดพลาดของไคลเอนต์ (URL ไม่ถูกต้อง ทรัพยากรหายไป)
ล้มเหลว — จำนวน 5xx สูงข้อผิดพลาดของเซิร์ฟเวอร์ — ตรวจสอบสุขภาพ origin server

คลาส downstream_remote_disconnect บ่งชี้ว่าไคลเอนต์ปิดการเชื่อมต่อก่อนที่การตอบสนองจะเสร็จสมบูรณ์ (พบบ่อยสำหรับคำขอ long-polling หรือ WebSocket upgrade)

สิ่งที่พิสูจน์: คำขอแต่ละรายการถูกบันทึกพร้อมฟิลด์ที่ถูกต้อง

Terminal window
curl -s -X POST \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
-H "Content-Type: application/json" \
-d '{
"start_time": "'"$(date -u -d '1 hour ago' +%Y-%m-%dT%H:%M:%SZ 2>/dev/null || date -u -v-1H +%Y-%m-%dT%H:%M:%SZ)"'",
"end_time": "'"$(date -u +%Y-%m-%dT%H:%M:%SZ)"'",
"sort": "DESCENDING",
"limit": 10
}' \
"xF5XC_API_URLx/api/data/namespaces/xF5XC_NAMESPACEx/access_logs" \
| jq -r '
["TIMESTAMP", "METHOD", "PATH", "STATUS", "SRC_IP"],
(.logs[] | fromjson | [.["@timestamp"], .method, .req_path, .rsp_code, .src_ip])
| @tsv' | column -t

สิ่งที่พิสูจน์: Access log ยืนยันว่า CSD JavaScript กำลังถูกฉีดเข้าไปในการตอบสนอง

Terminal window
curl -s -X POST \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
-H "Content-Type: application/json" \
-d '{
"start_time": "'"$(date -u -d '1 hour ago' +%Y-%m-%dT%H:%M:%SZ 2>/dev/null || date -u -v-1H +%Y-%m-%dT%H:%M:%SZ)"'",
"end_time": "'"$(date -u +%Y-%m-%dT%H:%M:%SZ)"'",
"sort": "DESCENDING",
"limit": 20
}' \
"xF5XC_API_URLx/api/data/namespaces/xF5XC_NAMESPACEx/access_logs" \
| jq '[.logs[] | fromjson | select(.csd_js_injection == "true")] | length as $injected |
{injected_count: $injected, total_sampled: 20}'
ผลลัพธ์ความหมาย
ผ่านinjected_count > 0CSD JS กำลังถูกฉีดเข้าไปในการตอบสนองของหน้า
ล้มเหลวinjected_count: 0JS ไม่ถูกฉีด — ตรวจสอบ CSD-1 และ LB-3

สิ่งที่พิสูจน์: คำขอที่สมบูรณ์ไหลจากไคลเอนต์ผ่าน DNS, LB และ origin และคืนค่าการตอบสนองที่ถูกต้อง

Terminal window
curl -sv "http://xF5XC_DOMAINNAMEx/" 2>&1 \
| grep -E 'Connected to|< HTTP|< content-type'
ผลลัพธ์ความหมาย
ผ่าน — แสดงการเชื่อมต่อ HTTP 200 และ content-typestack ทั้งหมดทำงานได้
ล้มเหลว — ปฏิเสธการเชื่อมต่อหรือข้อผิดพลาด DNSเริ่มดีบักที่ ชั้นที่ 1: DNS

คำสั่งเหล่านี้สอบถามข้อมูลเดียวกับที่แสดงในแดชบอร์ด CSD คอนโซล รายการ script ฟิลด์ฟอร์ม และมุมมองเครือข่าย

สิ่งที่พิสูจน์: CSD กำลังตรวจจับและจัดทำแคตตาล็อก script ที่ทำงานบนโดเมนที่ได้รับการป้องกัน

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 -r '
["SCRIPT", "RISK", "STATUS", "FIELDS", "USERS"],
(.scripts[] | [
(.script_name | if length > 50 then .[:47] + "..." else . end),
.risk_level,
.status,
(.form_fields_read // 0),
(.affected_users_count // 0)
])
| @tsv' | column -t
ผลลัพธ์ความหมาย
ผ่าน — แสดง script พร้อมระดับความเสี่ยงCSD กำลังตรวจสอบ script อย่างแข็งขัน
ล้มเหลว — array ว่างเปล่าดู การแก้ปัญหา: Empty Scripts Array

สิ่งที่พิสูจน์: CSD ตรวจพบโดเมนต้นทาง script และจำแนกตามสถานะ

Terminal window
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/detected_domains" \
| jq '{
summary: {
action_needed: .domain_summary.actionNeededCount.count,
mitigated: .domain_summary.mitigatedDomains.count,
allowed: .domain_summary.allowedDomains.count,
total: .domain_summary.totalDomains.count
},
domains: [.domains_list[] | {
domain: .domain,
category: .category,
status: .status,
first_seen: (.firstSeenDate | tonumber | todate),
latest_seen: (.latestSeenDate | tonumber | todate)
}]
}'
ผลลัพธ์ความหมาย
ผ่านtotal > 0 พร้อมโดเมนที่แสดงรายการCSD กำลังติดตาม script domain
เตือนaction_needed > 0บางโดเมนต้องการการตรวจสอบ
ล้มเหลว — การตอบสนองว่างเปล่าไม่มีข้อมูล telemetry — ตรวจสอบ CSD-5

สิ่งที่พิสูจน์: แสดงการกระจายของโดเมนที่อนุญาตเทียบกับที่บรรเทาแล้ว และว่านโยบายสอดคล้องกันหรือไม่

Terminal window
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/detected_domains" \
| jq '{
action_needed: .domain_summary.actionNeededCount.count,
mitigated: .domain_summary.mitigatedDomains.count,
allowed: .domain_summary.allowedDomains.count,
total: .domain_summary.totalDomains.count,
domains_needing_action: [.domains_list[] | select(.status == "AN") | .domain]
}'
ผลลัพธ์ความหมาย
ผ่านaction_needed: 0โดเมนทั้งหมดได้รับการตรวจสอบและจำแนกแล้ว
เตือนaction_needed > 0โดเมนที่แสดงรายการใน domains_needing_action ต้องการการตรวจสอบ

สิ่งที่พิสูจน์: CSD ตรวจพบฟิลด์ฟอร์มที่ script กำลังอ่าน พร้อมการจำแนกความไว

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 -r '
["FIELD", "SENSITIVITY", "SCRIPTS"],
(.form_fields[] | [
.name,
.analysis,
(.scripts_count // 0)
])
| @tsv' | column -t
ผลลัพธ์ความหมาย
ผ่าน — แสดงฟิลด์ฟอร์มพร้อมความไวCSD กำลังติดตามการเข้าถึงฟิลด์ฟอร์ม
ข้อมูล — array ว่างเปล่าไม่ตรวจพบฟิลด์ฟอร์ม (คาดหวังหากไซต์ไม่มีฟอร์ม)

สิ่งที่พิสูจน์: ข้อมูลโดยละเอียดเกี่ยวกับ script เฉพาะ รวมถึงความเสี่ยง พฤติกรรม และการโต้ตอบทางเครือข่าย

ก่อนอื่น ให้รับ script ID จาก TEL-1 จากนั้นสอบถามรายละเอียด:

Terminal window
SCRIPT_ID="your-script-id"
# ภาพรวม (ระดับความเสี่ยง ประเภท source domain)
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/scripts/${SCRIPT_ID}/dashboard" \
| jq '{script_name, risk_level, type, source_domain, status}'
# พฤติกรรมตามเวลา
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/scripts/${SCRIPT_ID}/behaviors" \
| jq '.behaviors'
# การโต้ตอบทางเครือข่าย (โดเมนที่ script สื่อสารด้วย)
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/scripts/${SCRIPT_ID}/networkInteractions" \
| jq '.network_interactions'

สิ่งที่พิสูจน์: แสดงรายการผู้ใช้ที่ได้รับผลกระทบจาก script เฉพาะ แสดงขอบเขตของการเปิดเผย

Terminal window
SCRIPT_ID="your-script-id"
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/${SCRIPT_ID}/affectedUsers" \
| jq -r '
["IP_ADDRESS", "DEVICE_ID", "GEO", "CHANNEL", "USER_AGENT"],
(.affected_users[] | [
.ip_address,
(.device_id | if length > 12 then .[:12] + "..." else . end),
.geolocation,
.channel,
(.user_agent | if length > 30 then .[:27] + "..." else . end)
])
| @tsv' | column -t

สิ่งที่พิสูจน์: การกระจายความเสี่ยงรวมสำหรับ script ทั้งหมดที่ตรวจพบ

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[] | .risk_level] | group_by(.) | map({risk_level: .[0], count: length}) | sort_by(-.count)'
ผลลัพธ์ความหมาย
ผ่าน — ทั้งหมดเป็น No Riskไม่ตรวจพบ script ที่มีความเสี่ยง
เตือน — มี Low Risk หรือ High Riskตรวจสอบ script ที่ถูกตั้งค่าสถานะใน TEL-5

สิ่งที่พิสูจน์: ข้อมูล CSD telemetry เป็นปัจจุบัน ยืนยันการตรวจสอบที่ทำงานอยู่

Terminal window
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/detected_domains" \
| jq '{
total_domains: .domain_summary.totalDomains.count,
latest_update: (.domain_summary.totalDomains.lastUpdated // "unknown"),
most_recent_domain: (.domains_list | sort_by(.latestSeenDate) | last | {
domain: .domain,
latest_seen: (.latestSeenDate | tonumber | todate)
})
}'
ผลลัพธ์ความหมาย
ผ่านlatest_seen อยู่ภายใน 24 ชั่วโมงที่ผ่านมาTelemetry กำลังรวบรวมข้อมูลอย่างแข็งขัน
เตือนlatest_seen เก่ากว่า 24 ชั่วโมงทราฟฟิกอาจหยุดหรือการประมวลผล CSD ล่าช้า

เรียกใช้คำสั่งเดียวที่ตรวจสอบตัวบ่งชี้สุขภาพที่สำคัญทั้งหมดในทุกชั้นและสร้างตารางสรุป:

Terminal window
echo "=== CSD Verification Dashboard ==="
echo ""
# ชั้นที่ 1: DNS
DNS_A=$(dig +short xF5XC_DOMAINNAMEx A | head -1)
DNS_ACME=$(dig +short _acme-challenge.xF5XC_DOMAINNAMEx CNAME | head -1)
# ชั้นที่ 2-3: LB + TLS
LB=$(curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-http")
LB_HTTPS=$(curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-https")
LB_STATE=$(echo "$LB" | jq -r '.spec.state // "UNKNOWN"')
CERT_STATE=$(echo "$LB_HTTPS" | jq -r '.spec.cert_state // "UNKNOWN"')
CSD_ON_LB=$(echo "$LB" | jq -r 'if .spec.client_side_defense then "ENABLED" else "DISABLED" end')
DOMAINS=$(echo "$LB" | jq -r '.spec.domains | join(", ")')
ROUTE_POOL=$(echo "$LB" | jq -r '[.spec.default_route_pools[] | .pool.name] | join(", ")')
# ชั้นที่ 6: สถานะ CSD
CSD=$(curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/status")
CSD_CONFIGURED=$(echo "$CSD" | jq -r '.isConfigured // false')
CSD_ENABLED=$(echo "$CSD" | jq -r '.isEnabled // false')
# ชั้นที่ 6: JS config
JS_TAG=$(curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/js_configuration" \
| jq -r 'if (.scriptTag | length) > 0 then "PRESENT" else "MISSING" end')
# ชั้นที่ 7: ทราฟฟิก (24 ชั่วโมงล่าสุด)
TRAFFIC=$(curl -s -X POST \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
-H "Content-Type: application/json" \
-d "{
\"start_time\": \"$(date -u -d '24 hours ago' +%Y-%m-%dT%H:%M:%SZ 2>/dev/null || date -u -v-24H +%Y-%m-%dT%H:%M:%SZ)\",
\"end_time\": \"$(date -u +%Y-%m-%dT%H:%M:%SZ)\"
}" \
"xF5XC_API_URLx/api/data/namespaces/xF5XC_NAMESPACEx/access_logs/aggregation" \
| jq -r '.total_hits // "0"')
printf "%-28s %s\n" "CHECK" "STATUS"
printf "%-28s %s\n" "----------------------------" "----------------------------"
printf "%-28s %s\n" "[DNS] A Record" "${DNS_A:-NOT_FOUND}"
printf "%-28s %s\n" "[DNS] ACME CNAME" "${DNS_ACME:-NOT_FOUND}"
printf "%-28s %s\n" "[TLS] Certificate" "$CERT_STATE"
printf "%-28s %s\n" "[LB] State" "$LB_STATE"
printf "%-28s %s\n" "[LB] Domains" "$DOMAINS"
printf "%-28s %s\n" "[LB] Route Pool" "$ROUTE_POOL"
printf "%-28s %s\n" "[LB] CSD on LB" "$CSD_ON_LB"
printf "%-28s %s\n" "[CSD] Configured (tenant)" "$CSD_CONFIGURED"
printf "%-28s %s\n" "[CSD] Enabled" "$CSD_ENABLED"
printf "%-28s %s\n" "[CSD] JS Script Tag" "$JS_TAG"
printf "%-28s %s\n" "[Traffic] Requests (24h)" "$TRAFFIC"

ฟิลด์ประเภทคำอธิบาย
@timestampstringtimestamp ของคำขอ (ISO 8601) สังเกต prefix @ — เข้าถึงด้วย .["@timestamp"] ใน jq
methodstringHTTP method (GET, POST, ฯลฯ)
req_pathstringURI path ของคำขอ
rsp_codestringHTTP response status code เป็น string (เช่น "200", "404")
rsp_code_classstringคลาสของ status code (2xx, 3xx, 4xx, 5xx หรือ downstream_remote_disconnect)
src_ipstringIP address ต้นทางของไคลเอนต์
dst_ipstringIP address ปลายทาง (VIP)
domainstringค่า Host header ของคำขอ
user_agentstringstring User-Agent ของไคลเอนต์
rsp_sizestringขนาด response body เป็นไบต์ (คืนค่าเป็น string)
req_sizestringขนาด request body เป็นไบต์ (คืนค่าเป็น string)
duration_with_data_tx_delaystringระยะเวลาคำขอรวมทั้งหมดเป็นวินาที (คืนค่าเป็น string เช่น "0.024219")
csd_js_injectionstring"true" เมื่อ CSD JavaScript ถูกฉีด (มีอยู่เฉพาะเมื่อทำงาน)
ฟิลด์Endpointคำอธิบาย
isConfiguredstatusCSD เปิดใช้งานในระดับ tenant
isEnabledstatusCSD ทำงานอยู่สำหรับ namespace นี้
scripts[]scriptsArray ของอ็อบเจกต์ script ที่ตรวจพบ
.script_namescriptsURL แบบเต็มของไฟล์ JavaScript
.risk_levelscriptsระดับความเสี่ยง (No Risk, Low Risk, High Risk)
.statusscriptsAN (Action Needed) หรือ NA (No Action Needed)
.form_fields_readscriptsจำนวนฟิลด์ฟอร์มที่ script อ่าน
.affected_users_countscriptsจำนวนผู้ใช้/เซสชันที่ไม่ซ้ำกันที่ได้รับผลกระทบ
domain_summarydetected_domainsจำนวนตามสถานะ: .actionNeededCount.count, .mitigatedDomains.count, .allowedDomains.count, .totalDomains.count (แต่ละรายการมี .count และ .lastUpdated)
domains_list[]detected_domainsArray ของอ็อบเจกต์โดเมนที่ตรวจพบพร้อม .domain, .status, .category, .firstSeenDate, .latestSeenDate (epoch seconds เป็น string)
form_fields[]formFieldsArray ของอ็อบเจกต์ฟิลด์ฟอร์มที่ตรวจพบ
.analysisformFieldsการจำแนกความไว (Sensitive, Not Sensitive)

หาก TV-1 คืนค่า 0:

  1. ตรวจสอบการแก้ไข DNS — ตรวจสอบว่าโดเมนแก้ไขเป็น LB VIP:

    Terminal window
    dig +short xF5XC_DOMAINNAMEx A

    หากว่างเปล่า DNS ไม่ได้กำหนดค่า ดู การทำงานอัตโนมัติของ API — ขั้นตอนที่ 4

  2. ตรวจสอบสถานะ LB — load balancer ต้องเป็น VIRTUAL_HOST_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 '.spec.state'
  3. ส่งคำขอทดสอบ — สร้างทราฟฟิกเพื่อยืนยันการเชื่อมต่อ end-to-end:

    Terminal window
    curl -sv "http://xF5XC_DOMAINNAMEx/" 2>&1 | head -20

    มองหาการตอบสนอง HTTP ที่สำเร็จ ใช้ https:// เฉพาะเมื่อใบรับรอง HTTPS LB ถูกต้องเท่านั้น

หาก DNS-4 คืนค่า false การสร้าง record อัตโนมัติจะถูกปิดใช้งานแม้ว่า F5 XC จะเป็น authoritative DNS provider นี่เป็นการกำหนดค่าผิดพลาดที่พบบ่อยซึ่งทำให้ทั้ง A record และ ACME CNAME หายไป ซึ่งบล็อก load balancer จากการถึง VIRTUAL_HOST_READY และใบรับรองจากการออก

หากต้องการเปิดใช้งาน managed records ให้อัปเดตการกำหนดค่า DNS zone เพื่อตั้งค่า allow_http_lb_managed_records: true ดู การทำงานอัตโนมัติของ API — ตัวเลือก A: F5 XC Managed DNS สำหรับการเรียก API

Load balancer กำลังรอ DNS A record ที่ชี้ไปที่ VIP ดู LB ค้างใน VIRTUAL_HOST_PENDING_A_RECORD สำหรับขั้นตอนการแก้ปัญหาโดยละเอียด

ใบรับรอง TLS อัตโนมัติต้องการ ACME challenge record วิธีการขึ้นอยู่กับผู้ให้บริการ DNS ของคุณ:

F5 XC Managed DNS: เปิดใช้งาน allow_http_lb_managed_records บน DNS zone (DNS-4) แพลตฟอร์มสร้าง TXT-based ACME challenge record อัตโนมัติในกลุ่ม RR set x-ves-io-managed หากใบรับรองยังคงค้างหลังจากเปิดใช้งาน managed records ให้ลบและสร้าง load balancer ใหม่เพื่อเริ่มคำขอใบรับรองใหม่

External DNS: สร้าง CNAME record ที่ผู้ให้บริการ DNS ของคุณ:

_acme-challenge.xF5XC_DOMAINNAMEx CNAME *.autocerts.ves.volterra.io

ตรวจสอบว่า record มีอยู่:

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

หากทั้งคู่ว่างเปล่า ACME record ไม่ได้กำหนดค่า การจัดเตรียมใบรับรองใช้เวลา 5–10 นาทีหลังจาก record พร้อมใช้งาน ตรวจสอบสถานะข้อผิดพลาดของ LB สำหรับข้อผิดพลาดการตรวจสอบ ACME เฉพาะ:

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 '[.status[]? | select(.virtual_host_status != null) | .virtual_host_status.error_description]'

CSD ต้องเปิดใช้งานในระดับ tenant โดยผู้ดูแลระบบ F5 XC นี่เป็นการตั้งค่าทั่วทั้ง tenant ที่ไม่สามารถกำหนดค่าผ่าน namespace API ได้ ติดต่อผู้ดูแลระบบของคุณเพื่อเปิดใช้งานการป้องกันฝั่งไคลเอนต์

หาก TEL-1 คืนค่า array ว่างเปล่า:

  1. ตรวจสอบโดเมนที่ได้รับการป้องกัน — CSD ตรวจสอบ script เฉพาะบนโดเมนที่ลงทะเบียนเท่านั้น:

    Terminal window
    curl -s \
    -H "Authorization: APIToken xF5XC_API_TOKENx" \
    "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/protected_domains" \
    | jq '.items[] | {name, namespace}'
  2. ตรวจสอบการฉีด JS — ยืนยันว่า CSD script tag กำลังถูกฉีดเข้าไปในหน้า:

    Terminal window
    curl -s "http://xF5XC_DOMAINNAMEx/" | grep -oE '(zeronaught|shape)\.com[^"]*' | head -1

    หากไม่มีการจับคู่ CSD JavaScript ไม่ถูกฉีด ตรวจสอบว่า LB มี client_side_defense เปิดใช้งาน

  3. รอเวลาการประมวลผล — หลังจากเปิดใช้งาน CSD ครั้งแรกหรือลงทะเบียนโดเมนที่ได้รับการป้องกันใหม่ การตรวจจับ script อาจใช้เวลา 5–15 นาที สร้างทราฟฟิกไปยังไซต์และรอก่อนตรวจสอบอีกครั้ง

ระยะเวลาEpoch offsetISO 8601 (Linux)ISO 8601 (macOS)
1 ชั่วโมง$(( $(date +%s) - 3600 ))date -u -d '1 hour ago' +%Y-%m-%dT%H:%M:%SZdate -u -v-1H +%Y-%m-%dT%H:%M:%SZ
24 ชั่วโมง$(( $(date +%s) - 86400 ))date -u -d '24 hours ago' +%Y-%m-%dT%H:%M:%SZdate -u -v-24H +%Y-%m-%dT%H:%M:%SZ
7 วัน$(( $(date +%s) - 604800 ))date -u -d '7 days ago' +%Y-%m-%dT%H:%M:%SZdate -u -v-7d +%Y-%m-%dT%H:%M:%SZ
30 วัน$(( $(date +%s) - 2592000 ))date -u -d '30 days ago' +%Y-%m-%dT%H:%M:%SZdate -u -v-30d +%Y-%m-%dT%H:%M:%SZ
ชั้นการทดสอบสิ่งที่ครอบคลุม
1. การแก้ไข DNSDNS-1 ถึง DNS-4A record, ACME CNAME, อำนาจ nameserver, managed records
2. ใบรับรอง TLSTLS-1 ถึง TLS-4สถานะใบรับรอง, รายละเอียดใบรับรอง, handshake แบบสด, เป้าหมาย ACME
3. HTTP Load BalancerLB-1 ถึง LB-6สถานะ, โดเมน, ค่าสถานะ CSD, route pool, การปรับใช้, สรุป
4. Origin PoolOP-1 ถึง OP-4การกำหนดค่า, โหมด TLS, การเชื่อมโยง HC, การเชื่อมต่อ origin
5. Health CheckHC-1 ถึง HC-2การกำหนดค่า HC, แสดงรายการ HC ทั้งหมด
6. การกำหนดค่า CSDCSD-1 ถึง CSD-5สถานะ tenant, JS tag, โดเมนที่ได้รับการป้องกัน, การฉีดแบบสด
7. การตรวจสอบทราฟฟิกTV-1 ถึง TV-5จำนวนคำขอ, status code, ตัวอย่าง, JS ใน log, การทดสอบ E2E
8. CSD TelemetryTEL-1 ถึง TEL-8Script, โดเมน, นโยบาย, ฟิลด์ฟอร์ม, การตรวจสอบเชิงลึก, ผู้ใช้, ความเสี่ยง, ความสดใหม่
การวินิจฉัยEndpointMethodรูปแบบเวลา
จำนวนคำขอ/api/data/namespaces/\{ns\}/access_logs/aggregationPOSTISO 8601
Status code/api/data/namespaces/\{ns\}/access_logsPOSTISO 8601
คำขอล่าสุด/api/data/namespaces/\{ns\}/access_logsPOSTISO 8601
สถานะ LB/api/config/namespaces/\{ns\}/http_loadbalancers/\{name\}GETไม่มี
Origin pool/api/config/namespaces/\{ns\}/origin_pools/\{name\}GETไม่มี
Healthcheck/api/config/namespaces/\{ns\}/healthchecks/\{name\}GETไม่มี
DNS zone/api/config/dns/namespaces/system/dns_zones/\{zone\}GETไม่มี
สถานะ CSD/api/shape/csd/namespaces/\{ns\}/statusGETไม่มี
การกำหนดค่า JS/api/shape/csd/namespaces/\{ns\}/js_configurationGETไม่มี
โดเมนที่ได้รับการป้องกัน/api/shape/csd/namespaces/\{ns\}/protected_domainsGETไม่มี
รายการ script/api/shape/csd/namespaces/\{ns\}/scriptsPOSTEpoch seconds
โดเมนที่ตรวจพบ/api/shape/csd/namespaces/\{ns\}/detected_domainsGETไม่มี
ฟิลด์ฟอร์ม/api/shape/csd/namespaces/\{ns\}/formFieldsGETEpoch seconds (query params)
รายละเอียด script/api/shape/csd/namespaces/\{ns\}/scripts/\{id\}/dashboardGETไม่มี
พฤติกรรม script/api/shape/csd/namespaces/\{ns\}/scripts/\{id\}/behaviorsGETไม่มี
เครือข่าย script/api/shape/csd/namespaces/\{ns\}/scripts/\{id\}/networkInteractionsGETไม่มี
ผู้ใช้ที่ได้รับผลกระทบ/api/shape/csd/namespaces/\{ns\}/scripts/\{id\}/affectedUsersPOSTEpoch seconds