Every device on your Wi-Fi and LAN asks Korthveil for names. Korthveil looks them up privately at Quad9 over an encrypted connection (DNS over TLS), checks DNSSEC, and answers "does not exist" for ad, tracker, and malware domains from two well-known blocklists. Phones, TVs, and game consoles are covered without installing anything on them. Devices that try to use their own DNS server (for example a hard-coded 8.8.8.8) are sent to Korthveil anyway.

What you need:

The screenshots come from a test firewall whose LAN zone is lan. On the GMKtec test firewall the zones are WIFI and LAN.

How it works

 phone on WIFI                Korthveil firewall                      internet
 ┌─────────────┐  DNS :53   ┌─────────────────────────────────┐  DoT :853  ┌─────────────┐
 │ asks for    │ ─────────▶ │ DNS resolver add-in              │ ─────────▶ │ Quad9       │
 │ ads.example │            │  1. on a blocklist? → NXDOMAIN   │            │ dns.quad9   │
 └─────────────┘            │  2. otherwise ask Quad9, check   │            │ .net        │
   asks 8.8.8.8 directly ─▶ │     DNSSEC, cache the answer     │            └─────────────┘
   (redirected to :53)      │ DoT (853) from WIFI → dropped    │
                            └─────────────────────────────────┘

Quicker: System › Wizards › DNS filtering and ad blocking does steps 1, 2, 3, 5, 6, and 7 in four screens (allow and block lists by hand, step 4, stay on the page). The steps below do the same by hand and explain each part.

Step 1: Open the DNS resolver

Go to Network › DNS resolver. The page is called DNS resolver and filtering.

If the add-in is off, the page says The DNS resolver add-in is not enabled yet. You do not need to switch it on separately: saving the settings in Step 6 turns it on in the pending changes. The switch at the top of the page (On/Off) does the same.

Step 2: Where it answers, and Quad9 over TLS

In the Resolver panel:

Field Set to Meaning
Serve these zones tick WIFI and LAN Devices in these zones may use the resolver (UDP and TCP port 53, IPv4 and IPv6). Never tick your internet zone (wan).
Lookup mode Forward to upstream resolvers Korthveil asks Quad9 instead of the internet's root servers
Cache size (MB) 64 (default) Answers kept in memory
Local domain lan (optional) The firewall also answers for its own name, for example korthveil.lan
Validate DNSSEC on (default) Forged answers are refused
DNS rebinding protection on (default) Private addresses are removed from public answers

When you choose Forward to upstream resolvers, Upstream resolvers appears. Tick DNS over TLS and click Quad9 (DNS over TLS). It fills in all four Quad9 servers:

Server address Port Certificate name
9.9.9.9 empty (853) dns.quad9.net
149.112.112.112 empty (853) dns.quad9.net
2620:fe::fe empty (853) dns.quad9.net
2620:fe::9 empty (853) dns.quad9.net

An empty Port means 853 with DNS over TLS. The Certificate name is checked against Quad9's certificate, so nobody in between can pretend to be Quad9. To add a server by hand, click Add upstream.

Serve WIFI and LAN, forward to Quad9 over TLS
Serve WIFI and LAN, forward to Quad9 over TLS

If every upstream server belongs to one provider and that provider has a problem, every new lookup fails: names the firewall looked up recently still work from its cache, everything else (and more and more as the cache runs out) does not. After such a failure the resolver also waits up to 15 minutes before it tries the servers again. This happened on 2026-11-02 with Quad9 only.

Add a second provider below Quad9: click Add upstream twice and fill in:

Server address Port Certificate name
1.1.1.2 empty (853) security.cloudflare-dns.com
1.0.0.2 empty (853) security.cloudflare-dns.com

These are Cloudflare's servers with malware blocking, like Quad9, so the protection stays the same whichever provider answers (the plain 1.1.1.1 blocks nothing). The resolver uses the fastest server that answers; when one provider fails, the other answers. Everything stays encrypted on port 853.

Quad9 and Cloudflare's malware-blocking servers, both over TLS
Quad9 and Cloudflare's malware-blocking servers, both over TLS

In a failover pair, set this on the active firewall: the standby receives it with the next sync.

Prefer not to send your lookups to any one company? Choose Full recursion (ask the authoritative servers directly) instead. Filtering works the same; the lookups are not encrypted then.

Step 3: Blocklists

In the Filtering panel, tick Block listed domains. More settings appear:

Field Set to Meaning
Answer for blocked names Name does not exist (NXDOMAIN) (default) Apps fail fast. The other choice, Unroutable address (0.0.0.0 and ::), suits a few old devices that retry an NXDOMAIN forever.
Download and update lists automatically on Without this, the firewall contacts no list server until you press Download lists now
Update interval (hours) 24 (default) How old a list may get before it is downloaded again

Under Blocklists, add the two lists:

  1. Click StevenBlack unified hosts. The row is filled in for you.
  2. Click Add list by URL and fill in the new row as below. Korthveil also offers an OISD small button (https://small.oisd.nl/domainswild2, fewer names); this guide uses the larger OISD big list.
Use List ID List name List URL Format
ticked stevenblack StevenBlack unified hosts https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts hosts file
ticked oisd-big OISD big https://big.oisd.nl/domainswild domain list

The Format must match the file. StevenBlack is a hosts file (0.0.0.0 name). OISD's domainswild file is a domain list (*.name, one per line). Korthveil reads name, *.name, and ||name^ lines in a domain list, and each name also blocks its subdomains. Only https:// addresses are accepted. A list may have up to 1,000,000 names.

The List ID is lowercase letters, digits, and dashes. The downloaded copy is stored under it.

Below a list you see its state: not downloaded until the first download, then the number of names and when it was updated.

Licences: StevenBlack is MIT; OISD is GPL-3.0. The lists are not part of Korthveil: your firewall downloads them from their publishers.

Two blocklists, automatic updates, and an allow entry
Two blocklists, automatic updates, and an allow entry

Step 4: Allow and block by hand

Still in Filtering:

Tick Log blocked queries. It fills Most blocked domains on the status panel. Only the blocked names are counted; the devices' addresses are not kept.

Step 5: Catch devices that ignore DHCP, and block DNS over TLS

In the Interception panel:

Field Set to Meaning
Redirect clients' DNS (port 53) to the firewall, IPv4 and IPv6 on A device in WIFI that asks 8.8.8.8 gets its answer from Korthveil, filtered
Intercept in tick WIFI With none ticked, every served zone is intercepted. Tick LAN too if you want it there as well.
Do not redirect queries to empty Only for internal DNS servers that must be reached directly, for example 10.20.0.53, fd20::53
Block DNS over TLS and QUIC on Drops TCP and UDP port 853 from the served zones (WIFI and LAN) to anywhere
Interception for WIFI and DNS over TLS blocked
Interception for WIFI and DNS over TLS blocked

The goal: no DNS leaves your network unencrypted, and devices that encrypt DNS themselves may keep doing so.

Setting Where Set to
Upstream Resolver › Upstream resolvers DNS over TLS on, Quad9 plus a backup provider (Step 2): Korthveil asks them only encrypted, on port 853
Redirect Interception › Redirect clients' DNS (port 53) to the firewall on
Served zones Resolver › Serve these zones every internal zone: LAN, Wi-Fi, guest networks, and the zone of a VPN that your own devices connect in through (remote access). Never the internet zone (WAN)
Zones Intercept in none ticked: every served zone, so a zone you serve later is covered by itself
Encrypted DNS of devices Block DNS over TLS and QUIC off: devices may use DNS over TLS on port 853
Secure DNS for every device: port 53 redirected to the firewall, DNS over TLS allowed
Secure DNS for every device: port 53 redirected to the firewall, DNS over TLS allowed

Remote devices: give a remote-access VPN (for example WireGuard for your phones, see WireGuard for phones) a zone of its own, such as VPN, and tick it under Serve these zones. Its devices are then treated like the LAN: their normal DNS is answered by Korthveil and leaves encrypted. A VPN tunnel to a provider (Korthveil as the client of NordVPN or IPVanish) is an internet connection: keep it in the internet zone and do not serve it.

What happens then:

Watch it on the DNS resolver page, Live activity:

Both graphs can also go on the dashboard (Layout › Add from other pages).

Check it from a computer on the network: nslookup doubleclick.net 8.8.8.8 gets Korthveil's answer (blocked: Non-existent domain), although it asked Google; that shows the redirect works.

Stricter: every device through the filter

To send every device through Korthveil's filtering, also turn Block DNS over TLS and QUIC on. A device's own DNS over TLS is then dropped, and it falls back to the network's DNS.

The stricter setting: DNS over TLS and QUIC blocked
The stricter setting: DNS over TLS and QUIC blocked

Block DNS over TLS for WIFI only (optional). Block DNS over TLS and QUIC covers every served zone. To block it only on the Wi-Fi, leave that box off and add a firewall rule instead. Go to Firewall › Rules and click Add rule:

Field Set to
Name Block DNS over TLS from WIFI
Action Reject (tell the sender) (apps give up at once and use the normal DNS)
Reject response TCP reset
From zone WIFI
To zone Any
Service Add service twice: TCP with Ports 853, and UDP with Ports 853
A rule that rejects DNS over TLS from WIFI
A rule that rejects DNS over TLS from WIFI

Click Save to pending changes, then drag the rule (the grip on the left of its row) above the rule that lets WIFI reach the internet. Rules are checked from the top. The rule matches IPv4 and IPv6.

A device that must keep its own DNS (for example a work computer). In the Interception panel, enter its address under Devices never redirected or blocked (for example 192.168.2.30; IPv6 addresses work too). Its DNS then goes to the servers it chooses: port 53 is not redirected and port 853 is not blocked. To stop ad blocking for it as well, add it under Security › Ad & tracker blocking as an exempt device; to stop the threat-intelligence feeds for it, see Security › Threat intelligence › Devices never blocked. Korthveil 1.1.34 and later.

DNS over HTTPS (DoH) uses port 443, like every web page, so no port rule can tell it apart without TLS inspection. A browser or app with its own DoH server can still get past the filter. Two things help:

Step 6: Save, commit, download the lists

Click Save to pending changes at the bottom of the settings. The page says Saved to pending changes … Review and commit to apply. Click Review and commit, then Commit (Safety rollback on), with a note such as DNS filtering with Quad9 over TLS. Confirm the commit (the banner at the top) so it stays.

With Download and update lists automatically on, the firewall downloads the lists within the hour. To download them now, click Download lists now in the Status panel. It shows Downloading…, then Last list update (…) with the result. Each list then shows its number of names, and Blocked shows how many names are listed in total.

Step 7: Hand out the firewall as DNS server

Devices use the resolver when DHCP tells them to.

Go to Network › DHCP server. In the panel Network on for the Wi-Fi interface (and again for the LAN interface), click Use this firewall under DNS servers for clients, and again under DNS servers (IPv6). Both fields then read firewall: Korthveil hands out its own address on that network (for example 192.168.2.1 and fd00:2::1) and keeps it right if the address changes.

Field Set to
DNS servers for clients firewall
DNS servers (IPv6) firewall (needs a static IPv6 address on the interface)

A new network starts with 9.9.9.9, 1.1.1.1 and 2620:fe::fe. Replace them: with those, devices would go around the filter (interception catches them on WIFI, but not on a zone you do not intercept).

The firewall as the DNS server in DHCP
The firewall as the DNS server in DHCP

Click Save to pending changes and commit. Devices pick up the new DNS server when they renew their lease: turn the Wi-Fi off and on, or wait for the next renewal.

Check it

  1. Test a name. At the bottom of the DNS page, in Test a name, type a name and click Test: - an ad server from the lists, for example doubleclick.net: Filter: blocked by the matching name and list, for example (list stevenblack); - www.example.com: not blocked, Resolver: NOERROR, DNSSEC validated, and the addresses; - choose AAAA for the same name: the IPv6 addresses; - a name on your allow list: allowed by the allow list.
Test a name: blocked by a list
Test a name: blocked by a list
  1. From a phone or laptop on the Wi-Fi. Ads disappear from most apps and web pages. On a laptop: - nslookup doubleclick.net: the server is the firewall (192.168.2.1) and the answer is Non-existent domain; - nslookup doubleclick.net 8.8.8.8: also Non-existent domain. The query went to Korthveil, not Google: interception works; - nslookup -type=AAAA www.example.com fd00:2::1: an IPv6 address. The resolver answers over IPv6 too; - kdig +tls @1.1.1.1 example.com (or any DNS over TLS client): it times out or is refused: DNS over TLS is blocked.
  2. Live activity. The DNS queries graph shows Queries and Blocked per second, from the resolver's own counters. Browse a news site on the phone and watch both rise.
Queries and blocked queries per second
Queries and blocked queries per second
  1. Status. Queries, Answered from cache (the share answered without asking Quad9), and Blocked with the number of names listed. Most blocked domains lists the top 25 blocked names once Log blocked queries is on.
Counters and the most blocked domains
Counters and the most blocked domains

Change it later

What Where
Add or remove a list, turn one off for a while Filtering › Blocklists: the tick box in front of the list, or the bin. Save and commit.
A site is broken Test a name shows which list blocks it. Add the name to Always allow, save, commit. Then Flush cache in Status so devices get the real answer at once.
Download now instead of waiting Status › Download lists now (the lists of the committed settings)
Another upstream, or a backup provider Resolver › Upstream resolvers: Cloudflare (DNS over TLS), or your own servers with Add upstream (see A backup provider, Step 2)
Names for your own devices (nas.lan) Local names › Host records (A, AAAA, CNAME)
An office domain on an internal DNS server Local names › Split-horizon domains, and add that server to Do not redirect queries to
Filtering on the LAN too Interception › Intercept in: tick LAN
Turn it all off The switch at the top of the page, then commit. Change the DHCP DNS servers back first, or devices lose DNS.

Troubleshooting

Symptom Check
The resolver is not running Commit the settings. If it still shows, System › Add-ins: the add-in's health. A served zone without a static address gives a warning when you save: its devices cannot be allowed.
Names you used recently work, new ones fail with SERVFAIL (apps such as Teams stop working) The upstream provider stopped answering for a while, and the resolver waits up to 15 minutes before it tries again. Save and commit any change on this page (or turn the add-in off and on) to restart the resolver at once. To prevent it, add a backup provider (Step 2).
No names resolve; Test a name shows a resolver error or SERVFAIL for everything Outgoing TCP 853 to Quad9 is blocked on the way out, or the firewall's clock is wrong (TLS and DNSSEC need the right time). Try Full recursion for a moment to see whether Quad9 is the problem.
A list shows last update failed The message next to it says why (address, certificate, size). The previous copy stays in use. Only https:// addresses work.
A list downloaded but blocks nothing The Format is wrong: a hosts file set to domain list, or the other way round. Test a name with a name from the list.
Ads still show Some apps load ads from the same names as their content, so DNS cannot block them. A device with its own DoH (a browser setting) bypasses the filter: see Step 5. Status › Queries rising when the device browses shows it uses Korthveil.
A device that hard-codes 8.8.8.8 gets no answers The resolver must serve that zone (Serve these zones). Interception works only in served zones.
Devices still get the old DNS server DHCP hands it out at the next renewal. Reconnect the device.
Blocked page still loads right after allowing it Devices cache answers too. Flush cache on the firewall, then wait a few minutes or reconnect the device.