From ab2aa39b063d833b347b85370ba5dbace551ef5d Mon Sep 17 00:00:00 2001 From: Jorge Aparicio Date: Thu, 23 May 2024 13:08:01 +0200 Subject: [PATCH] NameServer: fix generation of SOA record `unbound` requires that the MNAME lies underneath the zone. That is `primaryNN.nameservers.com.` is not a valid MNAME for a nameserver authoritative over `mydomain.com.`. For that zone, `primaryNN.mydomain.com.` would be a valid MNAME. --- packages/dns-test/src/name_server.rs | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/packages/dns-test/src/name_server.rs b/packages/dns-test/src/name_server.rs index 9ac28dc5..14b5b891 100644 --- a/packages/dns-test/src/name_server.rs +++ b/packages/dns-test/src/name_server.rs @@ -153,7 +153,7 @@ impl NameServer { /// the zone pub fn new(implementation: &Implementation, zone: FQDN, network: &Network) -> Result { let ns_count = ns_count(); - let nameserver = primary_ns(ns_count); + let nameserver = primary_ns(ns_count, &zone); let image = implementation.clone().into(); let container = Container::run(&image, network)?; @@ -161,7 +161,7 @@ impl NameServer { zone: zone.clone(), ttl: DEFAULT_TTL, nameserver: nameserver.clone(), - admin: admin_ns(ns_count), + admin: admin_ns(ns_count, &zone), settings: SoaSettings::default(), }; let mut zone_file = ZoneFile::new(soa); @@ -439,12 +439,22 @@ pub struct Running { child: Child, } -fn primary_ns(ns_count: usize) -> FQDN { - FQDN(format!("primary{ns_count}.nameservers.com.")).unwrap() +fn primary_ns(ns_count: usize, zone: &FQDN) -> FQDN { + FQDN(format!("primary{ns_count}.{}", expand_zone(zone))).unwrap() } -fn admin_ns(ns_count: usize) -> FQDN { - FQDN(format!("admin{ns_count}.nameservers.com.")).unwrap() +fn admin_ns(ns_count: usize, zone: &FQDN) -> FQDN { + FQDN(format!("admin{ns_count}.{}", expand_zone(zone))).unwrap() +} + +fn expand_zone(zone: &FQDN) -> String { + if zone == &FQDN::ROOT { + "nameservers.com.".to_string() + } else if zone.num_labels() == 1 { + format!("nameservers.{}", zone.as_str()) + } else { + zone.to_string() + } } #[cfg(test)]