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:
WIFI, and your wired network in zone LAN. Both need a static address on the firewall (for example 192.168.2.1/24 on the Wi-Fi).The screenshots come from a test firewall whose LAN zone is lan. On the GMKtec test firewall the zones are WIFI and LAN.
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.
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.
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.

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.

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.
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:
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.

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.
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 |

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 |

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:
8.8.8.8 or 1.1.1.1, is answered by Korthveil, filtered, and Korthveil asks Quad9 or the backup over TLS. Nothing has to be set on the device.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.
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.

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 |

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:
dns.google, cloudflare-dns.com, doh.opendns.com) to Always block, and add use-application-dns.net too: Firefox then keeps using Korthveil.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.
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).

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.
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.
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.

| 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. |
| 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. |