- الرئيسية
- الدفاع من جهة العميل
- Demo
- المرحلة 1 — البناء
المرحلة 1 — البناء
تقوم المرحلة 1 بنشر والتحقق من البنية التحتية الكاملة لـ CSD. أكمل جميع الخطوات بالترتيب — يجب أن تجتاز كل خطوة قبل المتابعة. ارجع إلى الفهرس لإكمال إعداد البيئة وحل المتغيرات قبل تشغيل هذه الأوامر.
الخطوة 0: التحقق من النطاق وإنشاؤه (شرطي)
Section titled “الخطوة 0: التحقق من النطاق وإنشاؤه (شرطي)”تحقق مما إذا كان النطاق المستهدف موجوداً بالفعل في المستأجر. إذا لم يكن موجوداً، أنشئه. تتبع النتيجة في متغير الشل NAMESPACE_CREATED — تستخدمه عملية التراجع في المرحلة 4 لتحديد ما إذا كان يجب حذف النطاق.
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الدليل
Section titled “الدليل”تأكد من وجود النطاق وسجّل ما إذا كان قد تم إنشاؤه:
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 | ناجح إذا أُعيد، فاشل إذا كان 404 أو غير ذلك |
NAMESPACE_CREATED | true (تم الإنشاء) أو false (موجود مسبقاً) | معلوماتي — تستخدمه عملية التراجع في المرحلة 4 |
الخطوة 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 على مراقبة الصحة.
الدليل
Section titled “الدليل”تأكد من وجود فحص الصحة:
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 مع كائن | ناجح إذا أُعيد، فاشل إذا كان 404 |
name | يطابق F5XC_HC_NAME | ناجح |
path | / | ناجح |
تم تخطي الخطوة 1 (رمز الخطأ 8، استنفاد الحد) | — | ناجح (فحص الصحة اختياري لـ 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، أو تعني أن فحص الصحة لم يُعثر عليه إذا كنت تقصد ربطه.
الدليل
Section titled “الدليل”تأكد من وجود تجمع المصدر وأنه يحتوي على التهيئة الصحيحة:
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 | ناجح إذا أُعيد، فاشل إذا كان 404 |
name | يطابق F5XC_ORIGIN_POOL | ناجح |
origin_ip | يطابق F5XC_ORIGIN_IP | ناجح |
port | يطابق F5XC_ORIGIN_PORT | ناجح |
healthcheck_count | 1 (مع فحص الصحة) أو 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.
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 موجوداً بالفعل:
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 جديد — تبقى الشهادة الموجودة صالحة.
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 دقائق.
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. يبدأ توفير الشهادة تلقائياً.
الدليل
Section titled “الدليل”تأكد من وجود كلا موازني التحميل مع تفعيل CSD. استخدم دائماً GET للدليل — تُعيد استجابة POST قيم حالة عابرة قد لا تعكس التهيئة المستقرة.
موازن تحميل HTTP (الأساسي):
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 | ناجح إذا أُعيد، فاشل إذا كان 404 |
name | ${F5XC_LB_NAME}-http | ناجح |
domains | يحتوي على F5XC_DOMAINNAME | ناجح |
csd_enabled | true | ناجح — CSD مهيأ على هذا الموازن |
state | VIRTUAL_HOST_READY أو VIRTUAL_HOST_PENDING_A_RECORD | متوقع — ينتقل موازن تحميل HTTP إلى READY فور حل DNS. أي حالة أخرى (مثل VIRTUAL_HOST_FAILED) تعدّ فشلاً — أبلغ المشغل ولا تتابع |
موازن تحميل HTTPS (الثانوي):
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 | ناجح إذا أُعيد، فاشل إذا كان 404 |
name | ${F5XC_LB_NAME}-https | ناجح |
domains | يحتوي على F5XC_DOMAINNAME | ناجح |
csd_enabled | true | ناجح — CSD مهيأ على هذا الموازن |
creation_method | PUT (استعادة الهيكل) أو POST (جديد) | معلوماتي — PUT يحافظ على الشهادة الموجودة |
state | VIRTUAL_HOST_READY (PUT) أو VIRTUAL_HOST_PENDING_A_RECORD (POST) | متوقع — مسار PUT قد يكون READY بالفعل إذا استمر DNS من الهيكل |
cert_state | CertificateValid (PUT) أو PreDomainChallengePending (POST) | PUT يحافظ على الشهادة الموجودة؛ POST يُستدعى توفيراً جديداً |
الخطوة 4: تهيئة DNS
Section titled “الخطوة 4: تهيئة DNS”بعد إنشاء موازن التحميل، يدخل حالة VIRTUAL_HOST_PENDING_A_RECORD وتبقى الشهادة التلقائية في PreDomainChallengePending. يجب أن يكون سجلان DNS موجودَين قبل أن يصبح موازن التحميل يعمل بالكامل:
- سجل A —
xF5XC_DOMAINNAMExيشير إلى عنوان IP للـ VIP (منdns_infoفي استجابة موازن التحميل) - سجل تحدي ACME —
_acme-challenge.xF5XC_DOMAINNAMExللتحقق من شهادة TLS (تُدار تلقائياً عند استخدام F5 XC DNS مع السجلات المُدارة؛ يتطلب CNAME يدوياً لـ DNS الخارجي)
يعتمد النهج على ما إذا كانت 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: DNS مُدار بواسطة F5 XC
Section titled “الخيار A: DNS مُدار بواسطة F5 XC”عندما تكون F5 XC مزود DNS الموثوق، يمكن للمنصة إنشاء كلٍّ من سجل A وسجل CNAME لتحدي ACME تلقائياً — ولكن فقط عند تفعيل allow_http_lb_managed_records في منطقة DNS.
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 هذه لا تغيّر تهيئة موازن التحميل — إنها تستدعي المنصة فقط لإعادة تقييم منطقة DNS وإنشاء السجلات المُدارة. إذا لم يتم حل سجل A خلال 60 ثانية بعد إعادة التطبيق، أوقف وأبلغ المشغل — لا تعد تطبيق إعادة التطبيق أكثر من مرة.
3. التحقق من حل DNS:
dig +short xF5XC_DOMAINNAMEx Aيجب أن تُعيد الاستجابة عنوان IP للـ VIP. انتشار DNS عادةً فوري لمناطق F5 XC المُدارة، لكن انتظر حتى 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 | عنوان IP للـ VIP من dns_info[0].ip_address |
| CNAME | _acme-challenge.xF5XC_DOMAINNAMEx | *.autocerts.ves.volterra.io |
بعد إنشاء السجلات، تحقق من الحل:
dig +short xF5XC_DOMAINNAMEx Adig +short _acme-challenge.xF5XC_DOMAINNAMEx CNAMEالدليل
Section titled “الدليل”| الاختبار | الأمر | المتوقع | الحالة |
|---|---|---|---|
| DNS-1: سجل A | dig +short $F5XC_DOMAINNAME A | عنوان IP للـ VIP مُعاد | ناجح إذا أُعيد عنوان IP، فاشل إذا كان فارغاً |
| DNS-2: سجل ACME CNAME | dig +short _acme-challenge.$F5XC_DOMAINNAME CNAME | *.autocerts.ves.volterra.io | ناجح إذا أُعيد CNAME |
| سلطة DNS | dig +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 الخاص بك.
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/status" \ | jq .استجابة تحتوي على "isConfigured": true و"isEnabled": true تؤكد أن CSD نشط.
الدليل
Section titled “الدليل”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 | ناجح |
enabled | true | ناجح |
أي منهما false | — | فاشل — تواصل مع مسؤول F5 XC لتفعيل CSD على مستوى المستأجر |
الخطوة 6: تسجيل النطاق المحمي
Section titled “الخطوة 6: تسجيل النطاق المحمي”سجّل النطاق الجذري الذي سيراقبه CSD. يجب أن يكون حقل protected_domain هو نطاق الجذر eTLD+1 (مثل f5demos.com)، وليس الاسم المؤهل بالكامل.
التحقق مما إذا كان مسجلاً بالفعل
Section titled “التحقق مما إذا كان مسجلاً بالفعل”قبل الإنشاء، تحقق مما إذا كان النطاق مسجلاً بالفعل على المستأجر. استجابة 409 لـ POST تعني أن النطاق موجود بالفعل — وهذا شرط نجاح، وليس خطأ.
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. احذف النطاقات المحمية غير المستخدمة أو تواصل مع مسؤولك. |
الدليل
Section titled “الدليل”استجابة 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 | ناجح |
POST أعاد 200 أو 409 | تم تسجيل النطاق أو موجود بالفعل | ناجح |
| عدد العناصر في القائمة | > 0 | ناجح |
الخطوة 7: التحقق
Section titled “الخطوة 7: التحقق”حل DNS
Section titled “حل DNS”تأكد من حل سجل A ووجود سجل CNAME لتحدي ACME:
dig +short xF5XC_DOMAINNAMEx Adig +short _acme-challenge.xF5XC_DOMAINNAMEx CNAMEيجب أن يُعيد سجل A عنوان IP للـ VIP. يجب أن يشير CNAME إلى *.autocerts.ves.volterra.io (أو هدف autocerts ذي صلة).
حالة موازن التحميل
Section titled “حالة موازن التحميل”تحقق من انتقال كلا موازني التحميل من حالات الانتظار. موازن تحميل HTTP هو الفحص الأساسي — يجب أن يصل إلى VIRTUAL_HOST_READY فور حل DNS، دون اعتماد على الشهادة. حالة شهادة موازن تحميل HTTPS معلوماتية فقط.
موازن تحميل HTTP (الأساسي — يجب أن يكون 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 (الثانوي — معلوماتي، لا يعيق التقدم):
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) |
تهيئة JS
Section titled “تهيئة JS”curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/js_configuration" \ | jq .تحتوي الاستجابة على حقل scriptTag مع وسم HTML <script> الكامل الذي يُدرجه موازن التحميل في استجابات الصفحة.
النطاقات المكتشفة
Section titled “النطاقات المكتشفة”curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/detected_domains" \ | jq '{summary: .domain_summary, domains: .domains_list}'البرامج النصية المكتشفة
Section titled “البرامج النصية المكتشفة”تتطلب نقطة نهاية البرامج النصية نطاقاً زمنياً باستخدام طوابع زمنية epoch (ثوانٍ منذ Unix 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}]'حقول النموذج
Section titled “حقول النموذج”تتطلب نقطة نهاية حقول النموذج نطاقاً زمنياً باستخدام طوابع زمنية 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'ملخص دليل المرحلة 1
Section titled “ملخص دليل المرحلة 1”بعد إكمال جميع فحوصات التحقق، يجب أن يقدم مساعد الذكاء الاصطناعي جدول حالة موحداً:
| معرّف الاختبار | الفحص | المتوقع | مطلوب | الحالة |
|---|---|---|---|---|
| DNS-1 | حل سجل A | عنوان IP للـ VIP مُعاد | نعم | ناجح / فاشل |
| DNS-2 | سجل ACME CNAME موجود | *.autocerts.ves.volterra.io | لا | ناجح / معلق |
| LB-1 | حالة موازن تحميل HTTP | VIRTUAL_HOST_READY | نعم | ناجح / معلق |
| LB-2 | حالة موازن تحميل HTTPS | VIRTUAL_HOST_READY | لا | ناجح / معلق / معلوماتي |
| TLS-1 | حالة الشهادة | CertificateValid | لا | ناجح / معلق / معلوماتي |
| CSD-1 | تهيئة JS | scriptTag موجود | نعم | ناجح / فاشل |
| CSD-2 | حالة CSD | isEnabled: 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 — الهجوم لتشغيل محاكاة الهجوم.