23 - Sep - 2026

I fed Cloudflare, Quad9, NextDNS, and AdGuard the same malicious domains to see who actually stops them

Security-focused DNS services all make roughly the same promise. Point your devices at their resolver, and known malicious domains can get stopped before your browser ever connects to them. Cloudflare, Quad9, NextDNS, and AdGuard all offer some version of that protection, but I wanted to see how often they would actually stop the same known-bad hostnames.

So I gave all four the same 100 malware and phishing domains and recorded what came back. I never opened any of the sites, downloaded anything, or let a browser near them. This was strictly a DNS-resolution test, and the four services agreed far less often than I expected.

I started with more than 41,000 domains and cut the list to 100

Dead domains make very generous security tests

Finding thousands of malicious URLs was easy. Turning them into a DNS test I could actually trust took a lot more pruning.

For the malware side, I used URLhaus’s domain-only host file, which contains hostnames tied to active malware URLs or URLs added within the previous 48 hours. URLhaus also excludes hostnames from domains in the Tranco Top 1M to reduce false positives. For phishing, I used PhishTank’s verified-online dataset.

After pulling out the hostnames, removing duplicates, and discarding raw IP addresses and other unusable entries, I was left with 392 unique URLhaus hosts and 41,522 unique PhishTank hosts. I randomly sampled 75 from each source, giving me 150 candidates to start with.

Before testing any security-focused resolver, I sent all 150 domains through Cloudflare’s regular unfiltered DNS-over-HTTPS endpoint at cloudflare-dns.com/dns-query. I wanted to know which domains still resolved normally before giving any filtering service a chance to block them.

That control run left me with:

  • 131 domains that still resolved
  • 19 that didn’t
  • 0 query errors
  • 74 surviving malware hosts
  • 57 surviving phishing hosts

From there, I locked the final dataset at 100 domains, split evenly between 50 malware and 50 phishing hosts. Every one of them still returned an IPv4 address during the final control check.

That cleanup was important because dead infrastructure can make every resolver look smarter than it is. If a malicious hostname has already vanished from DNS, a filtered resolver may appear to have blocked it even though its threat-detection system never made that call.

I ran the final test, sending the same 100 A-record queries over DNS-over-HTTPS with dnspython and HTTP/2 to Cloudflare’s malware-filtering resolver, Quad9, a fresh NextDNS profile using its default security settings, and AdGuard’s default public resolver. Immediately before scoring each hostname, I checked it against the unfiltered control again. All 100 were still resolving when their four filtered queries ran.

I also had to normalize what counted as a block because the services don’t all report one the same way. Cloudflare returned 0.0.0.0 for domains it classified as malicious, and NextDNS used that same unspecified address for blocked A-record queries during my run. Quad9 signaled a block with NXDOMAIN and AUTHORITY: 0, while AdGuard frequently returned its 94.140.14.33 block address. If I had treated every failed-looking response the same way, the comparison would’ve been badly skewed.

The phishing half comes with another wrinkle. PhishTank verifies malicious URLs, while I converted those URLs into hostnames because DNS filtering operates at the domain level. A phishing page sitting on shared or compromised infrastructure doesn’t automatically mean the entire hostname should be blocked, which makes phishing a particularly awkward category for DNS-only protection.

Malware was easy compared with phishing

The overall scores hide the mess underneath

Corrected resolver results spreadsheet.

I queried the same 100 domains against each of the four filtered resolvers, giving me 400 scored DNS queries to compare.

Provider

Total blocked

Malware blocked

Phishing blocked

AdGuard

86/100

50/50

36/50

Cloudflare

85/100

48/50

37/50

NextDNS

70/100

47/50

23/50

Quad9

68/100

50/50

18/50

AdGuard and Cloudflare finished only one domain apart overall, but that tiny gap became much less interesting once I separated malware from phishing.

Malware produced a pretty consistent picture. AdGuard and Quad9 blocked all 50 malware hosts, Cloudflare caught 48, and NextDNS stopped 47. More tellingly, 45 of the 50 malware domains were blocked by all four services, while the remaining five were still caught by three.

PowerShell consensus-by-category.

Phishing was nowhere near that tidy. Cloudflare blocked 37 of the 50 phishing hosts, AdGuard caught 36, NextDNS stopped 23, and Quad9 blocked 18. Only eight phishing hostnames were blocked by all four resolvers.

The rest fractured quickly. Eleven were blocked by three services, 20 by two, nine by just one, and two slipped past all four. That means 40 of the 50 phishing hostnames got a different block-or-allow result depending on which resolver answered the query.

If phishing protection is one reason you’re switching DNS providers, that’s the part I’d pay attention to. The malware hosts in my sample were much easier for these services to agree on, while phishing produced far more disagreement from one resolver to another.

I wouldn’t turn 18 out of 50 into a blanket claim that Quad9 is bad at phishing. These were 50 hostnames from one feed at one point in time, and threat-intelligence databases are constantly changing as malicious pages appear, disappear, and get reclassified. If I run the same test a week later, some of these numbers could easily change.

The phishing sample also shared a lot of infrastructure. Thirty-six of the 50 hostnames matched recognizable hosting or proxy platforms such as Weebly, Firebase Hosting, Cloudflare Pages, Wix Studio, Blogger, and a handful of other services. That helps explain why URL-level phishing reports don’t always translate neatly into hostname-level DNS blocks.

Phishing_platform_breakdown spreadsheet

The overlap between providers made that even clearer. Out of 100 domains, 53 were blocked by every service, and only two slipped past all four. The remaining 45 produced at least one disagreement, which means almost half of this deliberately small test set got a different answer depending on which resolver handled the request.

disagreement_matrix spreadsheet with Test IDs and BLOCKEDALLOWED columns

Nearly identical totals could hide very different choices too. AdGuard finished at 86 and Cloudflare at 85, but that doesn’t mean they blocked the same 85 or 86 hostnames. Different threat feeds, classification rules, update schedules, and filtering policies can produce almost identical totals through completely different paths.

This experiment also leaves out a major piece. I tested how often the resolvers blocked known-bad domains, not how often they mistakenly blocked legitimate ones. A service could be extremely aggressive, post an excellent score here, and still cause plenty of collateral damage elsewhere, so these percentages shouldn’t be read as overall accuracy ratings.

The scores aren’t the only reason to pick one

What I’d actually choose each resolver for

NextDNS Security page.

The experiment left me far more interested in how these services differ than in pretending an 86 versus 85 result settles anything. DNS choice is about more than speed, and the sample is too small and too dependent on timing for that kind of verdict. The differences between the services themselves are much easier to use when choosing one.

There are also free DNS servers built for different jobs, so the right choice depends heavily on what you actually want your resolver to do.

If I were picking between them, I’d break it down like this:

  • Cloudflare if you want straightforward malware and phishing filtering with very little setup.
  • Quad9 if you want a security-focused resolver without ad or broader content filtering.
  • NextDNS if you want to tune security protections, blocklists, logging, and other DNS behavior yourself.
  • AdGuard if you want malicious-domain protection bundled with network-level ad and tracker blocking.

That context also helps put my NextDNS result in perspective. I tested a fresh profile with its default security configuration rather than switching on every aggressive protection available, and NextDNS gives you considerably more control over filtering behavior than a fixed public resolver such as Cloudflare’s malware-filtering endpoint.

NextDNS Setup and endpoint page.

Quad9 is similarly easy to misread if you look only at its overall 68/100 result. It caught every malware hostname in my sample, so most of its deficit came from the phishing half rather than a general inability to identify malicious infrastructure. That difference in priorities is also why a switch from Cloudflare to Quad9 can have nothing to do with raw speed.

AdGuard’s result comes with its own wrinkle because the default public resolver also filters ads and trackers. That can be a plus if you want one DNS service doing several jobs, but it also makes a direct “who blocks the most” comparison less useful than understanding what you actually want the resolver to filter.

AdGuard Default resolver documentation.

DNS protection also has a hard ceiling regardless of which service you choose. A legitimate domain can host a malicious download, a compromised page can live under an otherwise trustworthy hostname, and an infected attachment in your inbox won’t care which DNS resolver you picked.

A clean DNS response doesn’t mean a clean site

The biggest takeaway for me wasn’t that one resolver blocked a few more domains than another. It was that a hostname resolving normally doesn’t prove it’s safe. Three providers might block the same domain while the fourth lets it through because its threat intelligence or filtering policy reached a different conclusion.

Filtered DNS can stop a bad connection before the browser ever reaches the site, which is exactly why I use it. I just treat a successful lookup as the absence of a warning, not as proof that the destination is trustworthy.

Leave a Reply

Your email address will not be published. Required fields are marked *