Troubleshooting
Hosting Agent troubleshooting
Purpose
Diagnose missing Hosting telemetry, permission-blocked collectors, loader/socket failures, and accidental enforcement-profile mix-ups without turning the node into a drop engine.
Audience
On-call operators with admin access to the Manager and root on the hosting node.
Edition
ENTERPRISE_ONLY.
Status
SUPPORTED diagnostics. If pass-only programs drop traffic, escalate as a product defect; do not load firewall.o on the hosting node.
Prerequisites
- Admin JWT for
GET /api/v1/agents/:id/hosting/statusand/hosting/events journalctlon the node- Knowledge of which unit the release installed (
zwall-hosting-agentvszwall-hosting-agent-v2)
Required permissions
Admin on the Manager. Root on the node for unit/socket/ACL inspection. Do not grant the Agent extra capabilities as a “fix.”
Procedure — first five checks
systemctl is-active zwall-hosting-ebpf-loadersystemctl is-active zwall-hosting-agentorzwall-hosting-agent-v2ls -l /run/zwall-hosting-ebpf/observer.sock- Confirm YAML
hosting.enabled: true,hosting.enforcement: false,agent.protection_model: hosting - As admin:
GET /api/v1/agents/:id/hosting/status
Heartbeat must show observation-only. If the Agent is listed as a Virtualization enforcement node, you are on the wrong unit.
Symptom table
Scroll sideways to see the full table. Use the arrow keys when focused.
| Symptom | Likely verified causes | Diagnostic | Safe remediation |
|---|---|---|---|
| No hosting status / 404 | Wrong Agent id; profile is not Hosting v2 | GET /api/v1/agents/:id; protection_model; unit name | Enroll a Hosting Agent; do not assign Hosting APIs to a virt Agent |
| Unit inactive | loader/Agent not started; start-limit burst | systemctl status; StartLimitBurst=3 | start loader first, then Agent |
| Agent fatals must run as root | Hosting not enabled so root check applies | hosting.enabled | enable Hosting profile or you installed zwall-agent.service |
Collectors permission_blocked | file ACL; v2 unit has only adm | Hosting status permission_status; namei -l PATH | grant exact-path read to zwall-hosting. Do not chmod 777 /var/log. Do not add a customer-content group |
source_not_present | path not on this OS | compare example path vs host | retarget hosting.sources[].path or accept absence (PHP-FPM / MariaDB alternate) |
parser_unsupported | unknown source id | status ParserVersion / id | use inventory ids only |
| No log events in Manager | source not active; events are category-safe so “missing IPs” is expected | /hosting/events projection fields; parser health | fix source state first; do not expect raw payload |
| No network telemetry | loader not attached; socket missing; SHA-256 mismatch | loader journal; ZWALL_HOSTING_EBPF_SHA256; socket path | start loader; fix env digest; confirm --interfaces |
Preflight INCOMPATIBLE | capabilities, Manager URL, probe id | printed reason | Agent must lack CAP_NET_ADMIN/CAP_NET_RAW; Manager /api/v1/health 200; probe id [A-Za-z0-9][A-Za-z0-9_-]{7,63} |
| Unexpected drops | Virtualization firewall programs on the node | systemctl is-active zwall-agent; ebpf.program_path | stop zwall-agent.service; keep Hosting units only |
| Restart API 409 | Hosting cannot receive restart commands | POST /api/v1/agents/:id/restart | systemctl restart the Hosting Agent unit |
| Rules API 409 | Hosting cannot receive rules | assign-rule response | assign rules to a Virtualization Agent |
| Agent refuses YAML | hybrid protection model, enforcement true, metrics enabled, virt/geoip/smtp/uid-gid flags | journal validation error | restore v2 example fail-closed keys (the hybrid example misleads vs Hosting identity) |
| Token/env leftover | bootstrap still in environment | systemctl show-environment | Hosting main unsets AGENT_TOKEN/AGENT_PRE_TOKEN after load; do not persist them in the unit |
Diagnose missing telemetry (ordered)
- Unit and loader socket. If the socket is missing, collectors may still tail logs, but network observation will not.
- Source state.
permission_blocked/source_not_present/parser_unsupported— fix ACL or path; do not claim the product is inactive. - Parser health. Status includes parser bundle / per-source parser version. Mismatch after upgrade → run Hosting upgrade preflight, do not force updater campaigns.
- Heartbeat
observation_only. If false, you are not on the Hosting contract. - Manager ingest. Hosting events API filters
IsHostingEventType. Security-log list may contain other Agents’ events; use the Hosting projection. - Category-safe contract. Absence of customer IPs is success, not data loss in this API. Lossless delivery is not claimed.
Verification after repair
- Both units
active - Status
runtime_available: trueonce a heartbeat with Hosting status has been accepted - Intended sources
active/ readable - Network drops remain zero
GET /api/v1/agents/:id/hosting/eventsreturns projection rows without raw bodies
Expected result
A specific source state or unit failure, not a generic “Hosting is down.”
Failure modes that are not operator-fixable here
Scroll sideways to see the full table. Use the arrow keys when focused.
| Issue | Class |
|---|---|
| No universal ACL pack | no shipped universal ACL pack |
hybrid example misleading vs Hosting | hybrid example vs Hosting profile identity |
| Pass-only program drops packets | product defect — escalate |
| Kernel matrix for every hosting distro | OS/kernel matrix not certified |
Security considerations
- Do not attach customer log excerpts to tickets.
- Do not disable
verify_tls. - Do not run the Agent as root “to read logs.” Grant the file, keep the user.
Limitations
Hosting restart/rule APIs returning 409 is correct behavior. Troubleshooting is not a reason to switch the node to Virtualization enforcement.