Quick Start¶
This guide gets Ferrous DNS running on your network in minutes.
Step 1: Start the Server¶
Step 2: Open the Dashboard¶
Navigate to http://<your-server-ip>:8080 in your browser.
The dashboard shows:
- Real-time query log
- Blocked vs. allowed query ratio
- Top queried domains
- Upstream latency graphs
- Connected clients
Step 3: Point Your Devices to Ferrous DNS¶
Option A — Router (network-wide)¶
Set the DNS server in your router's DHCP settings to your Ferrous DNS server IP. All devices on your network will automatically use it.
Option B — Single device¶
Linux (/etc/resolv.conf or NetworkManager):
Windows (Network Adapter settings → IPv4 → DNS Server):
macOS (System Settings → Network → DNS):
Step 4: Add a Blocklist¶
- Open the dashboard at
http://<server>:8080 - Go to Blocklists in the sidebar
- Click Add Blocklist
- Paste a blocklist URL (see suggestions below) and click Save
Saving downloads the list and rebuilds the block index straight away, so it takes effect on the next query. The refresh icon in a row's Actions re-downloads that list on demand; because the index is rebuilt as a whole, every enabled list is refreshed along with it.
Recommended Blocklists¶
| List | URL | Focus |
|---|---|---|
| Steven Black Unified | https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts | Ads + Malware |
| OISD (small) | https://small.oisd.nl/domainswild | Balanced |
| HaGeZi Pro | https://raw.githubusercontent.com/hagezi/dns-blocklists/main/wildcard/pro.txt | Comprehensive |
| Hagezi Threat Intelligence | https://raw.githubusercontent.com/hagezi/dns-blocklists/main/wildcard/tif.txt | Security |
Step 5: Test It¶
# Check DNS is working
dig @<server-ip> example.com
# Check blocking is working (should return NXDOMAIN or 0.0.0.0)
dig @<server-ip> ads.doubleclick.net
# Check DNS-over-HTTPS (requires DoH enabled with TLS certificate)
curl -s -H "accept: application/dns-json" \
"https://<server-ip>/dns-query?name=example.com&type=A"
Basic Configuration¶
For a minimal setup, create ferrous-dns.toml:
[server]
dns_port = 53
web_port = 8080
bind_address = "0.0.0.0"
[dns]
dnssec_mode = "Permissive"
local_domain = "lan"
local_dns_server = "192.168.1.1:53" # your router
[[dns.pools]]
name = "default"
strategy = "Parallel"
priority = 1
servers = [
"https://cloudflare-dns.com/dns-query",
"https://dns.google/dns-query",
]
[blocking]
enabled = true
[database]
path = "/data/ferrous.db"
log_queries = true
[logging]
level = "info"
See the full configuration reference for all available options.