From 33f28c8d890d9d76d2a4a91724404fb68fccf6ca Mon Sep 17 00:00:00 2001 From: Shreyas Zare Date: Sat, 20 Jun 2020 17:34:33 +0530 Subject: [PATCH] SecondaryZone: using GetPrimaryNameServerAddresses() to get primary name server addresses. Using different timeout values for SOA and AXFR queries since AXFR may take longer time. Code refactoring done. --- DnsServerCore/Dns/Zones/SecondaryZone.cs | 75 ++++++------------------ 1 file changed, 19 insertions(+), 56 deletions(-) diff --git a/DnsServerCore/Dns/Zones/SecondaryZone.cs b/DnsServerCore/Dns/Zones/SecondaryZone.cs index 9c5887dc..35446c62 100644 --- a/DnsServerCore/Dns/Zones/SecondaryZone.cs +++ b/DnsServerCore/Dns/Zones/SecondaryZone.cs @@ -20,14 +20,13 @@ along with this program. If not, see . using DnsServerCore.Dns.ResourceRecords; using System; using System.Collections.Generic; -using System.Net; using System.Threading; using TechnitiumLibrary.Net.Dns; using TechnitiumLibrary.Net.Dns.ResourceRecords; namespace DnsServerCore.Dns.Zones { - public sealed class SecondaryZone : AuthZone + class SecondaryZone : AuthZone { #region variables @@ -36,7 +35,8 @@ namespace DnsServerCore.Dns.Zones readonly Timer _refreshTimer; const int REFRESH_TIMER_INTERVAL = 10000; - const int REFRESH_TIMEOUT = 60000; + const int REFRESH_SOA_TIMEOUT = 60000; + const int REFRESH_AXFR_TIMEOUT = 300000; //5 mins, 5 retries == 1 min per retry const int REFRESH_RETRIES = 5; DateTime _expiry; @@ -154,50 +154,7 @@ namespace DnsServerCore.Dns.Zones _isExpired = DateTime.UtcNow > _expiry; //get primary name server addresses - string primaryNameServer = soa.PrimaryNameServer; - List primaryNameServers = new List(); - - IReadOnlyList glueRecords = soaRecord.GetGlueRecords(); - if (glueRecords.Count > 0) - { - foreach (DnsResourceRecord glueRecord in glueRecords) - { - switch (glueRecord.Type) - { - case DnsResourceRecordType.A: - primaryNameServers.Add(new NameServerAddress(primaryNameServer, (glueRecord.RDATA as DnsARecord).Address)); - break; - - case DnsResourceRecordType.AAAA: - if (_dnsServer.PreferIPv6) - primaryNameServers.Add(new NameServerAddress(primaryNameServer, (glueRecord.RDATA as DnsAAAARecord).Address)); - - break; - } - } - } - else - { - //resolve addresses - DnsDatagram response = _dnsServer.DirectQuery(new DnsQuestionRecord(primaryNameServer, DnsResourceRecordType.A, DnsClass.IN)); - if (response != null) - { - IReadOnlyList addresses = DnsClient.ParseResponseA(response); - foreach (IPAddress address in addresses) - primaryNameServers.Add(new NameServerAddress(primaryNameServer, address)); - } - - if (_dnsServer.PreferIPv6) - { - response = _dnsServer.DirectQuery(new DnsQuestionRecord(primaryNameServer, DnsResourceRecordType.AAAA, DnsClass.IN)); - if (response != null) - { - IReadOnlyList addresses = DnsClient.ParseResponseAAAA(response); - foreach (IPAddress address in addresses) - primaryNameServers.Add(new NameServerAddress(primaryNameServer, address)); - } - } - } + IReadOnlyList primaryNameServers = GetPrimaryNameServerAddresses(_dnsServer); if (primaryNameServers.Count == 0) { @@ -237,12 +194,12 @@ namespace DnsServerCore.Dns.Zones } } - private bool RefreshZone(IReadOnlyList primaryNameServers) + private bool RefreshZone(IReadOnlyList nameServers) { try { - DnsClient client = new DnsClient(primaryNameServers); - client.Timeout = REFRESH_TIMEOUT; + DnsClient client = new DnsClient(nameServers); + client.Timeout = REFRESH_SOA_TIMEOUT; client.Retries = REFRESH_RETRIES; DnsDatagram soaRequest = new DnsDatagram(0, false, DnsOpcode.StandardQuery, false, false, false, false, false, false, DnsResponseCode.NoError, new DnsQuestionRecord[] { new DnsQuestionRecord(_name, DnsResourceRecordType.SOA, DnsClass.IN) }); @@ -274,15 +231,15 @@ namespace DnsServerCore.Dns.Zones { LogManager log = _dnsServer.LogManager; if (log != null) - log.Write("DNS Server successfully refreshed '" + _name + "' secondary zone from: " + soaResponse.Metadata.NameServerAddress.ToString()); + log.Write("DNS Server successfully checked for update to '" + _name + "' secondary zone from: " + soaResponse.Metadata.NameServerAddress.ToString()); return true; } //update available; do zone transfer with TCP transport - primaryNameServers = new NameServerAddress[] { new NameServerAddress(soaResponse.Metadata.NameServerAddress, DnsTransportProtocol.Tcp) }; - client = new DnsClient(primaryNameServers); - client.Timeout = REFRESH_TIMEOUT; + nameServers = new NameServerAddress[] { new NameServerAddress(soaResponse.Metadata.NameServerAddress, DnsTransportProtocol.Tcp) }; + client = new DnsClient(nameServers); + client.Timeout = REFRESH_AXFR_TIMEOUT; client.Retries = REFRESH_RETRIES; DnsDatagram axfrRequest = new DnsDatagram(0, false, DnsOpcode.StandardQuery, false, false, false, false, false, false, DnsResponseCode.NoError, new DnsQuestionRecord[] { new DnsQuestionRecord(_name, DnsResourceRecordType.AXFR, DnsClass.IN) }); @@ -317,13 +274,19 @@ namespace DnsServerCore.Dns.Zones } if (currentSoaRecord.IsZoneUpdateAvailable(axfrSoaRecord)) + { _dnsServer.AuthZoneManager.SyncRecords(_name, axfrResponse.Answer); - { LogManager log = _dnsServer.LogManager; if (log != null) log.Write("DNS Server successfully refreshed '" + _name + "' secondary zone from: " + axfrResponse.Metadata.NameServerAddress.ToString()); } + else + { + LogManager log = _dnsServer.LogManager; + if (log != null) + log.Write("DNS Server successfully checked for update to '" + _name + "' secondary zone from: " + soaResponse.Metadata.NameServerAddress.ToString()); + } return true; } @@ -334,7 +297,7 @@ namespace DnsServerCore.Dns.Zones { string strNameServers = null; - foreach (NameServerAddress nameServer in primaryNameServers) + foreach (NameServerAddress nameServer in nameServers) { if (strNameServers == null) strNameServers = nameServer.ToString();