eBPF
Kernel / eBPF / capabilities
Symptom
- Virtualization Agent exits at start (eBPF preflight, not root, missing
/sys/fs/bpf) - XDP/TC attach failure
- Hosting network telemetry missing because the pass-only loader failed
verify_artifact_integrityrejects objects- operators expected UID/GID filtering to drop packets
Likely verified causes
- Virtualization Agent not running as root with the unit’s bounded capabilities.
/sys/fs/bpfnot writable by the unit (ReadWritePathsincludes/sys/fs/bpf).- Kernel below
ebpf.min_kernel_version(example"5.8.0") withstrict_kernel_version_check: true. - Wrong object: Virtualization
firewall.o/firewall_egress.ovs Hosting loaderhosting_observe.o(pass-only). verify_artifact_integrity: truechecksum mismatch;allow_unsigned_artifacts: falsein the Virtualization example.xdp_attach_mode(auto|native|generic|offload) incompatible with this NIC/driver.- Hosting loader missing
ZWALL_HOSTING_EBPF_SHA256/ interfaces env, or socket not created. - UID/GID V3 enabled in example YAML (
enable_uid_gid_filtering: true) despite incomplete ABI. - OS/kernel "fully supported" table from internal ops copied as a guarantee (not certified).
Diagnostic commands/endpoints
Units (Enterprise tree):
Scroll sideways to see the full table. Use the arrow keys when focused.
| Unit | User | Capabilities (unit file) |
|---|---|---|
zwall-agent.service | root | CAP_DAC_READ_SEARCH CAP_IPC_LOCK CAP_NET_ADMIN CAP_NET_RAW CAP_SYS_ADMIN CAP_SYS_RESOURCE; ReadWritePaths includes /sys/fs/bpf |
zwall-hosting-ebpf-loader.service | root then drop | CapabilityBoundingSet=CAP_CHOWN CAP_SYS_ADMIN CAP_NET_ADMIN; loads /opt/zwall-hosting/ebpf/hosting_observe.o |
zwall-hosting-agent.service / v2 | zwall-hosting | empty capabilities; no firewall objects |
sudo systemctl status zwall-agent
sudo journalctl -u zwall-agent -n 200 --no-pager
sudo systemctl status zwall-hosting-ebpf-loader
ls -l /run/zwall-hosting-ebpf/observer.sock
uname -rGET /api/v1/dashboard/ebpf-health
GET /api/v1/dashboard/ebpf-health?agent_id=<id>Enterprise only. Community router: no ebpf-health handler.
On-node maps (Virtualization): zwallctl map ls (default pin dir /sys/fs/bpf/fw).
Example Agent keys (configs/agent.example.yml):
ebpf.program_path: /opt/zcs/ebpf/firewall.oebpf.tc_program_path: /opt/zcs/ebpf/firewall_egress.oebpf.xdp_attach_mode: autoebpf.min_kernel_version: "5.8.0"ebpf.strict_kernel_version_check: trueebpf.verify_artifact_integrity: trueebpf.allow_unsigned_artifacts: falseebpf.checksums_manifest_path: /opt/zcs/ebpf/ebpf_checksums.txt
Hosting examples set verify_artifact_integrity: false on that profile’s YAML — Hosting still requires the loader SHA256 env (ZWALL_HOSTING_EBPF_SHA256). Do not copy Hosting’s integrity flag onto a Virtualization Agent.
What each result means
Scroll sideways to see the full table. Use the arrow keys when focused.
| Result | Meaning |
|---|---|
| Agent fatal not root (Hosting disabled) | Enforcement Agent must be root. Hosting-enabled Agents run unprivileged. |
| Preflight kernel too old | min_kernel_version 5.8.0 example vs host. Hosting isolated tests used Ubuntu 20.04 5.4.0-216-generic — different profile, not a matrix. Community README states 4.15+ (5.4+ recommended). Do not collapse these. |
| checksum mismatch | Replace artifacts from the admitted release. |
allow_unsigned_artifacts would “fix” it | Break-glass only. |
xdp_attach_mode: auto fails native | Example comment: try native then generic. generic is a controlled fallback, not a PPS claim. |
offload fails | NIC/driver does not offload; pick native or generic. |
| loader inactive / socket missing | Hosting network telemetry cannot flow. |
ebpf-health ebpf_loaded: false / unhealthy | Programs not loaded or map/security-state degraded (Enterprise summary). |
Community 404 on ebpf-health | Expected absence. |
| UID/GID hooks unhealthy | Not a supported customer feature. |
Hosting loader: root owns verified load/attach, then drops to CAP_SYS_ADMIN (map reads) and CAP_NET_ADMIN (owned detach). The unprivileged Agent gets no capability and only the category-safe UNIX socket.
Safe remediation
- Virtualization: run
zwall-agent.serviceas shipped (root + bounded caps). Do not emptyCapabilityBoundingSetand expect attach to work. - Ensure
/sys/fs/bpfis mounted and in the unitReadWritePaths. - Use objects from the admitted release; keep
verify_artifact_integrity: trueon Virtualization. - If attach fails: try
genericonly as a controlled fallback. Do not disable integrity. - Hosting: start loader with
--object /opt/zwall-hosting/ebpf/hosting_observe.oand the SHA256 env; confirm socket; then start the Agent. - Set
enable_uid_gid_filtering: falseuntil engineering publishes a complete contract. - Do not attach firewall programs on Hosting nodes.
Do-not-do warnings
- Do not document UID/GID V3 as supported even though example YAML enables it.
- Do not publish a “fully supported” distro/kernel table.
- Do not publish PPS or latency.
- Do not set
allow_unsigned_artifacts: truein production. - Do not grant Hosting Agent
CAP_NET_ADMIN/CAP_SYS_ADMIN. - Do not copy Hosting
verify_artifact_integrity: falseonto Virtualization. - Do not treat Community README 4.15+ as the Enterprise Virtualization example 5.8.0 check.
Escalation condition
Escalate when:
- kernel meets the profile’s configured
min_kernel_version, capabilities match the unit, integrity verifies, and attach still fails on bothnativeandgeneric - Hosting pass-only object drops traffic
- owner needs a single OS matrix — documentation cannot close that
Related documentation
Edition
SHARED Virtualization eBPF. Hosting loader and observer socket ENTERPRISE_ONLY. ebpf-health ENTERPRISE_ONLY.
Status
SUPPORTED for unit/config diagnosis. The kernel-matrix and UID/GID-contract issues remain product gaps.