DNS leak test: run it, read the resolver list
A DNS leak test lists the resolvers that answered you. Run it in three states, learn whose resolver is whose, and fix the one that should not be there.
Key takeaways
- Three kinds of resolver can appear on a DNS leak test: your network's, the exit's, and one you chose. The first is a leak, and the third can count as one if you did not choose it.
- In our Linux run the physical adapter carried 0 DNS packets while data flowed both ways, 3 of 3 times, and 44 with it down.
- Windows name resolution can send one lookup across every network adapter at once, so a physical adapter's resolver can answer beside the VPN's.
- Browser secure DNS (DoH) puts a provider chosen in the browser on the list. That is your choice, not a tunnel fault.
On this page (9)
- How do I run a DNS leak test?
- What does a DNS leak test show with the VPN on and off?
- How do I read a DNS leak test result?
- Why does a DNS leak happen on Windows, Android and Linux?
- Does Android Private DNS change a DNS leak test?
- Does browser DNS over HTTPS count as a DNS leak?
- Why does my DNS leak on a router?
- How do I fix a DNS leak?
- Is a DNS leak the same as an IP leak?
A DNS leak test prints the resolvers that answered a few unique lookups from your device. It cannot tell you whether that list is acceptable. That judgement is yours, and this page gives you a way to make it: run the test in three states, then read each row by asking who chose that resolver.
Think of a DNS resolver as the server that turns a name like example.org into an address. Your device asks it for every site you open, so its operator sees the names. A DNS leak is the case where those lookups reach a resolver you did not expect while a VPN is on, usually the one your network, and so your internet provider (ISP), handed out.
How do I run a DNS leak test?
Run it three times and write down the list each time. What you need: the ForestVPN app, one DNS leak test page and a second browser.
- Tunnel down. With the VPN off, open the test and note the operators it prints. This is your baseline: what your own network's resolver looks like from outside. Write operator names, not addresses.
- Tunnel up. Turn the app on and wait for the Working verdict, which means data is flowing both ways. Idle is not a fault, only a quiet app, but a test run then proves little: send some traffic first. A tunnel that carries nothing cannot carry the test. If the app shows something else, start with VPN connected but no internet or VPN not connecting.
- Kill switch on, tunnel down (Windows and Linux). Switch the kill switch on and disconnect. There the firewall block stays while the tunnel is not up, so a working kill switch leaves the test nothing to reach, and seeing no list is the pass. On Android the app blocks a drop only while ForestVPN is running; to cover a disconnect, turn on Always-on VPN with Block connections without VPN in the system settings. On iPhone, iPad and Mac the kill switch is an on-demand rule and a manual disconnect disarms it, so a manual disconnect is not a kill-switch test there. No kill switch is absolute, and none covers every edge case.
Open a fresh tab for each run, since a cached page can pass for a new result. Then repeat step 2 in a browser you rarely use, to learn whether a setting inside the first browser decides the answer. Compare each site with itself, not with another site: every test prints the resolvers in its own wording.
What does a DNS leak test show with the VPN on and off?
In our run, the Linux client showed no lookups on the physical adapter at the Working verdict, 44 with the tunnel down, and nothing at all with the kill switch on and the tunnel down. It also showed one thing we did not expect.
How this was tested
- Product
- ForestVPN Linux desktop client, published .deb
- Version
- the package published on 2026-10-19
- System
- Ubuntu 26.04 LTS, systemd-resolved, one network adapter, home-lab VM
- Checked
- Runs
- 3
Not tested
Three connects on 2026-10-29 from a lab VM on the Free plan, no account. The lab line already exits in Germany, so a German location proves nothing; we judged by resolver and adapter captures. Each test made 10 unique lookups and read a public DNS leak test API (bash.ws), values transcribed, no screenshots; the three Working repeats ran within one connect. Exit: Frankfurt only.
Codes and verdicts this post maps: net.working (Working), net.idle (Idle) and cp.dns_blocked (Name lookup is being blocked).
Not tested: Android, Windows, macOS, a router, a browser with secure DNS on, IPv6-only resolvers, and a kill switch blocking a live tunnel.
| State | App state | Resolver rows on the test | Packets on the physical adapter | Lookups answered |
|---|---|---|---|---|
| Tunnel down | Disconnected | 10 rows, one public resolver operator, Germany | 44 | 10 of 10 |
| Tunnel up, first read | Idle | 15 rows, a different public resolver operator, Germany | 4 | 10 of 10 |
| Tunnel up, 3 repeats | Working | Not transcribed; captured by adapter | 0, 0, 0 | via the tunnel adapter |
| Kill switch on | Disconnected | No list: nothing left the device | 0 | 0 of 10 |
Show the data
| Tunnel down | 44 packets |
|---|---|
| Idle read | 4 packets |
| Working | 0 packets |
| Kill switch on | 0 packets |
With the tunnel down, the lookups went to the network's resolver. With the tunnel up, the system resolver listed a second link for the tunnel, with its own server and a catch-all search domain, and the test then named a different operator.
At the Working verdict, the three captures showed 22, 20 and 20 packets on the tunnel adapter and none on the physical one.
Now the unexpected part. In a capture started before the connect, 18 DNS packets left on the physical adapter in the first seconds. They were lookups of the client's own service names, made through the system resolver before the tunnel existed.
After the tunnel came up, none followed in the 31-second capture. So in our Linux run the client asked the network's resolver for its own server names at connect time. A leak test cannot see those lookups, only the lookups it makes itself, and ours came after that window. The 4 packets in the Idle read went unexplained, and they did not recur in the three Working captures.
Our test tool printed the same warning text ("DNS may be leaking") in the tunnel-down and tunnel-up reads, so it is not a verdict on the tunnel. Read the operators, not the sentence.
How do I read a DNS leak test result?
Only one of three kinds of resolver is a leak. Ask who chose each row. The exit is the ForestVPN server where your traffic leaves the tunnel.
| You see | Who chose it | Reading while the verdict is Working |
|---|---|---|
| Your own network's resolver (router, ISP, hotel) | The network, through DHCP, the service that hands a device its network settings | A leak: lookups left outside the tunnel |
| A public resolver operator at the exit's location | The VPN | Expected: lookups travel inside the tunnel and are answered at the exit's end |
| A filtering or public resolver you set yourself, or a provider set in the browser | You or the browser vendor, in the browser, the OS or a router | Not a leak, but a choice. That operator sees the names |
Row two can surprise you. At Working that operator is the exit's upstream resolver, reached from inside the tunnel. The test names the operator it sees at the far end, so with the VPN up it may print a public resolver operator, not your ISP. If your own network uses the same operator, compare the location too, and compare against your tunnel-down list from step 1.
Whether row three is a leak depends on what you expected. dnsleaktest.com's own guidance says that when DNS is managed elsewhere on your system, secure DNS set in the web browser could be considered a leak. If you want filtering, choose a filtering DNS provider yourself and read its resolver as row three.
Why does a DNS leak happen on Windows, Android and Linux?
A leak happens when something other than the VPN's setting wins the choice of resolver. Microsoft Windows name resolution, Android Private DNS, the Linux stub resolver and the secure DNS in Firefox and Chrome each have their own way to do it.
| Platform | Mechanism | What to check or change |
|---|---|---|
| Windows | The DNS client issues parallel queries across all networks and, when several answers arrive, uses the network binding order to pick one (Microsoft Learn), so the Wi-Fi adapter's resolver can be asked beside the VPN's | Remove static DNS entries on the physical adapter, run ipconfig /flushdns after connecting, rerun |
| Android | Each network keeps its own DNS servers, and Private DNS can send lookups to a named provider over TLS (DNS over TLS, DoT, RFC 7858) | Check Private DNS in the network settings; see the Android section |
| Linux | A local stub resolver such as systemd-resolved keeps global and per-link DNS settings (resolvectl), so the Wi-Fi link's servers can stay in play | Run resolvectl status and compare the Wi-Fi link's servers with the VPN link's |
| Any OS, over IPv6 | A router can advertise DNS servers in IPv6 router advertisements (RFC 8106), so a device can hold an IPv6 resolver beside the VPN's | Look for an IPv6 resolver on the list; see IPv6 leaks |
| Any browser | Secure DNS in Firefox and Chrome (DNS over HTTPS, RFC 8484) sends lookups to a provider set in the browser | Set it deliberately in the browser's privacy settings, then rerun |
| Router | Devices copy the router's resolver from DHCP, and the router may keep answering | See the router section |
Microsoft documents the Windows behaviour as a name-resolution optimisation. Its policy, Turn off smart multi-homed name resolution, still leaves queries issued across all networks first, so the policy alone is not a fix. Wikipedia's entry records the same change in Windows 8 and says it exposed VPN users to leaks. No Windows run is behind this page.
On Linux, our run is the evidence. With systemd-resolved, the tunnel link took the catch-all search domain, so lookups moved to it once the tunnel link came up, while the physical link kept its own servers configured but unused.
Does Android Private DNS change a DNS leak test?
Yes, because Private DNS can name a provider that answers lookups on every network. Android's LinkProperties page says that with a private DNS server name set, queries must go to that server (strict mode); with no name and Private DNS active, apps should try encrypted queries to the network's servers and may fall back to unencrypted ones (opportunistic mode).
Android also keeps DNS servers per network, and its DNS resolver module answers app lookups. If you set a provider in Private DNS, it is the third kind of resolver in the reading table, on the list with the VPN on or off. Our run did not cover Android. ForestVPN's Always-on VPN, battery and Private DNS page says the app's diagnosis reports the Private DNS mode and that ForestVPN publishes no guidance on which mode to pick.
Does browser DNS over HTTPS count as a DNS leak?
Not a fault, and not always a leak. DNS over HTTPS carries lookups inside ordinary HTTPS to a provider, so a provider set in the browser answers instead of the VPN's resolver.
Chrome's help page says secure DNS is on by default in automatic mode, that Chrome looks the site up unencrypted if that mode has issues, and that a custom provider stops the fallback. Automatic mode uses your current service provider, so a browser-named provider appears only when you pick a custom one. Firefox documents its own DNS over HTTPS setting, so check it in the browser you test with.
Pick a side on purpose. Keep the provider and accept that it sees your names, or remove it so the system resolver, and so the VPN's setting, answers.
Why does my DNS leak on a router?
Whatever a router hands out, its devices use, so the fix lives on the router. Devices copy the resolver from its DHCP offer, and a router that forwards lookups outside the tunnel is a path around it.
The OpenWrt kill switch page says lookups from protected devices go to the tunnel's resolver. It adds that a lookup still reaching the router is refused, and that a browser doing its own secure DNS cannot be caught by the router.
Its verification status, verbatim: "Not yet verified on hardware as a whole. The leak suite ran in a lab on OpenWrt 21.02.7 (fw3) and 24.10.8 (fw4), and every row passed. On 21.02.7 four of its checks are skipped, three of them IPv6 checks. A hardware run is still owed."
On the MikroTik RouterOS side, the page choosing what goes through the tunnel says its Everything mode also moves the LAN's DHCP DNS to 1.1.1.1 and 8.8.8.8, so lookups go through the tunnel too. Names only your router answers stop resolving. The leak test itself is on the MikroTik kill switch and leak check page. Rerun your test from a device behind the router either way.
How do I fix a DNS leak?
Fix the choice, then prove it with another run. Start with the smallest change.
- Reconnect and wait for the Working verdict, then rerun.
- Decide on browser secure DNS and rerun in a second browser.
- On Android, check the Private DNS mode in the network settings; a named provider there is the third kind of resolver. ForestVPN publishes no guidance on which mode to pick.
- On Windows, remove static DNS entries from the physical adapter, as the dnsleaktest.com guide says, then flush the cache. The guide also has you add a 0.0.0.0 entry for its test; that entry is temporary and makes lookups fail while the VPN is off, so remove it afterwards.
- On Linux, run resolvectl status and compare the Wi-Fi link's servers with the VPN link's.
- On a router, follow the recipe page, then test from a device behind it.
If the app cannot resolve its own server names, that is a different message. The Apple apps show the code cp.dns_blocked today, with the text Name lookup is being blocked. It means the network's name service refuses or hides the lookup, and the suggested action is another network. For the general picture, see VPN basics: DNS leaks and Tor.
Is a DNS leak the same as an IP leak?
No. They are separate checks. An IP leak is your network address showing to the sites you visit, and a DNS leak is the names you looked up showing to a resolver. A VPN can fix one and leave the other.
Questions and answers
What is a DNS leak?
A DNS leak is a name lookup that reaches a resolver you did not expect while a VPN is on, usually the one your local network handed out. That resolver's operator can then see which names you ask for.
How do I know if I have a DNS leak?
Connect the VPN, wait for the Working verdict, open a DNS leak test and read the list. Your own network's resolver on that list, at Working, means lookups left outside the tunnel.
Why does the test list several resolvers?
The page asks your device to look up several unique names, and different lookups can reach different resolvers. Many rows from one operator are normal. Rows from two kinds of resolver mean the device is using both.
Does browser DNS over HTTPS count as a leak?
Not a fault. A provider set in the browser answers instead of the system resolver, so it shows on the list even when the VPN is healthy. Keep it on purpose or switch it off.
Is a DNS leak the same as an IP leak?
No. An IP leak is your network address visible to sites. A DNS leak is the names you looked up visible to a resolver. A clean address page says nothing about the resolver list.
Does the ForestVPN kill switch stop DNS leaks?
It is meant to stop traffic leaving outside the tunnel when the tunnel drops, and no kill switch covers every edge case. In our Linux run it left no path for lookups at all. It is a different layer from the resolver choice.
Sources
- RFC 8484: DNS Queries over HTTPS (DoH) (read October 29, 2026)
- RFC 7858: DNS over Transport Layer Security (TLS) (read October 29, 2026)
- RFC 8106: IPv6 Router Advertisement Options for DNS Configuration (read October 29, 2026)
- Microsoft Learn: ADMX_DnsClient Policy CSP (Turn off smart multi-homed name resolution) (read October 29, 2026)
- Android Developers: LinkProperties (private DNS) (read October 29, 2026)
- Android Open Source Project: DNS Resolver (read October 29, 2026)
- Google Chrome Help: Use a secure connection to look up a site's IP address (read October 29, 2026)
- Mozilla Support: Firefox DNS over HTTPS (read October 29, 2026)
- resolvectl(1) manual page (read October 29, 2026)
- Wikipedia: DNS leak (read October 29, 2026)
- dnsleaktest.com: How to fix a DNS leak (read October 29, 2026)
How this was made
Drafted with AI assistance from vendor documentation, ForestVPN's help pages, the cited standards and our own lab run of the published Linux client on 2026-10-29, then checked by automated gates and an editor.
