Fast DNS cache
TTL-clamped LRU caching returns repeat lookups immediately and restores warm state after restart.
Self-hosted DNS sinkhole · forged in Rust
Ferrite is a privacy-first resolver for home labs and small networks: encrypted upstreams, compiled blocklists, custom records, live stats, and a web UI that feels like an ops panel instead of a chore.
Network control
Ferrite keeps the hot path small: cached decisions, compiled blocklists, direct custom DNS answers, and encrypted upstream fallback when the request needs to leave your network.
TTL-clamped LRU caching returns repeat lookups immediately and restores warm state after restart.
Hosts files, Adblock rules, plain domain lists, wildcards, whitelist, and blacklist controls merge into one fast lookup layer.
Plain DNS, DNS-over-HTTPS, DNS-over-TLS, and DNS-over-QUIC in one resolver pool with failover.
Local A, AAAA, and CNAME records support exact and wildcard domains, so internal services get clean names.
The dashboard summary is served from memory, safe to poll frequently, and includes counters, recent activity, and timeseries data.
Settings, lists, custom records, auth, client aliases, updates, and query history are managed through the API without restarting the resolver.
Resolver pipeline
Ferrite resolves local records first, skips logging for configured noisy domains, blocks known bad traffic, and only then forwards to encrypted upstreams. That keeps the network calm and the UI honest.
53/udp
<1ms
FST
TLS
Web UI
The UI mirrors the resolver: dense, readable, and live. Watch query volume, blocked traffic, client activity, custom DNS, blocklists, and settings from the same place.
http://fe.te
Install
The installer downloads the server and web UI release assets, prepares system paths, and sets up the service for systemd, OpenRC, or launchd where available. Prefer containers? Pull the image from GHCR instead.
curl -fsSL https://raw.githubusercontent.com/syntlyx/ferrite-server/refs/heads/main/install.sh | sudo sh
docker run -d --name ferrite \
--restart unless-stopped \
-p 53:53/tcp -p 53:53/udp \
-p 80:80/tcp \
-v ferrite-data:/var/lib/ferrite \
ghcr.io/syntlyx/ferrite-server:latest
cargo build --release
sudo cp target/release/ferrite /usr/local/bin/ferrite
ferrite passwd
Ferrite serves a built-in
fe.te record that points to the
detected local server address, so the panel is
easy to find on the LAN.
A small Alpine image is published to
ghcr.io/syntlyx/ferrite-server.
Mount /var/lib/ferrite so config,
data, and updates survive restarts — an Unraid
Community Apps template is available too.
User config lives at
~/.config/ferrite/config.toml;
system-wide config lives at
/etc/ferrite/config.toml.
The web UI can be updated through
POST /api/update/web once Ferrite
is running.