[Dnsmasq-discuss] DNSSEC query sent upstream despite local domain

Simon Kelley simon at thekelleys.org.uk
Thu May 8 15:06:31 UTC 2025



On 5/4/25 18:29, Dominik Derigs wrote:
> Hey Simon and list readers,
> 
> we are seeing an interesting report, first the log file:
> 
> Apr 21 19:00:01 dnsmasq[310194]: query[PTR] 1.1.0.10.in-addr.arpa from 
> 127.0.0.1
> Apr 21 19:00:01 dnsmasq[310194]: forwarded 1.1.0.10.in-addr.arpa to 
> 10.0.1.1
> Apr 21 19:00:01 dnsmasq[310194]: dnssec-query[DS] 10.in-addr.arpa to 
> 8.8.4.4
> Apr 21 19:00:01 dnsmasq[310194]: Insecure DS reply received for 10.in- 
> addr.arpa, check domain configuration and upstream DNS server DNSSEC 
> support
> Apr 21 19:00:01 dnsmasq[310194]: reply 10.in-addr.arpa is BOGUS DS - not 
> secure
> Apr 21 19:00:01 dnsmasq[310194]: validation 1.1.0.10.in-addr.arpa is BOGUS
> 
> Relevant config lines are:
> 
> no-resolv
> bogus-priv
> server=8.8.8.8
> server=8.8.4.4
> rev-server=10.0.1.0/24,10.0.1.1
> server=/fritz.box/10.0.1.1
> dnssec
> trust-anchor=.,<the default value)
> 
> In the context of bogus-priv - is it actually expected that DNSSEC- 
> related queries are sent to non-local servers? My interpretation is that 
> they shouldn't be sent upstream here...
> 
> Best,
> 
> Dominik
> 
> 

This is a bit weird.

First, the bogus-priv thing. Without the

rev-server=10.0.1.0/24,10.0.1.1

line, then bogus-priv would have stopped the query going upstream,
but rev-server... gives us permission to send it to 10.0.1.1, so 
bogus-priv is not relevant.


In previous releases, because the query is being sent to a 
domain-specific server, dnsmasq would not have attempted to do DNSSEC 
validation, unless there was a configured DS record for the domain. In 
2.92 that changes to allow validation in the case that there's a 
chain-of-trust through the DNS tree into the data from the 
domain-specific server. The code handles the case where there's a 
non-secure answer from a domain-specific server.

This works pretty well, and in fact it works in this case if you change 
the rev-server line to

rev-server=10.0.1.0/8,10.0.1.1

now, dnsmasq will send the DS query for 10,in-addr.arpa to 10.0.1.1, get 
an unsigned answer, log a warning and continue.

Because the prefix is 24, in your case, the query goes to 8.8.8.8, and 
then we hit something strange. in-addr.arpa is DNSSEC signed and 
10.in-addr.arpa is NXDOMAIN. We'd therefore expect a signed answer 
proving that 10.in-addr.arpa doesn't exist.

If you ask the authoritative servers for in-addr.arpa for the DS record 
for 10.in-addr.arpa, you do, indeed get a signed answer saying it 
doesn't exist.

If you ask 8.8.8.8 or 1.1.1.1, you get an unsigned answer that says it 
doesn't exist. That's what trips things up. My guess is that we're 
tripping over code in the big public nameservers that stops them 
spamming the in-addr.arpa nameservers with all the millions of pointless 
and erroneous reverse lookups for RFC1918 addresses that escape into the 
public DNS. It's not at all sensible to trust non-signed 
non-existence-of-DS answers from non-domain-specific upstream servers. 
That provides a trivial way to bypass all of DNSSEC.


I guess we could solve this by making bogus-priv add the equivalent of

local=/10.in-addr.arpa/
local=/168.192.in-addr.arpa/
etc

to the config, but only for DNSSEC, basically the same low-down trick 
that Google and Cloudflare are playing.


TL;DR

Change the prefix length in rev-server to 8 and it all works fine. If we 
want to avoid tripping up on this, we may need to play tricks.

Any suggestions welcome.

Cheers,

Simon.







More information about the Dnsmasq-discuss mailing list