diff --git a/CHANGELOG.md b/CHANGELOG.md index ddd87b4d..04491c1f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Technitium DNS Server Change Log +## Version 13.0.1 +Release Date: 23 September 2024 + +- Fixed issue in using proxy with forwarders that caused failure to use DNS-over-TOR with Cloudflare's hidden service. + ## Version 13.0 Release Date: 22 September 2024 diff --git a/DnsServerApp/DnsServerApp.csproj b/DnsServerApp/DnsServerApp.csproj index 91587287..326f331c 100644 --- a/DnsServerApp/DnsServerApp.csproj +++ b/DnsServerApp/DnsServerApp.csproj @@ -6,7 +6,7 @@ Exe net8.0 logo2.ico - 13.0 + 13.0.1 false Technitium Technitium DNS Server diff --git a/DnsServerCore/Dns/DnsServer.cs b/DnsServerCore/Dns/DnsServer.cs index 2922cfa8..1bf849cd 100644 --- a/DnsServerCore/Dns/DnsServer.cs +++ b/DnsServerCore/Dns/DnsServer.cs @@ -3315,16 +3315,19 @@ namespace DnsServerCore.Dns //use forwarders if (_concurrentForwarding) { - //recursive resolve forwarder - foreach (NameServerAddress forwarder in _forwarders) + if (_proxy is null) { - if (forwarder.IsIPEndPointStale) + //recursive resolve forwarders only when proxy is null else let proxy resolve it to allow using .onion or private domains + foreach (NameServerAddress forwarder in _forwarders) { - //refresh forwarder IPEndPoint if stale - await TechnitiumLibrary.TaskExtensions.TimeoutAsync(delegate (CancellationToken cancellationToken1) + if (forwarder.IsIPEndPointStale) { - return forwarder.RecursiveResolveIPAddressAsync(dnsCache, _proxy, _preferIPv6, _udpPayloadSize, _randomizeName, _resolverRetries, _resolverTimeout, _resolverConcurrency, _resolverMaxStackCount, cancellationToken1); - }, RECURSIVE_RESOLUTION_TIMEOUT, cancellationToken); + //refresh forwarder IPEndPoint if stale + await TechnitiumLibrary.TaskExtensions.TimeoutAsync(delegate (CancellationToken cancellationToken1) + { + return forwarder.RecursiveResolveIPAddressAsync(dnsCache, null, _preferIPv6, _udpPayloadSize, _randomizeName, _resolverRetries, _resolverTimeout, _resolverConcurrency, _resolverMaxStackCount, cancellationToken1); + }, RECURSIVE_RESOLUTION_TIMEOUT, cancellationToken); + } } } @@ -3352,14 +3355,17 @@ namespace DnsServerCore.Dns foreach (NameServerAddress forwarder in _forwarders) { - //recursive resolve forwarder - if (forwarder.IsIPEndPointStale) + if (_proxy is null) { - //refresh forwarder IPEndPoint if stale - await TechnitiumLibrary.TaskExtensions.TimeoutAsync(delegate (CancellationToken cancellationToken1) + //recursive resolve forwarder only when proxy is null else let proxy resolve it to allow using .onion or private domains + if (forwarder.IsIPEndPointStale) { - return forwarder.RecursiveResolveIPAddressAsync(dnsCache, _proxy, _preferIPv6, _udpPayloadSize, _randomizeName, _resolverRetries, _resolverTimeout, _resolverConcurrency, _resolverMaxStackCount, cancellationToken1); - }, RECURSIVE_RESOLUTION_TIMEOUT, cancellationToken); + //refresh forwarder IPEndPoint if stale + await TechnitiumLibrary.TaskExtensions.TimeoutAsync(delegate (CancellationToken cancellationToken1) + { + return forwarder.RecursiveResolveIPAddressAsync(dnsCache, null, _preferIPv6, _udpPayloadSize, _randomizeName, _resolverRetries, _resolverTimeout, _resolverConcurrency, _resolverMaxStackCount, cancellationToken1); + }, RECURSIVE_RESOLUTION_TIMEOUT, cancellationToken); + } } //query forwarder and update cache @@ -3441,14 +3447,18 @@ namespace DnsServerCore.Dns if (forwarder.Forwarder.Equals("this-server", StringComparison.OrdinalIgnoreCase)) continue; //skip resolving - //recursive resolve name server - if (forwarder.NameServer.IsIPEndPointStale) + NetProxy proxy = forwarder.GetProxy(_proxy); + if (proxy is null) { - //refresh forwarder IPEndPoint if stale - resolveTasks.Add(TechnitiumLibrary.TaskExtensions.TimeoutAsync(delegate (CancellationToken cancellationToken1) + //recursive resolve forwarder only when proxy is null else let proxy resolve it to allow using .onion or private domains + if (forwarder.NameServer.IsIPEndPointStale) { - return forwarder.NameServer.RecursiveResolveIPAddressAsync(dnsCache, forwarder.GetProxy(_proxy), _preferIPv6, _udpPayloadSize, _randomizeName, _resolverRetries, _resolverTimeout, _resolverConcurrency, _resolverMaxStackCount, cancellationToken1); - }, RECURSIVE_RESOLUTION_TIMEOUT)); + //refresh forwarder IPEndPoint if stale + resolveTasks.Add(TechnitiumLibrary.TaskExtensions.TimeoutAsync(delegate (CancellationToken cancellationToken1) + { + return forwarder.NameServer.RecursiveResolveIPAddressAsync(dnsCache, null, _preferIPv6, _udpPayloadSize, _randomizeName, _resolverRetries, _resolverTimeout, _resolverConcurrency, _resolverMaxStackCount, cancellationToken1); + }, RECURSIVE_RESOLUTION_TIMEOUT)); + } } } @@ -4501,7 +4511,15 @@ namespace DnsServerCore.Dns { if (_dohWebService is not null) { - await _dohWebService.DisposeAsync(); + try + { + await _dohWebService.DisposeAsync(); + } + catch (Exception ex) + { + _log?.Write(ex); + } + _dohWebService = null; } } @@ -4948,22 +4966,76 @@ namespace DnsServerCore.Dns } foreach (Socket udpListener in _udpListeners) - udpListener.Dispose(); + { + try + { + udpListener.Dispose(); + } + catch (Exception ex) + { + _log?.Write(ex); + } + } foreach (Socket udpProxyListener in _udpProxyListeners) - udpProxyListener.Dispose(); + { + try + { + udpProxyListener.Dispose(); + } + catch (Exception ex) + { + _log?.Write(ex); + } + } foreach (Socket tcpListener in _tcpListeners) - tcpListener.Dispose(); + { + try + { + tcpListener.Dispose(); + } + catch (Exception ex) + { + _log?.Write(ex); + } + } foreach (Socket tcpProxyListener in _tcpProxyListeners) - tcpProxyListener.Dispose(); + { + try + { + tcpProxyListener.Dispose(); + } + catch (Exception ex) + { + _log?.Write(ex); + } + } foreach (Socket tlsListener in _tlsListeners) - tlsListener.Dispose(); + { + try + { + tlsListener.Dispose(); + } + catch (Exception ex) + { + _log?.Write(ex); + } + } foreach (QuicListener quicListener in _quicListeners) - await quicListener.DisposeAsync(); + { + try + { + await quicListener.DisposeAsync(); + } + catch (Exception ex) + { + _log?.Write(ex); + } + } _udpListeners.Clear(); _udpProxyListeners.Clear(); diff --git a/DnsServerCore/DnsServerCore.csproj b/DnsServerCore/DnsServerCore.csproj index aa60fb38..3e219c18 100644 --- a/DnsServerCore/DnsServerCore.csproj +++ b/DnsServerCore/DnsServerCore.csproj @@ -12,7 +12,7 @@ DnsServer - 13.0 + 13.0.1 false diff --git a/DnsServerWindowsService/DnsServerWindowsService.csproj b/DnsServerWindowsService/DnsServerWindowsService.csproj index 930f3209..77f62444 100644 --- a/DnsServerWindowsService/DnsServerWindowsService.csproj +++ b/DnsServerWindowsService/DnsServerWindowsService.csproj @@ -8,7 +8,7 @@ DnsServerWindowsService DnsService logo2.ico - 13.0 + 13.0.1 false Shreyas Zare Technitium diff --git a/DnsServerWindowsSetup/DnsServerSetup.iss b/DnsServerWindowsSetup/DnsServerSetup.iss index 78642c19..8479e871 100644 --- a/DnsServerWindowsSetup/DnsServerSetup.iss +++ b/DnsServerWindowsSetup/DnsServerSetup.iss @@ -2,7 +2,7 @@ ; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES! #define MyAppName "Technitium DNS Server" -#define MyAppVersion "13.0" +#define MyAppVersion "13.0.1" #define MyAppPublisher "Technitium" #define MyAppURL "https://technitium.com/dns/" #define MyAppExeName "DnsServerSystemTrayApp.exe"