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"