Kurs — every kind of underworld

Each [kur.<name>] hash in the config defines one kur. A kur is either a real kur — a process wrapping one Net::Firewall::BlockerHelper backend, with its own socket, PID file, and clay tablet — or a gate, a fan_out list that opens onto several real kurs.

This page covers the settings every kur shares and points at the detail page for each kind. Each detail page goes deep: what the backend creates, the exact commands or API calls behind every operation, every option, host prerequisites, how self_heal interacts with it, and its particular footguns.

Every kind of kur

Local packet filters...

Network gear and appliances...

Cloud and edge services...

DNS...

Reporting...

Generic...

The authoritative reference for any backend remains its POD on MetaCPAN, under Net::Firewall::BlockerHelper::backends::<backend>.

Settings every kur shares

| key | default | what | |--------------------|-----------------|-----------------------------------------------------------------------| | backend | (required) | one of the backends above; mutually exclusive with fan_out | | fan_out | (unset) | array of other kur names; makes this a gate | | ports | [] | ports to block for; all if unset | | protocols | [] | protocols to block for; backend-dependent default if unset | | prefix | "kur" | rule/table/chain/set name prefix; must match /^[a-zA-Z0-9]+$/ | | self_heal | 1 | check the firewall setup before each ban/unban, re-init if gone | | ban_time | top level / 600 | this kur's default sentence in seconds; 0 = eternal residence | | checkpoint | top level / 60 | seconds between tablet recopies; 0 = mutations/stop only | | enable_cidr | top level / off | whether this kur banishes whole ranges; needs a range-capable backend | | cidr_silent_drop | top level / off | drop rather than error range commands where CIDR is unavailable | | options | {} | backend specific options table; see each backend's page | | authed_users | [] | users granted access to this kur (with enable_auth) | | authed_groups | [] | groups granted access to this kur (with enable_auth) |

Notes that apply across the board...

Choosing an underworld

| backend | platform / where | granularity | kill support | |------------------|------------------------------------|-----------------------------|----------------------------| | pf | FreeBSD, OpenBSD, etc | ports/protocols | yes (states) | | ipfw | FreeBSD | ports/protocols | TCP only (tcpdrop) | | iptables | Linux (+ tarpit/delude) | ports/protocols | yes (conntrack) | | nftables | Linux | ports/protocols | yes (conntrack) | | firewalld | Linux with firewalld | ports/protocols | yes (conntrack) | | ufw | Linux with ufw | ports/protocols | yes (ss/conntrack) | | shorewall | Linux with Shorewall | whole IP | no | | npf | NetBSD | whole IP (rule in npf.conf) | no | | linux_ip_route | Linux (iproute2) | whole IP | no | | xdp | Linux, NIC-level | whole IP | unneeded (all packets die) | | hosts_deny | anywhere with libwrap | per daemon | no | | openwrt | OpenWrt (local or ubus) | ports/protocols | yes (conntrack) | | routeros | MikroTik (ssh) | whole IP (rules it creates) | no | | routeros_api | MikroTik (REST, 7.1+) | via your rules | no | | opnsense | OPNsense | via your rules | no | | pfsense | pfSense (pfSense-API pkg) | via your rules | no | | vyos | VyOS (HTTP API) | via your rules | no | | panos | Palo Alto PAN-OS | via your policies | no | | fortigate | Fortinet FortiGate | via your policies | no | | cisco_fmc | Cisco Firepower (needs deploy) | via your policies | no | | checkpoint | Check Point (needs install-policy) | via your policies | no | | juniper_srx | Juniper SRX (commits live) | via your policies | no | | f5_bigip | F5 BIG-IP AFM | via your policies | no | | netscaler | Citrix NetScaler/ADC | via responder policies | n/a (remote) | | bgp_rtbh | your BGP edge | whole IP (network-wide) | no | | cloudflare | Cloudflare edge | whole IP | n/a (remote) | | fastly | Fastly edge | via your VCL | n/a (remote) | | akamai | Akamai edge (needs activation) | via your policies | n/a (remote) | | aws_wafv2 | AWS WAF | via your WebACL | n/a (remote) | | cloud_armor | GCP edge (max 10 IPs) | via the rule | n/a (remote) | | azure | Azure NSGs | via the rule | n/a (remote) | | nsupdate | BIND zone (DNS RBL) | whole IP, IPv4 only | n/a (remote) | | dns_rpz | BIND RPZ (resolver) | resolution, not packets | n/a (remote) | | abuseipdb | AbuseIPDB (reporting) | reports only | n/a | | file_reload | anywhere | whatever consumes the file | no | | shell | anywhere | whatever you script | whatever you script | | dummy | the imagination | none | n/a |

On "kill support": a firewall rule only stops new connections; kill severs the established ones too. For ban-on-abuse you almost certainly want it on where it exists — security explains.