Zum Inhalt springen

Phase 1 — Build

Phase 1 stellt die vollständige CSD-Infrastruktur bereit und validiert sie. Alle Schritte müssen der Reihe nach abgeschlossen werden — jeder Schritt muss BESTANDEN sein, bevor fortgefahren wird. Kehren Sie zum Index zurück, um die Umgebungseinrichtung und Variablenauflösung abzuschließen, bevor Sie diese Befehle ausführen.

Schritt 0: Namespace prüfen und erstellen (bedingt)

Abschnitt betitelt „Schritt 0: Namespace prüfen und erstellen (bedingt)“

Prüfen Sie, ob der Ziel-Namespace bereits im Tenant vorhanden ist. Falls nicht, erstellen Sie ihn. Verfolgen Sie das Ergebnis in der Shell-Variable NAMESPACE_CREATED — Phase 4 des Abbaus verwendet diese Variable, um zu entscheiden, ob der Namespace gelöscht werden soll.

Terminal-Fenster
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

Bestätigen Sie, dass der Namespace vorhanden ist, und notieren Sie, ob er erstellt wurde:

Terminal-Fenster
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"
FeldErwartetStatus
HTTP-Status200BESTANDEN wenn zurückgegeben, FEHLGESCHLAGEN wenn 404 oder anderes
NAMESPACE_CREATEDtrue (erstellt) oder false (bereits vorhanden)Informativ — wird von Phase 4 des Abbaus verwendet

Erstellen Sie einen HTTP-Healthcheck, den der Ursprungspool zur Überwachung des Backend-Zustands verwenden kann.

Terminal-Fenster
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 .

Eine 200-Antwort mit dem erstellten Objekt bestätigt, dass der Healthcheck erstellt wurde. Wenn die Antwort "code": 8 mit einer Meldung wie "Object kind healthcheck has exhausted limits(150)" enthält, hat der Tenant sein Healthcheck-Limit erreicht — fahren Sie mit Schritt 2 fort und lassen Sie die Healthcheck-Referenz weg. CSD ist nicht von der Zustandsüberwachung abhängig.

Bestätigen Sie, dass der Healthcheck vorhanden ist:

Terminal-Fenster
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}'
FeldErwartetStatus
HTTP-Status200 mit ObjektBESTANDEN wenn zurückgegeben, FEHLGESCHLAGEN wenn 404
nameEntspricht F5XC_HC_NAMEBESTANDEN
path/BESTANDEN
Schritt 1 übersprungen (Fehlercode 8, Limit ausgeschöpft)BESTANDEN (Healthcheck ist für CSD optional)

Erstellen Sie einen Ursprungspool, der auf Ihren Backend-Server verweist. Wenn Sie in Schritt 1 einen Healthcheck erstellt haben, fügen Sie die healthcheck-Referenz ein. Wenn Schritt 1 übersprungen wurde, verwenden Sie ein leeres Array.

Mit Healthcheck (Schritt 1 erfolgreich):

Terminal-Fenster
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 .

Ohne Healthcheck (Schritt 1 übersprungen):

Terminal-Fenster
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 .

Eine 200-Antwort bestätigt, dass der Ursprungspool erstellt wurde.

Wenn Sie eine Healthcheck-Referenz eingefügt haben, bestätigen Sie, dass sie korrekt verknüpft ist:

Terminal-Fenster
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/origin_pools/xF5XC_ORIGIN_POOLx" \
| jq '.spec.healthcheck'

Ein gefülltes Array bestätigt die Verknüpfung. Ein leeres Array [] ist zu erwarten, wenn Schritt 1 übersprungen wurde, oder bedeutet, dass der Healthcheck nicht gefunden wurde, wenn Sie eine Verknüpfung beabsichtigt hatten.

Bestätigen Sie, dass der Ursprungspool vorhanden ist und die korrekte Konfiguration aufweist:

Terminal-Fenster
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)}'
FeldErwartetStatus
HTTP-Status200BESTANDEN wenn zurückgegeben, FEHLGESCHLAGEN wenn 404
nameEntspricht F5XC_ORIGIN_POOLBESTANDEN
origin_ipEntspricht F5XC_ORIGIN_IPBESTANDEN
portEntspricht F5XC_ORIGIN_PORTBESTANDEN
healthcheck_count1 (mit HC) oder 0 (ohne)BESTANDEN in beiden Fällen

Erstellen Sie zwei Load Balancer mit aktivierter Clientseitiger Abwehr — einen HTTP-LB (primär, Port 80) und einen HTTPS-LB (sekundär, Port 443 mit automatischer Zertifikatsverwaltung). Der HTTP-LB ist der Standard für den gesamten Demo-Datenverkehr. Der HTTPS-LB ist ein Nice-to-have, das von der Let’s Encrypt-Zertifikatbereitstellung abhängt, die in Demo-Umgebungen auf Ratenlimits stoßen kann.

Dies ist der primäre Load Balancer für Demos. Er verwendet einen http-Listener auf Port 80 mit F5 XC verwaltetem DNS. Er ist nicht von der TLS-Zertifikatbereitstellung abhängig und wird daher sofort nach der DNS-Auflösung betriebsbereit.

Terminal-Fenster
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 .

Eine 200-Antwort bestätigt, dass der HTTP-Load-Balancer mit aktiviertem CSD erstellt wurde.

Dies ist der sekundäre Load Balancer. Er verwendet https_auto_cert auf Port 443 mit automatischer Let’s Encrypt-Zertifikatbereitstellung. Prüfen Sie vor der Erstellung, ob ein HTTPS-LB-Skelett aus einem vorherigen Abbau vorhanden ist — falls ja, stellen Sie es über PUT statt POST wieder her, um das vorhandene Let’s Encrypt-Zertifikat zu erhalten und Ratenlimits zu vermeiden (5 doppelte Zertifikate pro exakter Bezeichner-Menge pro 7 Tage).

Prüfen, ob der HTTPS-LB bereits vorhanden ist:

Terminal-Fenster
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")

Wenn HTTPS_CHECK 200 ist, existiert ein HTTPS-LB-Skelett — verwenden Sie Pfad A (PUT). Bei 404 verwenden Sie Pfad B (POST).

Pfad A: Skelett über PUT wiederherstellen (HTTPS-LB vorhanden)

Abschnitt betitelt „Pfad A: Skelett über PUT wiederherstellen (HTTPS-LB vorhanden)“

Wenn ein HTTPS-LB-Skelett aus einem vorherigen Abbau vorhanden ist, stellen Sie die vollständige Konfiguration über PUT wieder her. Dadurch wird der Ursprungspool neu verknüpft und CSD wieder aktiviert, ohne eine neue Let’s Encrypt-Zertifikatsanforderung auszulösen — das vorhandene Zertifikat bleibt gültig.

Terminal-Fenster
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 .

Eine 200-Antwort bestätigt, dass das Skelett mit der vollständigen Konfiguration wiederhergestellt wurde. Der Zertifikatsstatus sollte CertificateValid bleiben — es wird keine neue Let’s Encrypt-Bereitstellung ausgelöst.

Pfad B: Neu über POST erstellen (HTTPS-LB nicht vorhanden)

Abschnitt betitelt „Pfad B: Neu über POST erstellen (HTTPS-LB nicht vorhanden)“

Wenn kein HTTPS-LB vorhanden ist (erster Durchlauf oder nach einem vollständigen Abbau), erstellen Sie ihn über POST. Dadurch wird die Let’s Encrypt-Zertifikatbereitstellung ausgelöst, die 5–10 Minuten dauern kann.

Terminal-Fenster
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 .

Eine 200-Antwort bestätigt, dass der HTTPS-Load-Balancer erstellt wurde. Die Zertifikatbereitstellung beginnt automatisch.

Bestätigen Sie, dass beide Load Balancer mit aktiviertem CSD vorhanden sind. Verwenden Sie für den Nachweis immer einen GET — die POST-Antwort gibt transiente Zustandswerte zurück, die möglicherweise nicht die eingeschwungene Konfiguration widerspiegeln.

HTTP-LB (primär):

Terminal-Fenster
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}'
FeldErwartetStatus
HTTP-Status200BESTANDEN wenn zurückgegeben, FEHLGESCHLAGEN wenn 404
name${F5XC_LB_NAME}-httpBESTANDEN
domainsEnthält F5XC_DOMAINNAMEBESTANDEN
csd_enabledtrueBESTANDEN — CSD ist für diesen LB konfiguriert
stateVIRTUAL_HOST_READY oder VIRTUAL_HOST_PENDING_A_RECORDErwartet — HTTP-LB wechselt zu READY sobald DNS aufgelöst ist. Jeder andere Zustand (z. B. VIRTUAL_HOST_FAILED) ist ein FEHLSCHLAG — an Operator melden und nicht fortfahren

HTTPS-LB (sekundär):

Terminal-Fenster
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}'
FeldErwartetStatus
HTTP-Status200BESTANDEN wenn zurückgegeben, FEHLGESCHLAGEN wenn 404
name${F5XC_LB_NAME}-httpsBESTANDEN
domainsEnthält F5XC_DOMAINNAMEBESTANDEN
csd_enabledtrueBESTANDEN — CSD ist für diesen LB konfiguriert
creation_methodPUT (Skelett wiederhergestellt) oder POST (neu)INFO — PUT erhält vorhandenes Zertifikat
stateVIRTUAL_HOST_READY (PUT) oder VIRTUAL_HOST_PENDING_A_RECORD (POST)Erwartet — PUT-Pfad kann bereits READY sein, da DNS vom Skelett erhalten blieb
cert_stateCertificateValid (PUT) oder PreDomainChallengePending (POST)PUT erhält vorhandenes Zertifikat; POST löst neue Bereitstellung aus

Nach dem Erstellen des Load Balancers wechselt dieser in den Status VIRTUAL_HOST_PENDING_A_RECORD und das automatische Zertifikat verbleibt in PreDomainChallengePending. Zwei DNS-Einträge müssen vorhanden sein, bevor der LB vollständig betriebsbereit wird:

  1. A-EintragxF5XC_DOMAINNAMEx zeigt auf die VIP-IP-Adresse (aus dns_info in der LB-Antwort)
  2. ACME-Challenge-Eintrag_acme-challenge.xF5XC_DOMAINNAMEx für die TLS-Zertifikatsvalidierung (automatisch verwaltet bei Verwendung von F5 XC DNS mit verwalteten Einträgen; manueller CNAME bei externem DNS erforderlich)

Das Vorgehen hängt davon ab, ob F5 XC der autoritäre DNS-Anbieter für Ihre Domain ist.

Prüfen Sie die Nameserver für Ihre Root-Domain:

Terminal-Fenster
dig +short NS xF5XC_ROOT_DOMAINx

Wenn die Antwort ns1.f5clouddns.com und ns2.f5clouddns.com enthält, ist F5 XC der autoritäre DNS-Anbieter — folgen Sie Option A. Andernfalls folgen Sie Option B für externes DNS.

Wenn F5 XC der autoritäre DNS-Anbieter ist, kann die Plattform sowohl den A-Eintrag als auch den ACME-Challenge-CNAME automatisch erstellen — aber nur wenn die DNS-Zone allow_http_lb_managed_records aktiviert hat.

1. Prüfen, ob verwaltete Einträge aktiviert sind:

Terminal-Fenster
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'

Wenn die Antwort true ist, erstellt die Plattform automatisch DNS-Einträge für Load Balancer — fahren Sie mit 3. DNS-Auflösung überprüfen fort. Bei false oder null fahren Sie mit dem nächsten Schritt fort.

2. Verwaltete Einträge aktivieren:

Rufen Sie die aktuelle Zonenkonfiguration ab, aktivieren Sie verwaltete Einträge und aktualisieren Sie:

Terminal-Fenster
# 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 .

Eine 200-Antwort (leeres \{\}) bestätigt, dass die Zone aktualisiert wurde. F5 XC erstellt den A-Eintrag und den ACME-Challenge-Eintrag in der automatisch verwalteten Eintragsgruppe der Zone. Wenn die verwalteten Einträge nicht innerhalb von 60 Sekunden erscheinen, wenden Sie den Load Balancer erneut an, um die Eintragserstellung auszulösen:

Terminal-Fenster
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 .

Dieses GET+PUT-Erneut-Anwenden ändert die LB-Konfiguration nicht — es veranlasst die Plattform lediglich, die DNS-Zone neu auszuwerten und verwaltete Einträge zu erstellen. Wenn der A-Eintrag innerhalb von 60 Sekunden nach dem erneuten Anwenden immer noch nicht aufgelöst wird, stoppen Sie und melden Sie dies dem Operator — wiederholen Sie das erneute Anwenden nicht mehr als einmal.

3. DNS-Auflösung überprüfen:

Terminal-Fenster
dig +short xF5XC_DOMAINNAMEx A

Die Antwort sollte die VIP-IP-Adresse zurückgeben. Die DNS-Übertragung ist für F5 XC verwaltete Zonen in der Regel sofort verfügbar, erlauben Sie jedoch bis zu 60 Sekunden.

Wenn Ihre Domain einen externen DNS-Anbieter verwendet, müssen Sie die Einträge manuell erstellen. Extrahieren Sie die erforderlichen Werte aus dem Load Balancer:

Terminal-Fenster
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
}'

Erstellen Sie diese Einträge bei Ihrem DNS-Anbieter:

TypNameWert
AxF5XC_DOMAINNAMExVIP-IP aus dns_info[0].ip_address
CNAME_acme-challenge.xF5XC_DOMAINNAMEx*.autocerts.ves.volterra.io

Überprüfen Sie nach dem Erstellen der Einträge die Auflösung:

Terminal-Fenster
dig +short xF5XC_DOMAINNAMEx A
dig +short _acme-challenge.xF5XC_DOMAINNAMEx CNAME
TestBefehlErwartetStatus
DNS-1: A-Eintragdig +short $F5XC_DOMAINNAME AVIP-IP-Adresse zurückgegebenBESTANDEN wenn IP zurückgegeben, FEHLGESCHLAGEN wenn leer
DNS-2: ACME-CNAMEdig +short _acme-challenge.$F5XC_DOMAINNAME CNAME*.autocerts.ves.volterra.ioBESTANDEN wenn CNAME zurückgegeben
DNS-Autoritätdig +short NS $F5XC_ROOT_DOMAINF5 XC oder externe NameserverInformativ — bestimmt Option A vs. B

Wenn DNS-1 nach 60 Sekunden leer zurückgibt, siehe Fehlerbehebung — LB verbleibt in VIRTUAL_HOST_PENDING_A_RECORD.

Prüfen Sie, ob Clientseitige Abwehr für den Tenant aktiviert ist. CSD wird auf Tenant-Ebene konfiguriert — wenn es noch nicht aktiviert wurde, wenden Sie sich an Ihren F5 XC Administrator.

Terminal-Fenster
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/status" \
| jq .

Eine Antwort mit "isConfigured": true und "isEnabled": true bestätigt, dass CSD aktiv ist.

Terminal-Fenster
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/status" \
| jq '{configured: .isConfigured, enabled: .isEnabled}'
FeldErwartetStatus
configuredtrueBESTANDEN
enabledtrueBESTANDEN
Eines ist falseFEHLGESCHLAGEN — F5 XC Administrator kontaktieren, um CSD auf Tenant-Ebene zu aktivieren

Registrieren Sie die Root-Domain, die CSD überwachen soll. Das Feld protected_domain muss die eTLD+1-Root-Domain sein (z. B. f5demos.com), nicht der vollständige FQDN.

Prüfen Sie vor dem Erstellen, ob die Domain bereits im Tenant registriert ist. Eine 409-Antwort auf den POST bedeutet, dass die Domain bereits vorhanden ist — dies ist eine Erfolgs- und keine Fehlerbedingung.

Terminal-Fenster
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 .
AntwortBedeutungAktion
200Domain erfolgreich registriertMit Schritt 7 fortfahren
409 (Domain bereits vorhanden)Domain wurde zuvor in diesem Tenant registriertBereits erledigt — mit Schritt 7 fortfahren
"code": 8 (Limit ausgeschöpft)Kontingent für geschützte Domains vollBlockierend — geschützte Domains sind für CSD erforderlich. Nicht verwendete geschützte Domains löschen oder Administrator kontaktieren.

Die POST-Antwort selbst ist der primäre Nachweis — sie gibt das registrierte Domain-Objekt mit spec.protected_domain zurück, das Ihrer Root-Domain entspricht. Alternativ können Sie alle geschützten Domains auflisten, um dies zu bestätigen:

Terminal-Fenster
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/protected_domains" \
| jq '.items | length'
FeldErwartetStatus
POST hat protected_domain zurückgegebenEntspricht F5XC_ROOT_DOMAINBESTANDEN
POST hat 200 oder 409 zurückgegebenDomain registriert oder bereits vorhandenBESTANDEN
Anzahl der Listenelemente> 0BESTANDEN

Bestätigen Sie, dass der A-Eintrag aufgelöst wird und der ACME-Challenge-CNAME vorhanden ist:

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

Der A-Eintrag sollte die VIP-IP-Adresse zurückgeben. Der CNAME sollte auf *.autocerts.ves.volterra.io (oder ein verwandtes autocerts-Ziel) zeigen.

Prüfen Sie, ob beide Load Balancer ihre ausstehenden Zustände verlassen haben. Der HTTP-LB ist die primäre Prüfung — er sollte VIRTUAL_HOST_READY erreichen, sobald DNS aufgelöst ist, ohne Zertifikatsabhängigkeit. Der HTTPS-LB-Zertifikatsstatus ist nur informativ.

HTTP-LB (primär — muss READY sein, um fortzufahren):

Terminal-Fenster
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}'
FeldErwartetZwischenzustände
stateVIRTUAL_HOST_READYVIRTUAL_HOST_PENDING_A_RECORD — DNS nicht konfiguriert (siehe Schritt 4)

HTTPS-LB (sekundär — informativ, blockiert den Fortschritt nicht):

Terminal-Fenster
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}'
FeldErwartetZwischenzustände
stateVIRTUAL_HOST_READYVIRTUAL_HOST_PENDING_A_RECORD — DNS nicht konfiguriert; VIRTUAL_HOST_DNS_A_RECORD_ADDED — A-Eintrag gefunden, warte auf Zertifikat
cert_stateCertificateValidPreDomainChallengePending — warte auf ACME-CNAME; DomainChallengeStarted — ACME-Challenge läuft; AutoCertDomainRateLimited — Let’s Encrypt Ratenlimit erreicht (in Demo-Umgebungen erwartet, betrifft HTTP-LB nicht)
Terminal-Fenster
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/js_configuration" \
| jq .

Die Antwort enthält ein Feld scriptTag mit dem vollständigen HTML-<script>-Tag, das der Load Balancer in Seitenantworten einfügt.

Terminal-Fenster
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}'

Der Skripte-Endpunkt erfordert einen Zeitbereich mit Epoch-Zeitstempeln (Sekunden seit Unix-Epoche). Das folgende Beispiel fragt die letzten 7 Tage ab.

Terminal-Fenster
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}]'

Der Formularfelder-Endpunkt erfordert einen Zeitbereich mit Epoch-Zeitstempeln, die als Abfrageparameter übergeben werden.

Terminal-Fenster
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'

Nach Abschluss aller Überprüfungen sollte der KI-Assistent eine konsolidierte Statustabelle präsentieren:

Test-IDPrüfungErwartetErforderlichStatus
DNS-1A-Eintrag wird aufgelöstVIP-IP zurückgegebenJaBESTANDEN / FEHLGESCHLAGEN
DNS-2ACME-CNAME vorhanden*.autocerts.ves.volterra.ioNeinBESTANDEN / AUSSTEHEND
LB-1HTTP-LB-ZustandVIRTUAL_HOST_READYJaBESTANDEN / AUSSTEHEND
LB-2HTTPS-LB-ZustandVIRTUAL_HOST_READYNeinBESTANDEN / AUSSTEHEND / INFO
TLS-1ZertifikatsstatusCertificateValidNeinBESTANDEN / AUSSTEHEND / INFO
CSD-1JS-KonfigurationscriptTag vorhandenJaBESTANDEN / FEHLGESCHLAGEN
CSD-2CSD-StatusisEnabled: trueJaBESTANDEN / FEHLGESCHLAGEN
CSD-3Geschützte DomainDomain registriertJaBESTANDEN / FEHLGESCHLAGEN

Wenn LB-1 AUSSTEHEND anzeigt, führen Sie alle 30 Sekunden bis zu 4 Iterationen (insgesamt 2 Minuten) eine Abfrage durch. Wenn LB-1 nach 4 Iterationen immer noch nicht VIRTUAL_HOST_READY ist, prüfen Sie die DNS-Auflösung mit dig und melden Sie dies dem Operator — fahren Sie nicht fort, bis LB-1 READY erreicht. Für LB-2 und TLS-1 führen Sie alle 60 Sekunden bis zu 10 Iterationen (10 Minuten) eine Abfrage durch. Wenn nach 10 Iterationen noch ein Zwischenzustand vorliegt, zeichnen Sie den aktuellen Zustand als INFO auf und fahren Sie fort — diese sind informativ und blockieren den Demo-Fortschritt nicht.


Phase 1 abgeschlossen. Fahren Sie mit Phase 2 — Angriff fort, um die Angriffssimulation durchzuführen.