Every VLAN.
One resolver.

Warden is the self-hosted DNS filter for the organization — phishing, malware, and trackers dropped before a connection is even opened. On-prem or in your private cloud. No cloud account, no per-seat fees.

Deployment

One static binary on a VM, bare metal, or a container host you already run — Linux amd64 / arm64. No appliance to buy, no agents on endpoints.

Sovereignty

On-prem or private cloud. DNS logs are personal data under GDPR — Warden's never leave your perimeter. No telemetry, no account, nothing phones home.

Config as code

The whole configuration is one declarative TOML file: version it in Git, review it in pull requests, restore it with one command.

TCO

AGPLv3 — no per-seat licensing, no subscription, no lock-in. Your security team can audit every line.

Threat protection

Stopped before the connection.

Every device must resolve DNS — filter there and trackers, cloaked CNAME hops, and DNS tunnels die before the first packet. No endpoint agent, and it covers the devices you can't manage: contractors' laptops, IoT, printers.

CNAME chasing

Follow the alias chain.

Trackers disguised as first-party domains followed hop by hop — up to 16 — and blocked anyway.

source src/filter/cname.rs

Subscribed lists stay sandboxed

A feed cannot un-block itself.

Lists you subscribe to cannot smuggle an allow, $important, or regex. Only the rules your team writes get those powers.

source src/lists/parser.rs

Tunnels get refused

Exfil does not look like DNS.

A burst of unique, cache-missing names under one domain is the usual shape of DNS exfil. Warden refuses those queries. On by default.

source src/security/tunneling.rs

Allow-list only, where you need it

IoT and OT, locked down.

Set block_all on a profile and only admin allows get through — printers, cameras, building kit stay on the names you wrote.

source src/config/schema/profile.rs
Per-department control

One policy
per department.

Finance, engineering, the guest Wi-Fi. Each group gets its own rules, applied at the device, group, or subnet.

Per-group profiles

Blocks, exceptions, schedules.

A group of devices shares one profile — lists, exceptions, block-all. Attach a schedule to the group when the window matters.

source src/config/schema/group.rs

Per-subnet policies

A CIDR is a VLAN, here.

Map a CIDR to a profile. Staff, guest, IoT, OT — each range gets its own rules. Longest prefix wins.

source src/config/schema/subnet.rs

Unknown devices, refused

Opt-in DNS.

Leave the default profile unset and anything you have not mapped is REFUSED. Guest phones and new IoT get no DNS until you say so.

source src/dns/handler.rs

Conditional forwarding

The corporate domain stays internal.

Send a zone to another resolver — corp.example.com to the DCs, everything else through Warden. Longest suffix wins.

source src/upstream/forwarding.rs
Operations & audit

Your monitoring,
fed. Not replaced.

Filter without recording lookups, or keep a full log. Config changes write an audit trail. Metrics if you turn them on — no new database.

Filter without recording

Privacy stays on.

Filtering stays active if you turn query logging off — or keep blocked-only / sampled. Lookups are not a required audit of people.

source src/config/settings.rs

Append-only audit log

Who changed the config.

One JSON line per reload, boot, shutdown, and mutation — uid, files, before/after SHA-256. warden audit tail reads it.

source src/config/audit.rs

Prometheus /metrics

Opt-in. Off by default.

OpenMetrics on /metrics when the API is on and metrics are enabled. No exporter sidecar. Off by default.

source src/api/routes.rs

Response rate limiting

Amplification, throttled.

Per-client budget inside allow_from; per-prefix outside it. Spoofed sources get dropped or slipped to TCP. On by default.

source src/security/rrl.rs