UFW Baseline
Security → UFW. The simple port-open / port-close baseline. M43 (ADR-0089) reduced UFW to this role; IP-trust decisions live in CrowdSec Decisions.
Default rules
The installer applies:
| Port | Protocol | Purpose |
|---|---|---|
| 22 | tcp | SSH and SFTP |
| 25 | tcp | SMTP MTA |
| 53 | tcp+udp | PowerDNS authoritative |
| 80 | tcp | HTTP (and ACME HTTP-01) |
| 443 | tcp | HTTPS |
| 465 | tcp | SMTP submission TLS |
| 587 | tcp | SMTP submission STARTTLS |
| 993 | tcp | IMAPS |
| 995 | tcp | POP3S (only if POP3 enabled in Stalwart) |
Default policy: deny incoming, allow outgoing (outbound per-user is constrained by Egress).
Page surface
- The current ruleset rendered as a sortable table.
- Per-row Disable to take a port closed.
- Add port form for non-standard ports (additional SSH, alternate web port).
- A warning panel listing any rule of the form
from <ip>— the M43 migration replaced these with CrowdSec decisions; the warning surfaces any that escaped migration.
Migrating from old ufw deny
jabali ufw migrate-ip-bans
Walks ufw status numbered, lifts every from <ip> deny rule into a CrowdSec decision with reason=migrated-from-ufw, then deletes the UFW rule. Idempotent.
Why this split
UFW is excellent at static port baselines, and the operator-readable syntax stays useful for “is :25 open?” debugging. UFW is a poor fit for the high-cardinality, short-lived per-IP block decisions CrowdSec produces (the ruleset becomes unwieldy at >1000 entries). Splitting the responsibilities keeps each tool playing to its strengths.
IPv6
The same port rules apply over IPv6. CrowdSec scenarios match both address families uniformly.
CLI
Standard UFW commands work:
ufw status numbered
ufw allow 8443/tcp
ufw delete <rule-number>
…but for IP-blocking always use cscli instead of ufw deny from.