Ban lists: where Guard and fail2ban ban addresses

A program bans an address (every port, or a protocol's ports) for a
time; the ban list says what it is kept from: the firewall, some hosts
behind it, or everything. Bans drop ahead of every rule, close the
address's connections, group IPv6 by /64, are kept in the database
across restarts and audited. Never banned: the inside, the firewall's
own addresses, the caller, the list's never. bans grant (bans:write:LIST),
hc banlist/bans/ban/unban, Traffic -> Bans, a fail2ban action in contrib/,
and failed logins and refused tokens logged for Guard and fail2ban.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
abrown38andClaude Opus 5.5 committed 2026-10-22 16:29:37 +01:00
1 parent 6f56eefae2
commit 500bfc7bdd
44 files changed
+2541 -39

No files matched your search

+24
View File
@@ -8,6 +8,28 @@ All notable changes to Housecarl are documented here. The format follows
### Added
- **Ban lists** ([docs/bans.md](docs/bans.md)). A program (Guard, which
reads logs, or fail2ban) bans an address, of every port or of some,
for a time; the ban list says what the address is kept from: the
firewall itself (`firewall`), some hosts behind it (`hosts`, port
forwards to them included), or `everything`. Bans are dropped ahead of
every rule, established connections too, and the banned address's
connections are closed. IPv6 addresses are banned by /64 (`group_v6`).
Never banned: inside networks, the firewall's own addresses, whoever
asks, and the list's `never`. Bans end by themselves, are cut to the
list's longest time, survive restarts and reboots, and are audited, but
aren't configuration (no history, probation or changesets). `hc
banlist`, `hc bans`, `hc ban`, `hc unban`; Traffic → Bans in the web UI;
`/banlists` and `/banlists/{ref}/bans` in the API; a `bans` grant that
can name lists (`bans:write:web`), in the `viewer` and `operator`
roles.
- **A fail2ban action**, `contrib/fail2ban/action.d/housecarl.conf`
(installed under `/usr/share/doc/housecarl/contrib/`): fail2ban's bans
go into a ban list, with the jail's port and protocol.
- **Failed logins in the journal.** A failed login and a refused API
token are logged (`msg="login failed" ip=… user=…`), for Guard and
fail2ban to act on.
- **Quota usage as a share.** What a quota used shows its percentage
(`12.3 GB of 50.0 GB used (24%)`, each address's in the quota
dialog), on the Rules page, the dashboard and in `hc quotas`.
@@ -81,6 +103,8 @@ All notable changes to Housecarl are documented here. The format follows
### Changed
- Set names starting with `ban_` are now reserved (`set_name_reserved`):
ban lists' sets use them.
- **Rules read as a direction.** A match's zones are written `lan → wan`,
`any but wan → any`, or with the firewall itself as the other end
(`lan → firewall` in input, `firewall → wan` in output), instead of