Different blocking for different devices: steps and client groups

Client groups put devices (addresses, networks, or ACLs of them) at a
blocking step: off (only your rules), normal (the default), or steps
added above it, each including the lists of the steps below. Lists
start at a step. In each view, a gate policy zone in front of a step's
lists lets the devices below that step through (rpz-client-ip triggers
with rpz-passthru), so every list is still loaded once. The IPv6 part
of a gate leaves the IPv4-mapped range out: named matches IPv4 clients
as ::ffff:a.b.c.d.

Web UI: a Devices panel on the Blocking page and a step on each list.
CLI: jarl block step, jarl block group, jarl blocklist --step. API:
/blocking/steps, /blocking/groups. Database schema 8.

Also: copying the state kept empty lists as empty (not nil), so
reverting a changeset no longer adds restore operations for unchanged
blocklists, rules and views.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
adamandClaude Opus 5.5 committed 2026-10-11 21:33:16 +01:00
1 parent 5b8f681e2a
commit 76aaaf3ef5
33 files changed
+2096 -55

No files matched your search

+15 -1
View File
@@ -17,7 +17,8 @@ All notable changes to Jarl are documented here. The format follows
- The systemd unit changed (it allows `AF_NETLINK`). The package replaces
it; an override that adds `AF_NETLINK` (`systemctl edit jarl`) does no
harm and can be removed.
- The database moves to schema 7 (disabled zones) as jarld starts.
- The database moves to schema 8 (disabled zones, client groups) as
jarld starts.
- If statistics showed a spike after views were created or changed, see
"Statistics" under Fixed: the bad minutes can be removed from
`/var/lib/jarl/stats.db` (minute rows have `res = 'm'`; the hours and
@@ -25,6 +26,16 @@ All notable changes to Jarl are documented here. The format follows
### Added
- Different blocking for different devices (docs/blocking.md), like
Pi-hole's groups, in one view and without loading any list twice.
Client groups put devices (addresses, networks or ACLs of them) at a
blocking step: `off` (only your rules), `normal` (the default), or steps
you add above it, each including the lists of the steps below. Lists
start at a step. Jarl puts a small "gate" policy zone in front of each
step's lists that lets the devices below that step through. Web UI: a
Devices panel on the Blocking page and a step on each list. CLI: `jarl
block step`, `jarl block group`, `jarl blocklist update --step`. API:
`/blocking/steps`, `/blocking/groups`. Database schema 8.
- View keys: every view gets a TSIG key, `jarl-view-NAME`, at the front of
its match-clients, so a query signed with it lands in that view from any
address. Jarl signs its delegation check's queries to this server's own
@@ -140,6 +151,9 @@ All notable changes to Jarl are documented here. The format follows
### Fixed
- Reverting a changeset added needless "restore" operations for
blocklists, rules and views that hadn't changed: copying the state
turned their empty view lists into missing ones.
- Under the shipped systemd unit, jarld couldn't list the host's
addresses (it needs a netlink socket, which `RestrictAddressFamilies`
didn't allow), so the name server checks didn't recognize this server's