[PATCH 1/1] dns64: Fall back to plain AAAA query with synthall but no A records

Yorgos Thessalonikefs yorgos at nlnetlabs.nl
Wed Oct 18 10:17:40 UTC 2023


Hi Daniel,

The change looks good for me.
It does change current behavior but I think that the new behavior (when 
asked to synthesize but no A exists, fallback to the existing AAAA) 
makes sense for a default configuration.

However, I am not a DNS64 operator so if people here feel differently a 
new option could be introduced for that.

I already committed this (and the other patches, thanks!) to the 
repository and an extra option could be introduced in the future if 
people see the need for it.

Best regards,
-- Yorgos

On 09/10/2023 14:46, Daniel Gröber via Unbound-users wrote:
> Networks which only have tunneled IPv6 access but still want to go
> IPv6-only internally can use unbound's DNS64 module together with the
> dns64-synthall or dns64-ignore-aaaa options to direct most traffic (any
> dualstack domain) to their NAT64.
> 
> There is only one problem with this setup, currently domains with only AAAA
> records will fail to resolve.
> 
> To allow for this use-case arrange for the A sub-query to make the AAAA
> super query advance along the module stack when no records are returned.
> 
> Signed-off-by: Daniel Gröber <dxld at darkboxed.org>
> ---
> I kept this initial hakcy version as simple as possible, but IMO the
> whole DNS64 module needs a bit of a refactoring to do this cleanly.
> 
> I'm not entirely sure if the fallback behaviour should be controlled
> by a config option or not. I'm open to suggestions.
> 
>   dns64/dns64.c | 11 +++++++++++
>   1 file changed, 11 insertions(+)
> 
> diff --git a/dns64/dns64.c b/dns64/dns64.c
> index b856a86c..3cb60881 100644
> --- a/dns64/dns64.c
> +++ b/dns64/dns64.c
> @@ -981,6 +981,17 @@ dns64_inform_super(struct module_qstate* qstate, int id,
>   		return;
>   	}
>   
> +	/* When no A record is found for synthesis fall back to AAAA again. */
> +	if (qstate->qinfo.qtype == LDNS_RR_TYPE_A &&
> +	    qstate->return_rcode == LDNS_RCODE_NOERROR &&
> +	    !( qstate->return_msg &&
> +	       qstate->return_msg->rep &&
> +	       reply_find_answer_rrset(&qstate->qinfo, qstate->return_msg->rep)))
> +	{
> +		super_dq->state = DNS64_INTERNAL_QUERY;
> +		return;
> +	}
> +
>   	/* Use return code from A query in response to client. */
>   	if (super->return_rcode != LDNS_RCODE_NOERROR)
>   		super->return_rcode = qstate->return_rcode;


More information about the Unbound-users mailing list