Integrations
Integration failures
Status: SUPPORTED for implemented integrations only. Terraform/Ansible/Puppet/OIDC/Kubernetes/GraphQL are NOT_SUPPORTED.
Symptom
An integration that is documented as implemented does not connect, sync, notify, scrape, or observe. This is not one code path — diagnose by integration name.
Likely verified causes (class)
- Edition mismatch: Cloudflare HTTP group and unblock portal are Enterprise-only in V1 routers. Community does not ship those groups.
- Missing or wrong secret (token, MaxMind key, SMTP password, webhook secret, captcha secret).
- Feature not enabled in Manager YAML / security settings.
- License gate on Enterprise writes (
403 LicenseErrorResponse). - Agent profile mismatch (libvirt on Hosting; ModSecurity per-site files vs global metadata).
/metricsscraped without admin auth.- Treating optional sync as always-on bidirectional.
Diagnostic commands/endpoint
Manager must be ready. Admin JWT unless noted.
Per-integration endpoints are listed below. Generic:
zwallctl login --manager-url https://manager.example.com:8443 --username adminDo not put tokens, SMTP passwords, or webhook secrets on argv.
Cloudflare (ENTERPRISE_ONLY)
Symptom. Blocks do not appear in Cloudflare; connect/health fails.
Causes. Not Community. Missing cloudflare_api_token / zone. License feature gate. Sync not triggered (auto_sync / sync_on_block not assumed always-on).
Diagnostics.
PUT /api/v1/integrations/cloudflare/config
POST /api/v1/integrations/cloudflare/connect
POST /api/v1/integrations/cloudflare/verify
GET /api/v1/integrations/cloudflare/health
GET /api/v1/integrations/cloudflare/status
POST /api/v1/integrations/cloudflare/sync
GET /api/v1/integrations/cloudflare/rulesResults. 403 license → entitlement. Connect fail → token/zone. Health OK but rules missing → trigger /sync; do not assume bidirectional certified sync.
Remediation. Scope a zone token; store as systemd credential cloudflare_api_token / CLOUDFLARE_API_TOKEN. Manual /sync after a lab block.
Do not. Document as Community. Document as always-on. Use the token as a global Cloudflare admin if a zone token suffices.
GeoIP / MaxMind
Symptom. Country rules do not match; /geoip/status empty or error.
Causes. Database file missing or not on an allowlisted path. security.geoip.enabled false. MaxMind credentials wrong. Agent geoip.database_path unset if local lookup is expected.
Diagnostics.
GET /api/v1/geoip/status
POST /api/v1/geoip/rules
POST /api/v1/geoip/lookupConfig keys: security.geoip.* (database_path, maxmind_account_id, maxmind_license_key, auto_update, allow_on_lookup_failure). Secret: maxmind_license_key / ZCS_MAXMIND_LICENSE_KEY.
Results. Status without a DB → place file under validated allowlists (/usr/share/GeoIP, /var/lib, /opt/zcs, /etc/zcs). Lookup of TEST-NET may not exist in the DB.
Remediation. Install the GeoIP database; enable GeoIP; keep the MaxMind key in credential custody, not git.
Do not. Treat lookup as a public unauthenticated API. Claim zero performance penalty.
External blocklists
Symptom. Lists do not update; check-IP misses entries.
Causes. security.blocklists.enabled false (example default false). URL fetch timeout. Format mismatch. License gate on Enterprise writes.
Diagnostics.
GET /api/v1/blocklists/stats
POST /api/v1/blocklists/sync
GET /api/v1/blocklists/check/:ipSources: HTTP or file; update_interval, timeout, example cron 0 2 * * *.
Remediation. Enable, add a source, /sync, verify with a TEST-NET address you inserted.
Do not. Name unaudited third-party feeds as certified. Treat list URLs as supply chain.
DNS RBL
Symptom. RBL hits missing; auto-block not occurring.
Causes. security.rbl.enabled false (example). Zones not configured. DNS to RBL operators failing. auto_block off.
Diagnostics.
POST /api/v1/security/rbl-check
GET /api/v1/security/rbl-statsRemediation. Enable sources; understand auto_block / block_duration / whitelist. Enterprise writes may be license-gated.
Do not. Treat RBL as a compliance certification. DNS to public RBLs leaks query IPs to those operators.
Notifications (email / webhook / Slack)
Symptom. No mail or webhook delivery.
Causes. SMTP host/recipients missing (validation requires SMTP host and at least one recipient when email enabled). Wrong smtp_password. Webhook URL unset. Slack is incoming-webhook URL only.
Diagnostics.
GET /api/v1/notifications/health
GET /api/v1/notifications/:id/deliveries
GET /api/v1/settings/notificationsPOST /settings/notifications/test sends real mail — prefer a lab notification object.
Remediation. Configure SMTP (notifications.email.*, example port 587) or webhook (timeout example 10s) without committing secrets. Confirm health and delivery attempts.
Do not. Treat this as SIEM/Splunk. Put SMTP passwords in tickets.
ModSecurity observation
Symptom. No alerts; Hosting ModSecurity collector blocked.
Causes. Webhook secret mismatch. Hosting per-site audit files absent (global metadata-only collector). permission_blocked on /var/log/modsec_audit.log (example). Not a hosted WAF.
Diagnostics.
POST /api/v1/modsecurity/webhook # HMAC/signature; not JWT
GET /api/v1/security/modsecurity/stats
GET /api/v1/security/modsecurity/alertsHosting: collector id hosting.modsecurity.global.metadata.v1 (and related observe IDs). Secret: modsecurity_webhook_secret / ZCS_MODSECURITY_WEBHOOK_SECRET.
Remediation. Align HMAC secret; Hosting: exact-path ACL. Lab signed webhook → alert list.
Do not. Claim OWASP CRS as a Zwall-operated WAF. chmod 777 /var/log. Publish webhook URLs.
libvirt / KVM
Symptom. Empty VM list; no interface inventory.
Causes. Not KVM/libvirt. Wrong URI (typical qemu:///system). Hosting Agent used. Wrong vm_bridge_name (example viifbr0). Agent not root.
Diagnostics. Operator virsh -c qemu:///system list --all (not a Zwall command).
GET /api/v1/virtualization/vms
POST /api/v1/virtualization/vm-data # AgentRemediation. Install Virtualization Agent on the hypervisor host; correct URI/bridge. See libvirt.
Do not. Claim VMware/Hyper-V/Kubernetes. Enrich Hosting with VM inventory.
Prometheus
Symptom. Scrape 401/403 or empty.
Causes. metrics.enabled false. Scrape without admin JWT/session + RoleAuth("admin"). Wrong path (metrics.path, default /metrics).
Diagnostics. GET /metrics as an admin-capable client. 200 Prometheus text when enabled.
Remediation. Enable metrics; scrape with admin credentials. Import shipped Grafana JSON into your Grafana. Agent metrics default disabled, bind example 127.0.0.1:9090.
Do not. Expose unauthenticated /metrics on the internet. Enable cluster-ha.json as certified HA (cluster is not a public HA product).
Unblock portal (ENTERPRISE_ONLY)
Symptom. Public form missing or requests not listed.
Causes. Not in Community V1 router. security.messenger disabled. Captcha secrets missing (recaptcha_secret_key / hcaptcha_secret_key).
Diagnostics.
GET /api/v1/public/messenger/config
POST /api/v1/public/unblock-request
GET /api/v1/admin/unblock-requests
POST /api/v1/admin/unblock-requests/:id/reviewRemediation. Enable messenger + captcha; review as admin. Implemented UX, not a certified support product.
Do not. Log capability tokens from GET .../unblock-request/:token.
What each result means
See tables above. 403 LicenseErrorResponse is the Enterprise license envelope (success, code, message, license). Community 404 on Cloudflare/unblock routes is edition, not a broken Manager.
Safe remediation
Fix edition, secret custody, enable flags, and Agent profile. Re-test the integration’s health/status endpoint. Do not widen CORS or disable TLS to make a webhook easier.
Do-not-do warnings
- Do not document Cloudflare or the unblock portal as Community.
- Do not put integration secrets in YAML git or argv.
- Do not claim bidirectional Cloudflare or certified ACME DNS-01.
- Do not treat
/metricsas unauthenticated. - Do not invent Terraform/Ansible/OIDC/Kubernetes integrations.
Escalation condition
Escalate when health endpoints succeed, credentials are valid, license allows the feature, and the remote system still never receives a lab change — after capturing redacted health JSON (no tokens).
Related documentation
- Integrations index
- Cloudflare (Enterprise-only; setup provided separately to Enterprise customers)
- GeoIP
- Blocklists
- RBL
- Notifications
- ModSecurity
- libvirt
- Prometheus
- Unblock portal (Enterprise-only; setup provided separately to Enterprise customers)
- Manager authentication
Edition
SHARED: GeoIP, blocklists, RBL, notifications, ModSecurity observe, libvirt, Prometheus. ENTERPRISE_ONLY: Cloudflare HTTP group, unblock portal. Community ignores letsencrypt YAML.
Status
SUPPORTED for implemented health/status diagnosis. Not certified always-on integrations.