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

+32
View File
@@ -532,3 +532,35 @@ type MatrixException struct {
// Marks are the counters behind Hits ("r12", "b-ping", "f3").
Marks []string `json:"-"`
}
// BanInput asks a ban list to ban an address (POST
// /banlists/{list}/bans).
type BanInput struct {
Address string `json:"address"`
// Protocol (tcp, udp) and Ports limit the ban; with neither, every
// port. Ports are numbers or service names, in a list or a string
// ("22", "ssh", "http,https"); "all", "0:65535" or "1-65535" mean
// every port. Ports without a protocol take the service's protocols,
// or for a number tcp and udp.
Protocol string `json:"protocol,omitempty"`
Ports json.RawMessage `json:"ports,omitempty"`
// Time is the ban's length in seconds: 0 the list's default, -1 its
// longest (or for ever). Longer than the list allows is cut down.
Time int `json:"time,omitempty"`
Source string `json:"source,omitempty"`
Reason string `json:"reason,omitempty"`
}
// BanResult is the answer to a ban: the bans made or renewed (one per
// protocol and port), Existing for each already in force.
type BanResult struct {
Bans []BanMade `json:"bans"`
// Closed counts the banned address's connections closed.
Closed int `json:"closed"`
}
// BanMade is a ban made, or renewed (Existing).
type BanMade struct {
model.Ban
Existing bool `json:"existing,omitempty"`
}