تخطَّ إلى المحتوى

المرحلة 1 — البناء

تقوم المرحلة 1 بنشر والتحقق من البنية التحتية الكاملة لـ CSD. أكمل جميع الخطوات بالترتيب — يجب أن تجتاز كل خطوة قبل المتابعة. ارجع إلى الفهرس لإكمال إعداد البيئة وحل المتغيرات قبل تشغيل هذه الأوامر.

الخطوة 0: التحقق من النطاق وإنشاؤه (شرطي)

Section titled “الخطوة 0: التحقق من النطاق وإنشاؤه (شرطي)”

تحقق مما إذا كان النطاق المستهدف موجوداً بالفعل في المستأجر. إذا لم يكن موجوداً، أنشئه. تتبع النتيجة في متغير الشل NAMESPACE_CREATED — تستخدمه عملية التراجع في المرحلة 4 لتحديد ما إذا كان يجب حذف النطاق.

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"
الحقلالمتوقعالحالة
حالة HTTP200ناجح إذا أُعيد، فاشل إذا كان 404 أو غير ذلك
NAMESPACE_CREATEDtrue (تم الإنشاء) أو false (موجود مسبقاً)معلوماتي — تستخدمه عملية التراجع في المرحلة 4

الخطوة 1: إنشاء فحص الصحة (اختياري)

Section titled “الخطوة 1: إنشاء فحص الصحة (اختياري)”

أنشئ فحص صحة 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}'
الحقلالمتوقعالحالة
حالة HTTP200 مع كائنناجح إذا أُعيد، فاشل إذا كان 404
nameيطابق F5XC_HC_NAMEناجح
path/ناجح
تم تخطي الخطوة 1 (رمز الخطأ 8، استنفاد الحد)ناجح (فحص الصحة اختياري لـ CSD)

الخطوة 2: إنشاء تجمع المصدر

Section titled “الخطوة 2: إنشاء تجمع المصدر”

أنشئ تجمع مصدر يشير إلى خادمك الخلفي. إذا أنشأت فحص صحة في الخطوة 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 تؤكد إنشاء تجمع المصدر.

التحقق من ربط فحص الصحة

Section titled “التحقق من ربط فحص الصحة”

إذا أدرجت مرجع فحص صحة، تأكد من ربطه بشكل صحيح:

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)}'
الحقلالمتوقعالحالة
حالة HTTP200ناجح إذا أُعيد، فاشل إذا كان 404
nameيطابق F5XC_ORIGIN_POOLناجح
origin_ipيطابق F5XC_ORIGIN_IPناجح
portيطابق F5XC_ORIGIN_PORTناجح
healthcheck_count1 (مع فحص الصحة) أو 0 (بدونه)ناجح في كلتا الحالتين

الخطوة 3: إنشاء موازنات تحميل HTTP مع CSD

Section titled “الخطوة 3: إنشاء موازنات تحميل HTTP مع CSD”

أنشئ موازني تحميل مع تفعيل الدفاع من جهة العميل — موازن تحميل HTTP (أساسي، المنفذ 80) وموازن تحميل HTTPS (ثانوي، المنفذ 443 مع إدارة شهادات تلقائية). موازن تحميل HTTP هو الافتراضي لجميع حركة مرور العرض التوضيحي. موازن تحميل HTTPS ميزة إضافية تعتمد على توفير شهادة Let’s Encrypt، والتي قد تصطدم بحدود المعدل في بيئات العرض التوضيحي.

موازن تحميل HTTP (الأساسي)

Section titled “موازن تحميل HTTP (الأساسي)”

هذا هو موازن التحميل الأساسي للعروض التوضيحية. يستخدم مستمع http على المنفذ 80 مع DNS مُدار بواسطة F5 XC. لا يعتمد على توفير شهادة 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.

موازن تحميل HTTPS (الثانوي)

Section titled “موازن تحميل HTTPS (الثانوي)”

هذا هو موازن التحميل الثانوي. يستخدم https_auto_cert على المنفذ 443 مع توفير شهادة Let’s Encrypt تلقائي. قبل إنشائه، تحقق مما إذا كان موازن تحميل HTTPS هيكلي موجوداً من عملية تراجع سابقة — إذا كان كذلك، استعده عبر PUT بدلاً من POST للحفاظ على شهادة Let’s Encrypt الموجودة وتجنب حدود المعدل (5 شهادات مكررة لكل مجموعة معرّفات دقيقة لكل 7 أيام).

تحقق مما إذا كان موازن تحميل HTTPS موجوداً بالفعل:

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_CHECK هي 200، فموازن تحميل HTTPS الهيكلي موجود — استخدم المسار A (PUT). إذا كانت 404، استخدم المسار B (POST).

المسار A: استعادة الهيكل عبر PUT (موازن تحميل HTTPS موجود)

Section titled “المسار A: استعادة الهيكل عبر PUT (موازن تحميل HTTPS موجود)”

عندما يكون موازن تحميل HTTPS الهيكلي موجوداً من عملية تراجع سابقة، استعد التهيئة الكاملة عبر PUT. يُعيد هذا ربط تجمع المصدر ويُعيد تفعيل CSD دون استدعاء طلب شهادة Let’s Encrypt جديد — تبقى الشهادة الموجودة صالحة.

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

استجابة 200 تؤكد استعادة الهيكل بالتهيئة الكاملة. يجب أن تبقى حالة الشهادة CertificateValid — لا يُستدعى توفير Let’s Encrypt جديد.

المسار B: إنشاء جديد عبر POST (موازن تحميل HTTPS غير موجود)

Section titled “المسار B: إنشاء جديد عبر POST (موازن تحميل HTTPS غير موجود)”

عندما لا يكون موازن تحميل HTTPS موجوداً (التشغيل الأول أو بعد عملية تراجع كاملة)، أنشئه عبر 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 (الأساسي):

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}'
الحقلالمتوقعالحالة
حالة HTTP200ناجح إذا أُعيد، فاشل إذا كان 404
name${F5XC_LB_NAME}-httpناجح
domainsيحتوي على F5XC_DOMAINNAMEناجح
csd_enabledtrueناجح — CSD مهيأ على هذا الموازن
stateVIRTUAL_HOST_READY أو VIRTUAL_HOST_PENDING_A_RECORDمتوقع — ينتقل موازن تحميل HTTP إلى READY فور حل DNS. أي حالة أخرى (مثل VIRTUAL_HOST_FAILED) تعدّ فشلاً — أبلغ المشغل ولا تتابع

موازن تحميل HTTPS (الثانوي):

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}'
الحقلالمتوقعالحالة
حالة HTTP200ناجح إذا أُعيد، فاشل إذا كان 404
name${F5XC_LB_NAME}-httpsناجح
domainsيحتوي على F5XC_DOMAINNAMEناجح
csd_enabledtrueناجح — CSD مهيأ على هذا الموازن
creation_methodPUT (استعادة الهيكل) أو POST (جديد)معلوماتي — PUT يحافظ على الشهادة الموجودة
stateVIRTUAL_HOST_READY (PUT) أو VIRTUAL_HOST_PENDING_A_RECORD (POST)متوقع — مسار PUT قد يكون READY بالفعل إذا استمر DNS من الهيكل
cert_stateCertificateValid (PUT) أو PreDomainChallengePending (POST)PUT يحافظ على الشهادة الموجودة؛ POST يُستدعى توفيراً جديداً

بعد إنشاء موازن التحميل، يدخل حالة VIRTUAL_HOST_PENDING_A_RECORD وتبقى الشهادة التلقائية في PreDomainChallengePending. يجب أن يكون سجلان DNS موجودَين قبل أن يصبح موازن التحميل يعمل بالكامل:

  1. سجل AxF5XC_DOMAINNAMEx يشير إلى عنوان IP للـ VIP (من dns_info في استجابة موازن التحميل)
  2. سجل تحدي ACME_acme-challenge.xF5XC_DOMAINNAMEx للتحقق من شهادة TLS (تُدار تلقائياً عند استخدام F5 XC DNS مع السجلات المُدارة؛ يتطلب CNAME يدوياً لـ DNS الخارجي)

يعتمد النهج على ما إذا كانت F5 XC هي مزود DNS الموثوق لنطاقك.

تحقق من خوادم الأسماء لنطاقك الجذري:

Terminal window
dig +short NS xF5XC_ROOT_DOMAINx

إذا تضمنت الاستجابة ns1.f5clouddns.com وns2.f5clouddns.com، فإن F5 XC هي مزود DNS الموثوق — اتبع الخيار A. وإلا، اتبع الخيار B لـ DNS الخارجي.

الخيار A: DNS مُدار بواسطة F5 XC

Section titled “الخيار A: DNS مُدار بواسطة F5 XC”

عندما تكون F5 XC مزود DNS الموثوق، يمكن للمنصة إنشاء كلٍّ من سجل A وسجل CNAME لتحدي ACME تلقائياً — ولكن فقط عند تفعيل allow_http_lb_managed_records في منطقة DNS.

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. إذا كانت false أو null، تابع إلى الخطوة التالية.

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 هذه لا تغيّر تهيئة موازن التحميل — إنها تستدعي المنصة فقط لإعادة تقييم منطقة DNS وإنشاء السجلات المُدارة. إذا لم يتم حل سجل A خلال 60 ثانية بعد إعادة التطبيق، أوقف وأبلغ المشغل — لا تعد تطبيق إعادة التطبيق أكثر من مرة.

3. التحقق من حل DNS:

Terminal window
dig +short xF5XC_DOMAINNAMEx A

يجب أن تُعيد الاستجابة عنوان IP للـ VIP. انتشار DNS عادةً فوري لمناطق F5 XC المُدارة، لكن انتظر حتى 60 ثانية.

الخيار B: مزود DNS الخارجي

Section titled “الخيار B: مزود DNS الخارجي”

عندما يستخدم نطاقك مزود DNS خارجياً، يجب عليك إنشاء السجلات يدوياً. استخرج القيم المطلوبة من موازن التحميل:

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

أنشئ هذه السجلات لدى مزود DNS الخاص بك:

النوعالاسمالقيمة
AxF5XC_DOMAINNAMExعنوان IP للـ VIP من dns_info[0].ip_address
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: سجل Adig +short $F5XC_DOMAINNAME Aعنوان IP للـ VIP مُعادناجح إذا أُعيد عنوان IP، فاشل إذا كان فارغاً
DNS-2: سجل ACME CNAMEdig +short _acme-challenge.$F5XC_DOMAINNAME CNAME*.autocerts.ves.volterra.ioناجح إذا أُعيد CNAME
سلطة DNSdig +short NS $F5XC_ROOT_DOMAINخوادم أسماء F5 XC أو الخارجيةمعلوماتي — يحدد الخيار A أو B

إذا أعاد DNS-1 نتيجة فارغة بعد 60 ثانية، انظر استكشاف الأخطاء — موازن التحميل عالق في VIRTUAL_HOST_PENDING_A_RECORD.

الخطوة 5: التحقق من تفعيل CSD

Section titled “الخطوة 5: التحقق من تفعيل CSD”

تحقق من تفعيل الدفاع من جهة العميل للمستأجر. يُهيأ 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}'
الحقلالمتوقعالحالة
configuredtrueناجح
enabledtrueناجح
أي منهما falseفاشل — تواصل مع مسؤول F5 XC لتفعيل CSD على مستوى المستأجر

الخطوة 6: تسجيل النطاق المحمي

Section titled “الخطوة 6: تسجيل النطاق المحمي”

سجّل النطاق الجذري الذي سيراقبه CSD. يجب أن يكون حقل protected_domain هو نطاق الجذر eTLD+1 (مثل f5demos.com)، وليس الاسم المؤهل بالكامل.

التحقق مما إذا كان مسجلاً بالفعل

Section titled “التحقق مما إذا كان مسجلاً بالفعل”

قبل الإنشاء، تحقق مما إذا كان النطاق مسجلاً بالفعل على المستأجر. استجابة 409 لـ POST تعني أن النطاق موجود بالفعل — وهذا شرط نجاح، وليس خطأ.

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_domainيطابق F5XC_ROOT_DOMAINناجح
POST أعاد 200 أو 409تم تسجيل النطاق أو موجود بالفعلناجح
عدد العناصر في القائمة> 0ناجح

تأكد من حل سجل A ووجود سجل CNAME لتحدي ACME:

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

يجب أن يُعيد سجل A عنوان IP للـ VIP. يجب أن يشير CNAME إلى *.autocerts.ves.volterra.io (أو هدف autocerts ذي صلة).

تحقق من انتقال كلا موازني التحميل من حالات الانتظار. موازن تحميل HTTP هو الفحص الأساسي — يجب أن يصل إلى VIRTUAL_HOST_READY فور حل DNS، دون اعتماد على الشهادة. حالة شهادة موازن تحميل HTTPS معلوماتية فقط.

موازن تحميل HTTP (الأساسي — يجب أن يكون 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 (الثانوي — معلوماتي، لا يعيق التقدم):

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)
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}'

البرامج النصية المكتشفة

Section titled “البرامج النصية المكتشفة”

تتطلب نقطة نهاية البرامج النصية نطاقاً زمنياً باستخدام طوابع زمنية 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'

بعد إكمال جميع فحوصات التحقق، يجب أن يقدم مساعد الذكاء الاصطناعي جدول حالة موحداً:

معرّف الاختبارالفحصالمتوقعمطلوبالحالة
DNS-1حل سجل Aعنوان IP للـ VIP مُعادنعمناجح / فاشل
DNS-2سجل ACME CNAME موجود*.autocerts.ves.volterra.ioلاناجح / معلق
LB-1حالة موازن تحميل HTTPVIRTUAL_HOST_READYنعمناجح / معلق
LB-2حالة موازن تحميل HTTPSVIRTUAL_HOST_READYلاناجح / معلق / معلوماتي
TLS-1حالة الشهادةCertificateValidلاناجح / معلق / معلوماتي
CSD-1تهيئة JSscriptTag موجودنعمناجح / فاشل
CSD-2حالة CSDisEnabled: trueنعمناجح / فاشل
CSD-3النطاق المحميتم تسجيل النطاقنعمناجح / فاشل

إذا أظهر LB-1 حالة معلقة، استعلم كل 30 ثانية لما يصل إلى 4 تكرارات (دقيقتان إجمالاً). إذا لم يصل LB-1 إلى VIRTUAL_HOST_READY بعد 4 تكرارات، تحقق من حل DNS بـ dig وأبلغ المشغل — لا تتابع حتى يصل LB-1 إلى READY. بالنسبة لـ LB-2 وTLS-1، استعلم كل 60 ثانية لما يصل إلى 10 تكرارات (10 دقائق). إذا لا يزال في حالة وسيطة بعد 10 تكرارات، سجّل الحالة الحالية كمعلومة وتابع — هذه معلوماتية ولا تعيق تقدم العرض التوضيحي.


اكتملت المرحلة 1. تابع إلى المرحلة 2 — الهجوم لتشغيل محاكاة الهجوم.