mirror of
https://github.com/fergalmoran/DnsServer.git
synced 2026-03-26 07:19:58 +00:00
Merge branch 'develop'
This commit is contained in:
@@ -3,7 +3,7 @@
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net7.0</TargetFramework>
|
||||
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
|
||||
<Version>5.0.1</Version>
|
||||
<Version>5.1</Version>
|
||||
<Company>Technitium</Company>
|
||||
<Product>Technitium DNS Server</Product>
|
||||
<Authors>Shreyas Zare</Authors>
|
||||
|
||||
@@ -35,6 +35,7 @@ using TechnitiumLibrary.Net;
|
||||
using TechnitiumLibrary.Net.Dns;
|
||||
using TechnitiumLibrary.Net.Dns.EDnsOptions;
|
||||
using TechnitiumLibrary.Net.Dns.ResourceRecords;
|
||||
using TechnitiumLibrary.Net.Http.Client;
|
||||
|
||||
namespace AdvancedBlocking
|
||||
{
|
||||
@@ -446,11 +447,18 @@ namespace AdvancedBlocking
|
||||
{
|
||||
if (allowed)
|
||||
{
|
||||
DnsDatagram internalResponse = await _dnsServer.DirectQueryAsync(request);
|
||||
if (internalResponse.Tag is null)
|
||||
internalResponse.Tag = DnsServerResponseType.Recursive;
|
||||
try
|
||||
{
|
||||
DnsDatagram internalResponse = await _dnsServer.DirectQueryAsync(request);
|
||||
if (internalResponse.Tag is null)
|
||||
internalResponse.Tag = DnsServerResponseType.Recursive;
|
||||
|
||||
return internalResponse;
|
||||
return internalResponse;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_dnsServer.WriteLog("Failed to resolve the request for allowed domain name with QNAME: " + question.Name + "; QTYPE: " + question.Type + "; QCLASS: " + question.Class + "\r\n" + ex.ToString());
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
@@ -923,7 +931,7 @@ namespace AdvancedBlocking
|
||||
handler.UseProxy = _dnsServer.Proxy is not null;
|
||||
handler.AutomaticDecompression = DecompressionMethods.All;
|
||||
|
||||
using (HttpClient http = new HttpClient(handler))
|
||||
using (HttpClient http = new HttpClient(new HttpClientRetryHandler(handler)))
|
||||
{
|
||||
if (File.Exists(_listFilePath))
|
||||
http.DefaultRequestHeaders.IfModifiedSince = File.GetLastWriteTimeUtc(_listFilePath);
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net7.0</TargetFramework>
|
||||
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
|
||||
<Version>1.0.1</Version>
|
||||
<Version>1.0.2</Version>
|
||||
<Company>Technitium</Company>
|
||||
<Product>Technitium DNS Server</Product>
|
||||
<Authors>Shreyas Zare</Authors>
|
||||
|
||||
@@ -164,7 +164,7 @@ namespace AdvancedForwarding
|
||||
|
||||
public Task<DnsDatagram> ProcessRequestAsync(DnsDatagram request, IPEndPoint remoteEP, DnsTransportProtocol protocol, bool isRecursionAllowed)
|
||||
{
|
||||
if (!_enableForwarding)
|
||||
if (!_enableForwarding || !request.RecursionDesired)
|
||||
return Task.FromResult<DnsDatagram>(null);
|
||||
|
||||
IPAddress remoteIP = remoteEP.Address;
|
||||
|
||||
@@ -485,6 +485,13 @@ namespace BlockPage
|
||||
using JsonDocument jsonDocument = JsonDocument.Parse(config);
|
||||
JsonElement jsonConfig = jsonDocument.RootElement;
|
||||
|
||||
bool enableWebServer = jsonConfig.GetPropertyValue("enableWebServer", true);
|
||||
if (!enableWebServer)
|
||||
{
|
||||
StopWebServer();
|
||||
return;
|
||||
}
|
||||
|
||||
_webServerLocalAddresses = jsonConfig.ReadArray("webServerLocalAddresses", IPAddress.Parse);
|
||||
|
||||
if (jsonConfig.TryGetProperty("webServerUseSelfSignedTlsCertificate", out JsonElement jsonWebServerUseSelfSignedTlsCertificate))
|
||||
@@ -573,6 +580,13 @@ namespace BlockPage
|
||||
|
||||
await File.WriteAllTextAsync(Path.Combine(dnsServer.ApplicationFolder, "dnsApp.config"), config);
|
||||
}
|
||||
|
||||
if (!jsonConfig.TryGetProperty("enableWebServer", out _))
|
||||
{
|
||||
config = config.Replace("\"webServerLocalAddresses\"", "\"enableWebServer\": true,\r\n \"webServerLocalAddresses\"");
|
||||
|
||||
await File.WriteAllTextAsync(Path.Combine(dnsServer.ApplicationFolder, "dnsApp.config"), config);
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net7.0</TargetFramework>
|
||||
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
|
||||
<Version>4.0</Version>
|
||||
<Version>4.1</Version>
|
||||
<Company>Technitium</Company>
|
||||
<Product>Technitium DNS Server</Product>
|
||||
<Authors>Shreyas Zare</Authors>
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
{
|
||||
"enableWebServer": true,
|
||||
"webServerLocalAddresses": [
|
||||
"0.0.0.0",
|
||||
"::"
|
||||
|
||||
@@ -242,11 +242,11 @@ namespace DnsBlockList
|
||||
switch (question.Type)
|
||||
{
|
||||
case DnsResourceRecordType.A:
|
||||
return new DnsDatagram(request.Identifier, true, DnsOpcode.StandardQuery, true, false, request.RecursionDesired, false, false, false, DnsResponseCode.NoError, request.Question, new DnsResourceRecord[] { new DnsResourceRecord(qname, DnsResourceRecordType.A, question.Class, appRecordTtl, new DnsARecordData(responseA)) });
|
||||
return new DnsDatagram(request.Identifier, true, DnsOpcode.StandardQuery, true, false, request.RecursionDesired, isRecursionAllowed, false, false, DnsResponseCode.NoError, request.Question, new DnsResourceRecord[] { new DnsResourceRecord(qname, DnsResourceRecordType.A, question.Class, appRecordTtl, new DnsARecordData(responseA)) });
|
||||
|
||||
case DnsResourceRecordType.TXT:
|
||||
if (!string.IsNullOrEmpty(responseTXT))
|
||||
return new DnsDatagram(request.Identifier, true, DnsOpcode.StandardQuery, true, false, request.RecursionDesired, false, false, false, DnsResponseCode.NoError, request.Question, new DnsResourceRecord[] { new DnsResourceRecord(qname, DnsResourceRecordType.TXT, question.Class, appRecordTtl, new DnsTXTRecordData(responseTXT)) });
|
||||
return new DnsDatagram(request.Identifier, true, DnsOpcode.StandardQuery, true, false, request.RecursionDesired, isRecursionAllowed, false, false, DnsResponseCode.NoError, request.Question, new DnsResourceRecord[] { new DnsResourceRecord(qname, DnsResourceRecordType.TXT, question.Class, appRecordTtl, new DnsTXTRecordData(responseTXT)) });
|
||||
|
||||
break;
|
||||
}
|
||||
@@ -254,7 +254,7 @@ namespace DnsBlockList
|
||||
//NODATA response
|
||||
DnsDatagram soaResponse = await _dnsServer.DirectQueryAsync(new DnsQuestionRecord(zoneName, DnsResourceRecordType.SOA, DnsClass.IN));
|
||||
|
||||
return new DnsDatagram(request.Identifier, true, DnsOpcode.StandardQuery, true, false, request.RecursionDesired, false, false, false, DnsResponseCode.NoError, request.Question, null, soaResponse.Answer);
|
||||
return new DnsDatagram(request.Identifier, true, DnsOpcode.StandardQuery, true, false, request.RecursionDesired, isRecursionAllowed, false, false, DnsResponseCode.NoError, request.Question, null, soaResponse.Answer);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net7.0</TargetFramework>
|
||||
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
|
||||
<Version>1.0</Version>
|
||||
<Version>1.0.1</Version>
|
||||
<Company>Technitium</Company>
|
||||
<Product>Technitium DNS Server</Product>
|
||||
<Authors>Shreyas Zare</Authors>
|
||||
|
||||
@@ -218,7 +218,7 @@ namespace Failover
|
||||
if (answers.Count > 1)
|
||||
answers.Shuffle();
|
||||
|
||||
return Task.FromResult(new DnsDatagram(request.Identifier, true, request.OPCODE, true, false, request.RecursionDesired, false, false, false, DnsResponseCode.NoError, request.Question, answers));
|
||||
return Task.FromResult(new DnsDatagram(request.Identifier, true, request.OPCODE, true, false, request.RecursionDesired, isRecursionAllowed, false, false, DnsResponseCode.NoError, request.Question, answers));
|
||||
}
|
||||
|
||||
case DnsResourceRecordType.TXT:
|
||||
@@ -257,7 +257,7 @@ namespace Failover
|
||||
if (jsonAppRecordData.TryGetProperty("secondary", out JsonElement jsonSecondary))
|
||||
GetStatusAnswers(jsonSecondary, FailoverType.Secondary, question, 30, healthCheck, healthCheckUrl, answers);
|
||||
|
||||
return Task.FromResult(new DnsDatagram(request.Identifier, true, request.OPCODE, true, false, request.RecursionDesired, false, false, false, DnsResponseCode.NoError, request.Question, answers));
|
||||
return Task.FromResult(new DnsDatagram(request.Identifier, true, request.OPCODE, true, false, request.RecursionDesired, isRecursionAllowed, false, false, DnsResponseCode.NoError, request.Question, answers));
|
||||
}
|
||||
|
||||
default:
|
||||
|
||||
@@ -195,7 +195,7 @@ namespace Failover
|
||||
}
|
||||
}
|
||||
|
||||
return Task.FromResult(new DnsDatagram(request.Identifier, true, request.OPCODE, true, false, request.RecursionDesired, false, false, false, DnsResponseCode.NoError, request.Question, answers));
|
||||
return Task.FromResult(new DnsDatagram(request.Identifier, true, request.OPCODE, true, false, request.RecursionDesired, isRecursionAllowed, false, false, DnsResponseCode.NoError, request.Question, answers));
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net7.0</TargetFramework>
|
||||
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
|
||||
<Version>6.0</Version>
|
||||
<Version>6.0.1</Version>
|
||||
<Company>Technitium</Company>
|
||||
<Product>Technitium DNS Server</Product>
|
||||
<Authors>Shreyas Zare</Authors>
|
||||
|
||||
@@ -160,7 +160,7 @@ namespace GeoContinent
|
||||
options = EDnsClientSubnetOptionData.GetEDnsClientSubnetOption(requestECS.SourcePrefixLength, 0, requestECS.Address);
|
||||
}
|
||||
|
||||
return Task.FromResult(new DnsDatagram(request.Identifier, true, request.OPCODE, true, false, request.RecursionDesired, false, false, false, DnsResponseCode.NoError, request.Question, answers, null, null, _dnsServer.UdpPayloadSize, EDnsHeaderFlags.None, options));
|
||||
return Task.FromResult(new DnsDatagram(request.Identifier, true, request.OPCODE, true, false, request.RecursionDesired, isRecursionAllowed, false, false, DnsResponseCode.NoError, request.Question, answers, null, null, _dnsServer.UdpPayloadSize, EDnsHeaderFlags.None, options));
|
||||
}
|
||||
|
||||
default:
|
||||
|
||||
@@ -133,7 +133,7 @@ namespace GeoContinent
|
||||
options = EDnsClientSubnetOptionData.GetEDnsClientSubnetOption(requestECS.SourcePrefixLength, 0, requestECS.Address);
|
||||
}
|
||||
|
||||
return Task.FromResult(new DnsDatagram(request.Identifier, true, request.OPCODE, true, false, request.RecursionDesired, false, false, false, DnsResponseCode.NoError, request.Question, answers, null, null, _dnsServer.UdpPayloadSize, EDnsHeaderFlags.None, options));
|
||||
return Task.FromResult(new DnsDatagram(request.Identifier, true, request.OPCODE, true, false, request.RecursionDesired, isRecursionAllowed, false, false, DnsResponseCode.NoError, request.Question, answers, null, null, _dnsServer.UdpPayloadSize, EDnsHeaderFlags.None, options));
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<TargetFramework>net7.0</TargetFramework>
|
||||
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
|
||||
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
|
||||
<Version>6.0</Version>
|
||||
<Version>6.0.1</Version>
|
||||
<Company>Technitium</Company>
|
||||
<Product>Technitium DNS Server</Product>
|
||||
<Authors>Shreyas Zare</Authors>
|
||||
|
||||
@@ -160,7 +160,7 @@ namespace GeoCountry
|
||||
options = EDnsClientSubnetOptionData.GetEDnsClientSubnetOption(requestECS.SourcePrefixLength, 0, requestECS.Address);
|
||||
}
|
||||
|
||||
return Task.FromResult(new DnsDatagram(request.Identifier, true, request.OPCODE, true, false, request.RecursionDesired, false, false, false, DnsResponseCode.NoError, request.Question, answers, null, null, _dnsServer.UdpPayloadSize, EDnsHeaderFlags.None, options));
|
||||
return Task.FromResult(new DnsDatagram(request.Identifier, true, request.OPCODE, true, false, request.RecursionDesired, isRecursionAllowed, false, false, DnsResponseCode.NoError, request.Question, answers, null, null, _dnsServer.UdpPayloadSize, EDnsHeaderFlags.None, options));
|
||||
}
|
||||
|
||||
default:
|
||||
|
||||
@@ -133,7 +133,7 @@ namespace GeoCountry
|
||||
options = EDnsClientSubnetOptionData.GetEDnsClientSubnetOption(requestECS.SourcePrefixLength, 0, requestECS.Address);
|
||||
}
|
||||
|
||||
return Task.FromResult(new DnsDatagram(request.Identifier, true, request.OPCODE, true, false, request.RecursionDesired, false, false, false, DnsResponseCode.NoError, request.Question, answers, null, null, _dnsServer.UdpPayloadSize, EDnsHeaderFlags.None, options));
|
||||
return Task.FromResult(new DnsDatagram(request.Identifier, true, request.OPCODE, true, false, request.RecursionDesired, isRecursionAllowed, false, false, DnsResponseCode.NoError, request.Question, answers, null, null, _dnsServer.UdpPayloadSize, EDnsHeaderFlags.None, options));
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<TargetFramework>net7.0</TargetFramework>
|
||||
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
|
||||
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
|
||||
<Version>6.0</Version>
|
||||
<Version>6.0.1</Version>
|
||||
<Company>Technitium</Company>
|
||||
<Product>Technitium DNS Server</Product>
|
||||
<Authors>Shreyas Zare</Authors>
|
||||
|
||||
@@ -192,7 +192,7 @@ namespace GeoDistance
|
||||
options = EDnsClientSubnetOptionData.GetEDnsClientSubnetOption(requestECS.SourcePrefixLength, 0, requestECS.Address);
|
||||
}
|
||||
|
||||
return Task.FromResult(new DnsDatagram(request.Identifier, true, request.OPCODE, true, false, request.RecursionDesired, false, false, false, DnsResponseCode.NoError, request.Question, answers, null, null, _dnsServer.UdpPayloadSize, EDnsHeaderFlags.None, options));
|
||||
return Task.FromResult(new DnsDatagram(request.Identifier, true, request.OPCODE, true, false, request.RecursionDesired, isRecursionAllowed, false, false, DnsResponseCode.NoError, request.Question, answers, null, null, _dnsServer.UdpPayloadSize, EDnsHeaderFlags.None, options));
|
||||
}
|
||||
|
||||
default:
|
||||
|
||||
@@ -165,7 +165,7 @@ namespace GeoDistance
|
||||
options = EDnsClientSubnetOptionData.GetEDnsClientSubnetOption(requestECS.SourcePrefixLength, 0, requestECS.Address);
|
||||
}
|
||||
|
||||
return Task.FromResult(new DnsDatagram(request.Identifier, true, request.OPCODE, true, false, request.RecursionDesired, false, false, false, DnsResponseCode.NoError, request.Question, answers, null, null, _dnsServer.UdpPayloadSize, EDnsHeaderFlags.None, options));
|
||||
return Task.FromResult(new DnsDatagram(request.Identifier, true, request.OPCODE, true, false, request.RecursionDesired, isRecursionAllowed, false, false, DnsResponseCode.NoError, request.Question, answers, null, null, _dnsServer.UdpPayloadSize, EDnsHeaderFlags.None, options));
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<TargetFramework>net7.0</TargetFramework>
|
||||
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
|
||||
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
|
||||
<Version>6.0</Version>
|
||||
<Version>6.0.1</Version>
|
||||
<Company>Technitium</Company>
|
||||
<Product>Technitium DNS Server</Product>
|
||||
<Authors>Shreyas Zare</Authors>
|
||||
|
||||
@@ -59,7 +59,7 @@ namespace NoData
|
||||
{
|
||||
DnsResourceRecordType blockedType = Enum.Parse<DnsResourceRecordType>(jsonBlockedType.GetString(), true);
|
||||
if ((blockedType == question.Type) || (blockedType == DnsResourceRecordType.ANY))
|
||||
return Task.FromResult(new DnsDatagram(request.Identifier, true, request.OPCODE, false, false, request.RecursionDesired, false, false, false, DnsResponseCode.NoError, request.Question));
|
||||
return Task.FromResult(new DnsDatagram(request.Identifier, true, request.OPCODE, false, false, request.RecursionDesired, isRecursionAllowed, false, false, DnsResponseCode.NoError, request.Question));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net7.0</TargetFramework>
|
||||
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
|
||||
<Version>2.0</Version>
|
||||
<Version>2.0.1</Version>
|
||||
<Company>Technitium</Company>
|
||||
<Product>Technitium DNS Server</Product>
|
||||
<Authors>Shreyas Zare</Authors>
|
||||
|
||||
@@ -222,7 +222,7 @@ namespace SplitHorizon
|
||||
if (answers.Count > 1)
|
||||
answers.Shuffle();
|
||||
|
||||
return Task.FromResult(new DnsDatagram(request.Identifier, true, request.OPCODE, true, false, request.RecursionDesired, false, false, false, DnsResponseCode.NoError, request.Question, answers));
|
||||
return Task.FromResult(new DnsDatagram(request.Identifier, true, request.OPCODE, true, false, request.RecursionDesired, isRecursionAllowed, false, false, DnsResponseCode.NoError, request.Question, answers));
|
||||
}
|
||||
|
||||
default:
|
||||
|
||||
@@ -113,7 +113,7 @@ namespace SplitHorizon
|
||||
else
|
||||
answers = new DnsResourceRecord[] { new DnsResourceRecord(question.Name, DnsResourceRecordType.CNAME, DnsClass.IN, appRecordTtl, new DnsCNAMERecordData(cname)) };
|
||||
|
||||
return Task.FromResult(new DnsDatagram(request.Identifier, true, request.OPCODE, true, false, request.RecursionDesired, false, false, false, DnsResponseCode.NoError, request.Question, answers));
|
||||
return Task.FromResult(new DnsDatagram(request.Identifier, true, request.OPCODE, true, false, request.RecursionDesired, isRecursionAllowed, false, false, DnsResponseCode.NoError, request.Question, answers));
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net7.0</TargetFramework>
|
||||
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
|
||||
<Version>6.0</Version>
|
||||
<Version>6.0.1</Version>
|
||||
<Company>Technitium</Company>
|
||||
<Product>Technitium DNS Server</Product>
|
||||
<Authors>Shreyas Zare</Authors>
|
||||
|
||||
@@ -73,7 +73,7 @@ namespace WhatIsMyDns
|
||||
return Task.FromResult<DnsDatagram>(null);
|
||||
}
|
||||
|
||||
return Task.FromResult(new DnsDatagram(request.Identifier, true, request.OPCODE, true, false, request.RecursionDesired, false, false, false, DnsResponseCode.NoError, request.Question, new DnsResourceRecord[] { answer }));
|
||||
return Task.FromResult(new DnsDatagram(request.Identifier, true, request.OPCODE, true, false, request.RecursionDesired, isRecursionAllowed, false, false, DnsResponseCode.NoError, request.Question, new DnsResourceRecord[] { answer }));
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<TargetFramework>net7.0</TargetFramework>
|
||||
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
|
||||
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
|
||||
<Version>5.0.1</Version>
|
||||
<Version>5.0.2</Version>
|
||||
<Company>Technitium</Company>
|
||||
<Product>Technitium DNS Server</Product>
|
||||
<Authors>Shreyas Zare</Authors>
|
||||
|
||||
@@ -104,10 +104,10 @@ namespace WildIp
|
||||
//NODATA reponse
|
||||
DnsDatagram soaResponse = await _dnsServer.DirectQueryAsync(new DnsQuestionRecord(zoneName, DnsResourceRecordType.SOA, DnsClass.IN));
|
||||
|
||||
return new DnsDatagram(request.Identifier, true, DnsOpcode.StandardQuery, true, false, request.RecursionDesired, false, false, false, DnsResponseCode.NoError, request.Question, null, soaResponse.Answer);
|
||||
return new DnsDatagram(request.Identifier, true, DnsOpcode.StandardQuery, true, false, request.RecursionDesired, isRecursionAllowed, false, false, DnsResponseCode.NoError, request.Question, null, soaResponse.Answer);
|
||||
}
|
||||
|
||||
return new DnsDatagram(request.Identifier, true, request.OPCODE, true, false, request.RecursionDesired, false, false, false, DnsResponseCode.NoError, request.Question, new DnsResourceRecord[] { answer });
|
||||
return new DnsDatagram(request.Identifier, true, request.OPCODE, true, false, request.RecursionDesired, isRecursionAllowed, false, false, DnsResponseCode.NoError, request.Question, new DnsResourceRecord[] { answer });
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<TargetFramework>net7.0</TargetFramework>
|
||||
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
|
||||
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
|
||||
<Version>2.1</Version>
|
||||
<Version>2.1.1</Version>
|
||||
<Company>Technitium</Company>
|
||||
<Product>Technitium DNS Server</Product>
|
||||
<Authors>Shreyas Zare</Authors>
|
||||
|
||||
11
CHANGELOG.md
11
CHANGELOG.md
@@ -1,5 +1,16 @@
|
||||
# Technitium DNS Server Change Log
|
||||
|
||||
## Version 11.0.3
|
||||
Release Date: 11 March 2023
|
||||
|
||||
- Fixed DoS vulnerability reported by Xiang Li, [Network and Information Security Lab, Tsinghua University](https://netsec.ccert.edu.cn/) that an attacker can use to send bad-formatted UDP packet to cause the outbound requests to fail to resolve due to insufficient validation.
|
||||
- Fixed issue reported by Xiang Li, [Network and Information Security Lab, Tsinghua University](https://netsec.ccert.edu.cn/) that caused conditional forwarder to not honoring RD flag in requests.
|
||||
- Fixed issue reported by Xiang Li, [Network and Information Security Lab, Tsinghua University](https://netsec.ccert.edu.cn/) that made amplification attacks more effective due to max 4096 bytes limit for responses.
|
||||
- Fixed issue in loading of Allowed and Blocked zones that resulted in loading to take too much time caused due to indexing feature added in last update for authoritative zones.
|
||||
- Updated DNS server UDP response processing to remove glue records for MX responses and try again to send it instead of sending a truncated response that was causing issue with some old mail servers that did not perform follow up request over TCP.
|
||||
- Block Page App: Updated the app to support option to disable the web server without requiring to uninstall the app to stop the web server.
|
||||
- Multiple other minor bug fixes and improvements.
|
||||
|
||||
## Version 11.0.2
|
||||
Release Date: 26 February 2023
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>net7.0</TargetFramework>
|
||||
<ApplicationIcon>logo2.ico</ApplicationIcon>
|
||||
<Version>11.0.2</Version>
|
||||
<Version>11.0.3</Version>
|
||||
<Company>Technitium</Company>
|
||||
<Product>Technitium DNS Server</Product>
|
||||
<Authors>Shreyas Zare</Authors>
|
||||
|
||||
@@ -88,7 +88,6 @@ namespace DnsServerCore.Dns
|
||||
|
||||
#region variables
|
||||
|
||||
const int UDP_MAX_BUFFER_SIZE = 4096;
|
||||
internal const int MAX_CNAME_HOPS = 16;
|
||||
const int SERVE_STALE_WAIT_TIME = 1800;
|
||||
|
||||
@@ -298,7 +297,7 @@ namespace DnsServerCore.Dns
|
||||
|
||||
private async Task ReadUdpRequestAsync(Socket udpListener)
|
||||
{
|
||||
byte[] recvBuffer = new byte[UDP_MAX_BUFFER_SIZE];
|
||||
byte[] recvBuffer = new byte[DnsDatagram.EDNS_MAX_UDP_PAYLOAD_SIZE];
|
||||
using MemoryStream recvBufferStream = new MemoryStream(recvBuffer);
|
||||
|
||||
try
|
||||
@@ -323,7 +322,7 @@ namespace DnsServerCore.Dns
|
||||
|
||||
while (true)
|
||||
{
|
||||
recvBufferStream.SetLength(UDP_MAX_BUFFER_SIZE); //resetting length before using buffer
|
||||
recvBufferStream.SetLength(DnsDatagram.EDNS_MAX_UDP_PAYLOAD_SIZE); //resetting length before using buffer
|
||||
|
||||
try
|
||||
{
|
||||
@@ -415,8 +414,8 @@ namespace DnsServerCore.Dns
|
||||
|
||||
if (request.EDNS is null)
|
||||
sendBuffer = new byte[512];
|
||||
else if (request.EDNS.UdpPayloadSize > UDP_MAX_BUFFER_SIZE)
|
||||
sendBuffer = new byte[UDP_MAX_BUFFER_SIZE];
|
||||
else if (request.EDNS.UdpPayloadSize > _udpPayloadSize)
|
||||
sendBuffer = new byte[_udpPayloadSize];
|
||||
else
|
||||
sendBuffer = new byte[request.EDNS.UdpPayloadSize];
|
||||
|
||||
@@ -435,10 +434,32 @@ namespace DnsServerCore.Dns
|
||||
}
|
||||
else
|
||||
{
|
||||
if (response.Question[0].Type == DnsResourceRecordType.IXFR)
|
||||
response = new DnsDatagram(response.Identifier, true, response.OPCODE, response.AuthoritativeAnswer, false, response.RecursionDesired, response.RecursionAvailable, response.AuthenticData, response.CheckingDisabled, response.RCODE, response.Question, new DnsResourceRecord[] { response.Answer[0] }, null, null, request.EDNS is null ? ushort.MinValue : _udpPayloadSize) { Tag = DnsServerResponseType.Authoritative }; //truncate response
|
||||
else
|
||||
response = new DnsDatagram(response.Identifier, true, response.OPCODE, response.AuthoritativeAnswer, true, response.RecursionDesired, response.RecursionAvailable, response.AuthenticData, response.CheckingDisabled, response.RCODE, response.Question, null, null, null, request.EDNS is null ? ushort.MinValue : _udpPayloadSize) { Tag = DnsServerResponseType.Authoritative };
|
||||
switch (response.Question[0].Type)
|
||||
{
|
||||
case DnsResourceRecordType.MX:
|
||||
//removing glue records and trying again since some mail servers fail to fallback to TCP on truncation
|
||||
response = response.CloneWithoutGlueRecords();
|
||||
sendBufferStream.Position = 0;
|
||||
|
||||
try
|
||||
{
|
||||
response.WriteTo(sendBufferStream);
|
||||
}
|
||||
catch (NotSupportedException)
|
||||
{
|
||||
//send TC since response is still big even after removing glue records
|
||||
response = new DnsDatagram(response.Identifier, true, response.OPCODE, response.AuthoritativeAnswer, true, response.RecursionDesired, response.RecursionAvailable, response.AuthenticData, response.CheckingDisabled, response.RCODE, response.Question, null, null, null, request.EDNS is null ? ushort.MinValue : _udpPayloadSize) { Tag = DnsServerResponseType.Authoritative };
|
||||
}
|
||||
break;
|
||||
|
||||
case DnsResourceRecordType.IXFR:
|
||||
response = new DnsDatagram(response.Identifier, true, response.OPCODE, response.AuthoritativeAnswer, false, response.RecursionDesired, response.RecursionAvailable, response.AuthenticData, response.CheckingDisabled, response.RCODE, response.Question, new DnsResourceRecord[] { response.Answer[0] }, null, null, request.EDNS is null ? ushort.MinValue : _udpPayloadSize) { Tag = DnsServerResponseType.Authoritative }; //truncate response
|
||||
break;
|
||||
|
||||
default:
|
||||
response = new DnsDatagram(response.Identifier, true, response.OPCODE, response.AuthoritativeAnswer, true, response.RecursionDesired, response.RecursionAvailable, response.AuthenticData, response.CheckingDisabled, response.RCODE, response.Question, null, null, null, request.EDNS is null ? ushort.MinValue : _udpPayloadSize) { Tag = DnsServerResponseType.Authoritative };
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
sendBufferStream.Position = 0;
|
||||
@@ -1892,6 +1913,9 @@ namespace DnsServerCore.Dns
|
||||
break;
|
||||
|
||||
case DnsResourceRecordType.FWD:
|
||||
if (!request.RecursionDesired || !isRecursionAllowed)
|
||||
return new DnsDatagram(request.Identifier, true, DnsOpcode.StandardQuery, false, false, request.RecursionDesired, isRecursionAllowed, false, false, DnsResponseCode.Refused, request.Question) { Tag = DnsServerResponseType.Authoritative };
|
||||
|
||||
//do conditional forwarding
|
||||
return await ProcessRecursiveQueryAsync(request, remoteEP, protocol, response.Authority, _dnssecValidation, false, skipDnsAppAuthoritativeRequestHandlers);
|
||||
|
||||
@@ -1932,7 +1956,7 @@ namespace DnsServerCore.Dns
|
||||
}
|
||||
}
|
||||
|
||||
DnsDatagram response = _authZoneManager.Query(request);
|
||||
DnsDatagram response = _authZoneManager.Query(request, isRecursionAllowed);
|
||||
if (response is not null)
|
||||
{
|
||||
response.Tag = DnsServerResponseType.Authoritative;
|
||||
@@ -2514,7 +2538,7 @@ namespace DnsServerCore.Dns
|
||||
if (record.Type != DnsResourceRecordType.CNAME)
|
||||
break; //no further CNAME records exists
|
||||
|
||||
DnsDatagram newRequest = new DnsDatagram(0, false, DnsOpcode.StandardQuery, false, false, true, false, false, false, DnsResponseCode.NoError, new DnsQuestionRecord[] { new DnsQuestionRecord((record.RDATA as DnsCNAMERecordData).Domain, request.Question[0].Type, request.Question[0].Class) });
|
||||
DnsDatagram newRequest = new DnsDatagram(0, false, DnsOpcode.StandardQuery, false, false, true, false, false, false, DnsResponseCode.NoError, new DnsQuestionRecord[] { new DnsQuestionRecord((record.RDATA as DnsCNAMERecordData).Domain, request.Question[0].Type, request.Question[0].Class) }, null, null, null, _udpPayloadSize);
|
||||
|
||||
//check allowed zone
|
||||
inAllowedZone = _allowedZoneManager.IsAllowed(newRequest) || _blockListZoneManager.IsAllowed(newRequest);
|
||||
@@ -2535,8 +2559,8 @@ namespace DnsServerCore.Dns
|
||||
//copy last response answers
|
||||
answer.AddRange(blockedResponse.Answer);
|
||||
|
||||
//cname response cannot be for type NS, MX, SRV so no additional section in response
|
||||
return new DnsDatagram(request.Identifier, true, DnsOpcode.StandardQuery, false, false, true, true, false, false, DnsResponseCode.NoError, request.Question, answer, blockedResponse.Authority) { Tag = blockedResponse.Tag };
|
||||
//include blocked response additional section to pass on Extended DNS Errors
|
||||
return new DnsDatagram(request.Identifier, true, DnsOpcode.StandardQuery, false, false, true, true, false, false, DnsResponseCode.NoError, request.Question, answer, blockedResponse.Authority, blockedResponse.Additional) { Tag = blockedResponse.Tag };
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -157,7 +157,7 @@ namespace DnsServerCore.Dns
|
||||
|
||||
if (authResponse is null)
|
||||
{
|
||||
authResponse = _authZoneManager.Query(request);
|
||||
authResponse = _authZoneManager.Query(request, true);
|
||||
if (authResponse is not null)
|
||||
{
|
||||
if ((authResponse.RCODE != DnsResponseCode.NoError) || (authResponse.Answer.Count > 0) || (authResponse.Authority.Count == 0) || authResponse.IsFirstAuthoritySOA())
|
||||
|
||||
@@ -76,9 +76,7 @@ namespace DnsServerCore.Dns.ZoneManagers
|
||||
|
||||
try
|
||||
{
|
||||
LogManager log = _dnsServer.LogManager;
|
||||
if (log != null)
|
||||
log.Write("DNS Server is loading allowed zone file: " + allowedZoneFile);
|
||||
_dnsServer.LogManager?.Write("DNS Server is loading allowed zone file: " + allowedZoneFile);
|
||||
|
||||
using (FileStream fS = new FileStream(allowedZoneFile, FileMode.Open, FileAccess.Read))
|
||||
{
|
||||
@@ -92,9 +90,15 @@ namespace DnsServerCore.Dns.ZoneManagers
|
||||
{
|
||||
case 1:
|
||||
int length = bR.ReadInt32();
|
||||
int i = 0;
|
||||
|
||||
for (int i = 0; i < length; i++)
|
||||
AllowZone(bR.ReadShortString());
|
||||
_zoneManager.LoadSpecialPrimaryZones(delegate ()
|
||||
{
|
||||
if (i++ < length)
|
||||
return bR.ReadShortString();
|
||||
|
||||
return null;
|
||||
}, _soaRecord, _nsRecord);
|
||||
|
||||
break;
|
||||
|
||||
@@ -103,19 +107,21 @@ namespace DnsServerCore.Dns.ZoneManagers
|
||||
}
|
||||
}
|
||||
|
||||
if (log != null)
|
||||
log.Write("DNS Server allowed zone file was loaded: " + allowedZoneFile);
|
||||
_dnsServer.LogManager?.Write("DNS Server allowed zone file was loaded: " + allowedZoneFile);
|
||||
}
|
||||
catch (FileNotFoundException)
|
||||
{ }
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogManager log = _dnsServer.LogManager;
|
||||
if (log != null)
|
||||
log.Write("DNS Server encountered an error while loading allowed zone file: " + allowedZoneFile + "\r\n" + ex.ToString());
|
||||
_dnsServer.LogManager?.Write("DNS Server encountered an error while loading allowed zone file: " + allowedZoneFile + "\r\n" + ex.ToString());
|
||||
}
|
||||
}
|
||||
|
||||
public void ImportZones(string[] domains)
|
||||
{
|
||||
_zoneManager.LoadSpecialPrimaryZones(domains, _soaRecord, _nsRecord);
|
||||
}
|
||||
|
||||
public bool AllowZone(string domain)
|
||||
{
|
||||
if (_zoneManager.CreateSpecialPrimaryZone(domain, _soaRecord, _nsRecord) != null)
|
||||
@@ -171,9 +177,7 @@ namespace DnsServerCore.Dns.ZoneManagers
|
||||
bW.WriteShortString(zone.Name);
|
||||
}
|
||||
|
||||
LogManager log = _dnsServer.LogManager;
|
||||
if (log != null)
|
||||
log.Write("DNS Server allowed zone file was saved: " + allowedZoneFile);
|
||||
_dnsServer.LogManager?.Write("DNS Server allowed zone file was saved: " + allowedZoneFile);
|
||||
}
|
||||
|
||||
public bool IsAllowed(DnsDatagram request)
|
||||
@@ -181,7 +185,7 @@ namespace DnsServerCore.Dns.ZoneManagers
|
||||
if (_zoneManager.TotalZones < 1)
|
||||
return false;
|
||||
|
||||
return _zoneManager.Query(request) is not null;
|
||||
return _zoneManager.Query(request, false) is not null;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
@@ -134,18 +134,14 @@ namespace DnsServerCore.Dns.ZoneManagers
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogManager log = _dnsServer.LogManager;
|
||||
if (log != null)
|
||||
log.Write(ex);
|
||||
_dnsServer.LogManager?.Write(ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogManager log = _dnsServer.LogManager;
|
||||
if (log != null)
|
||||
log.Write(ex);
|
||||
_dnsServer.LogManager?.Write(ex);
|
||||
}
|
||||
|
||||
//update server domain
|
||||
@@ -744,15 +740,11 @@ namespace DnsServerCore.Dns.ZoneManagers
|
||||
_zoneIndex.Add(zoneInfo);
|
||||
}
|
||||
|
||||
LogManager log = _dnsServer.LogManager;
|
||||
if (log != null)
|
||||
log.Write("DNS Server successfully loaded zone file: " + zoneFile);
|
||||
_dnsServer.LogManager?.Write("DNS Server successfully loaded zone file: " + zoneFile);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogManager log = _dnsServer.LogManager;
|
||||
if (log != null)
|
||||
log.Write("DNS Server failed to load zone file: " + zoneFile + "\r\n" + ex.ToString());
|
||||
_dnsServer.LogManager?.Write("DNS Server failed to load zone file: " + zoneFile + "\r\n" + ex.ToString());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -788,6 +780,60 @@ namespace DnsServerCore.Dns.ZoneManagers
|
||||
return null;
|
||||
}
|
||||
|
||||
internal void LoadSpecialPrimaryZones(IReadOnlyList<string> zoneNames, DnsSOARecordData soaRecord, DnsNSRecordData ns)
|
||||
{
|
||||
_zoneIndexLock.EnterWriteLock();
|
||||
try
|
||||
{
|
||||
foreach (string zoneName in zoneNames)
|
||||
{
|
||||
PrimaryZone apexZone = new PrimaryZone(_dnsServer, zoneName, soaRecord, ns);
|
||||
|
||||
if (_root.TryAdd(apexZone))
|
||||
{
|
||||
AuthZoneInfo zoneInfo = new AuthZoneInfo(apexZone);
|
||||
_zoneIndex.Add(zoneInfo);
|
||||
}
|
||||
}
|
||||
|
||||
_zoneIndex.Sort();
|
||||
}
|
||||
finally
|
||||
{
|
||||
_zoneIndexLock.ExitWriteLock();
|
||||
}
|
||||
}
|
||||
|
||||
internal void LoadSpecialPrimaryZones(Func<string> getZoneName, DnsSOARecordData soaRecord, DnsNSRecordData ns)
|
||||
{
|
||||
_zoneIndexLock.EnterWriteLock();
|
||||
try
|
||||
{
|
||||
string zoneName;
|
||||
|
||||
while (true)
|
||||
{
|
||||
zoneName = getZoneName();
|
||||
if (zoneName is null)
|
||||
break;
|
||||
|
||||
PrimaryZone apexZone = new PrimaryZone(_dnsServer, zoneName, soaRecord, ns);
|
||||
|
||||
if (_root.TryAdd(apexZone))
|
||||
{
|
||||
AuthZoneInfo zoneInfo = new AuthZoneInfo(apexZone);
|
||||
_zoneIndex.Add(zoneInfo);
|
||||
}
|
||||
}
|
||||
|
||||
_zoneIndex.Sort();
|
||||
}
|
||||
finally
|
||||
{
|
||||
_zoneIndexLock.ExitWriteLock();
|
||||
}
|
||||
}
|
||||
|
||||
public AuthZoneInfo CreatePrimaryZone(string zoneName, string primaryNameServer, bool @internal)
|
||||
{
|
||||
PrimaryZone apexZone = new PrimaryZone(_dnsServer, zoneName, primaryNameServer, @internal);
|
||||
@@ -1849,7 +1895,7 @@ namespace DnsServerCore.Dns.ZoneManagers
|
||||
return null;
|
||||
}
|
||||
|
||||
public DnsDatagram Query(DnsDatagram request)
|
||||
public DnsDatagram Query(DnsDatagram request, bool isRecursionAllowed)
|
||||
{
|
||||
DnsQuestionRecord question = request.Question[0];
|
||||
|
||||
@@ -1934,7 +1980,7 @@ namespace DnsServerCore.Dns.ZoneManagers
|
||||
}
|
||||
}
|
||||
|
||||
return new DnsDatagram(request.Identifier, true, DnsOpcode.StandardQuery, true, false, request.RecursionDesired, false, false, false, rCode, request.Question, answer, authority);
|
||||
return new DnsDatagram(request.Identifier, true, DnsOpcode.StandardQuery, true, false, request.RecursionDesired, isRecursionAllowed, false, false, rCode, request.Question, answer, authority);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -2092,7 +2138,7 @@ namespace DnsServerCore.Dns.ZoneManagers
|
||||
}
|
||||
}
|
||||
|
||||
return new DnsDatagram(request.Identifier, true, DnsOpcode.StandardQuery, true, false, request.RecursionDesired, false, false, false, DnsResponseCode.NoError, request.Question, answers, authority, additional);
|
||||
return new DnsDatagram(request.Identifier, true, DnsOpcode.StandardQuery, true, false, request.RecursionDesired, isRecursionAllowed, false, false, DnsResponseCode.NoError, request.Question, answers, authority, additional);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2350,9 +2396,7 @@ namespace DnsServerCore.Dns.ZoneManagers
|
||||
}
|
||||
}
|
||||
|
||||
LogManager log = _dnsServer.LogManager;
|
||||
if (log != null)
|
||||
log.Write("Saved zone file for domain: " + (zoneName == "" ? "<root>" : zoneName));
|
||||
_dnsServer.LogManager?.Write("Saved zone file for domain: " + (zoneName == "" ? "<root>" : zoneName));
|
||||
}
|
||||
|
||||
public void DeleteZoneFile(string zoneName)
|
||||
@@ -2361,9 +2405,7 @@ namespace DnsServerCore.Dns.ZoneManagers
|
||||
|
||||
File.Delete(Path.Combine(_dnsServer.ConfigFolder, "zones", zoneName + ".zone"));
|
||||
|
||||
LogManager log = _dnsServer.LogManager;
|
||||
if (log != null)
|
||||
log.Write("Deleted zone file for domain: " + zoneName);
|
||||
_dnsServer.LogManager?.Write("Deleted zone file for domain: " + zoneName);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
@@ -29,6 +29,7 @@ using TechnitiumLibrary.Net;
|
||||
using TechnitiumLibrary.Net.Dns;
|
||||
using TechnitiumLibrary.Net.Dns.EDnsOptions;
|
||||
using TechnitiumLibrary.Net.Dns.ResourceRecords;
|
||||
using TechnitiumLibrary.Net.Http.Client;
|
||||
|
||||
namespace DnsServerCore.Dns.ZoneManagers
|
||||
{
|
||||
@@ -392,7 +393,7 @@ namespace DnsServerCore.Dns.ZoneManagers
|
||||
handler.UseProxy = _dnsServer.Proxy is not null;
|
||||
handler.AutomaticDecompression = DecompressionMethods.All;
|
||||
|
||||
using (HttpClient http = new HttpClient(handler))
|
||||
using (HttpClient http = new HttpClient(new HttpClientRetryHandler(handler)))
|
||||
{
|
||||
if (File.Exists(listFilePath))
|
||||
http.DefaultRequestHeaders.IfModifiedSince = File.GetLastWriteTimeUtc(listFilePath);
|
||||
|
||||
@@ -87,16 +87,12 @@ namespace DnsServerCore.Dns.ZoneManagers
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogManager log = _dnsServer.LogManager;
|
||||
if (log != null)
|
||||
log.Write(ex);
|
||||
_dnsServer.LogManager?.Write(ex);
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
LogManager log = _dnsServer.LogManager;
|
||||
if (log != null)
|
||||
log.Write("DNS Server is loading blocked zone file: " + blockedZoneFile);
|
||||
_dnsServer.LogManager?.Write("DNS Server is loading blocked zone file: " + blockedZoneFile);
|
||||
|
||||
using (FileStream fS = new FileStream(blockedZoneFile, FileMode.Open, FileAccess.Read))
|
||||
{
|
||||
@@ -110,9 +106,15 @@ namespace DnsServerCore.Dns.ZoneManagers
|
||||
{
|
||||
case 1:
|
||||
int length = bR.ReadInt32();
|
||||
int i = 0;
|
||||
|
||||
for (int i = 0; i < length; i++)
|
||||
BlockZone(bR.ReadShortString());
|
||||
_zoneManager.LoadSpecialPrimaryZones(delegate ()
|
||||
{
|
||||
if (i++ < length)
|
||||
return bR.ReadShortString();
|
||||
|
||||
return null;
|
||||
}, _soaRecord, _nsRecord);
|
||||
|
||||
break;
|
||||
|
||||
@@ -121,19 +123,21 @@ namespace DnsServerCore.Dns.ZoneManagers
|
||||
}
|
||||
}
|
||||
|
||||
if (log != null)
|
||||
log.Write("DNS Server blocked zone file was loaded: " + blockedZoneFile);
|
||||
_dnsServer.LogManager?.Write("DNS Server blocked zone file was loaded: " + blockedZoneFile);
|
||||
}
|
||||
catch (FileNotFoundException)
|
||||
{ }
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogManager log = _dnsServer.LogManager;
|
||||
if (log != null)
|
||||
log.Write("DNS Server encountered an error while loading blocked zone file: " + blockedZoneFile + "\r\n" + ex.ToString());
|
||||
_dnsServer.LogManager?.Write("DNS Server encountered an error while loading blocked zone file: " + blockedZoneFile + "\r\n" + ex.ToString());
|
||||
}
|
||||
}
|
||||
|
||||
public void ImportZones(string[] domains)
|
||||
{
|
||||
_zoneManager.LoadSpecialPrimaryZones(domains, _soaRecord, _nsRecord);
|
||||
}
|
||||
|
||||
public bool BlockZone(string domain)
|
||||
{
|
||||
if (_zoneManager.CreateSpecialPrimaryZone(domain, _soaRecord, _nsRecord) != null)
|
||||
@@ -189,9 +193,7 @@ namespace DnsServerCore.Dns.ZoneManagers
|
||||
bW.WriteShortString(zone.Name);
|
||||
}
|
||||
|
||||
LogManager log = _dnsServer.LogManager;
|
||||
if (log != null)
|
||||
log.Write("DNS Server blocked zone file was saved: " + blockedZoneFile);
|
||||
_dnsServer.LogManager?.Write("DNS Server blocked zone file was saved: " + blockedZoneFile);
|
||||
}
|
||||
|
||||
public DnsDatagram Query(DnsDatagram request)
|
||||
@@ -199,7 +201,7 @@ namespace DnsServerCore.Dns.ZoneManagers
|
||||
if (_zoneManager.TotalZones < 1)
|
||||
return null;
|
||||
|
||||
return _zoneManager.Query(request);
|
||||
return _zoneManager.Query(request, false);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
@@ -378,12 +378,7 @@ namespace DnsServerCore.Dns.Zones
|
||||
_notifyFailed.Add(nameServerHost);
|
||||
}
|
||||
|
||||
LogManager log = dnsServer.LogManager;
|
||||
if (log is not null)
|
||||
{
|
||||
log.Write("DNS Server failed to notify name server '" + nameServerHost + "' for zone: " + (_name == "" ? "<root>" : _name));
|
||||
log.Write(ex);
|
||||
}
|
||||
dnsServer.LogManager?.Write("DNS Server failed to notify name server '" + nameServerHost + "' for zone: " + (_name == "" ? "<root>" : _name) + "\r\n" + ex.ToString());
|
||||
}
|
||||
finally
|
||||
{
|
||||
|
||||
@@ -507,8 +507,7 @@ namespace DnsServerCore.Dns.Zones
|
||||
strNameServers += ", " + nameServer.ToString();
|
||||
}
|
||||
|
||||
log.Write("DNS Server failed to refresh '" + (_name == "" ? "<root>" : _name) + "' secondary zone from: " + strNameServers);
|
||||
log.Write(ex);
|
||||
log.Write("DNS Server failed to refresh '" + (_name == "" ? "<root>" : _name) + "' secondary zone from: " + strNameServers + "\r\n" + ex.ToString());
|
||||
}
|
||||
|
||||
return false;
|
||||
|
||||
@@ -373,8 +373,7 @@ namespace DnsServerCore.Dns.Zones
|
||||
strNameServers += ", " + nameServer.ToString();
|
||||
}
|
||||
|
||||
log.Write("DNS Server failed to refresh '" + (_name == "" ? "<root>" : _name) + "' stub zone from: " + strNameServers);
|
||||
log.Write(ex);
|
||||
log.Write("DNS Server failed to refresh '" + (_name == "" ? "<root>" : _name) + "' stub zone from: " + strNameServers + "\r\n" + ex.ToString());
|
||||
}
|
||||
|
||||
return false;
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
<RepositoryType></RepositoryType>
|
||||
<Description></Description>
|
||||
<PackageId>DnsServer</PackageId>
|
||||
<Version>11.0.2</Version>
|
||||
<Version>11.0.3</Version>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
||||
@@ -573,7 +573,10 @@ namespace DnsServerCore
|
||||
|
||||
if (response.Answer.Count == 0)
|
||||
{
|
||||
answer = "[]";
|
||||
if (response.Truncation)
|
||||
answer = "[TRUNCATED]";
|
||||
else
|
||||
answer = "[]";
|
||||
}
|
||||
else if ((response.Answer.Count > 2) && response.IsZoneTransfer)
|
||||
{
|
||||
|
||||
@@ -30,6 +30,7 @@ using System.Text.Json;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using TechnitiumLibrary;
|
||||
using TechnitiumLibrary.Net.Http.Client;
|
||||
|
||||
namespace DnsServerCore
|
||||
{
|
||||
@@ -92,7 +93,7 @@ namespace DnsServerCore
|
||||
|
||||
_dnsWebService._log.Write("DNS Server has started automatic update check for DNS Apps.");
|
||||
|
||||
string storeAppsJsonData = await GetStoreAppsJsonData().WithTimeout(5000);
|
||||
string storeAppsJsonData = await GetStoreAppsJsonData(true);
|
||||
using JsonDocument jsonDocument = JsonDocument.Parse(storeAppsJsonData);
|
||||
JsonElement jsonStoreAppsArray = jsonDocument.RootElement;
|
||||
|
||||
@@ -129,7 +130,7 @@ namespace DnsServerCore
|
||||
{
|
||||
try
|
||||
{
|
||||
await DownloadAndUpdateAppAsync(application.Name, url);
|
||||
await DownloadAndUpdateAppAsync(application.Name, url, true);
|
||||
|
||||
_dnsWebService._log.Write("DNS application '" + application.Name + "' was automatically updated successfully from: " + url);
|
||||
}
|
||||
@@ -163,7 +164,7 @@ namespace DnsServerCore
|
||||
}
|
||||
}
|
||||
|
||||
private async Task<string> GetStoreAppsJsonData()
|
||||
private async Task<string> GetStoreAppsJsonData(bool doRetry)
|
||||
{
|
||||
if ((_storeAppsJsonData is null) || (DateTime.UtcNow > _storeAppsJsonDataUpdatedOn.AddSeconds(STORE_APPS_JSON_DATA_CACHE_TIME_SECONDS)))
|
||||
{
|
||||
@@ -172,7 +173,7 @@ namespace DnsServerCore
|
||||
handler.UseProxy = _dnsWebService.DnsServer.Proxy is not null;
|
||||
handler.AutomaticDecompression = DecompressionMethods.All;
|
||||
|
||||
using (HttpClient http = new HttpClient(handler))
|
||||
using (HttpClient http = new HttpClient(doRetry ? new HttpClientRetryHandler(handler) : handler))
|
||||
{
|
||||
_storeAppsJsonData = await http.GetStringAsync(_appStoreUri);
|
||||
_storeAppsJsonDataUpdatedOn = DateTime.UtcNow;
|
||||
@@ -182,7 +183,7 @@ namespace DnsServerCore
|
||||
return _storeAppsJsonData;
|
||||
}
|
||||
|
||||
private async Task<DnsApplication> DownloadAndUpdateAppAsync(string applicationName, string url)
|
||||
private async Task<DnsApplication> DownloadAndUpdateAppAsync(string applicationName, string url, bool doRetry)
|
||||
{
|
||||
string tmpFile = Path.GetTempFileName();
|
||||
try
|
||||
@@ -195,7 +196,7 @@ namespace DnsServerCore
|
||||
handler.UseProxy = _dnsWebService.DnsServer.Proxy is not null;
|
||||
handler.AutomaticDecompression = DecompressionMethods.All;
|
||||
|
||||
using (HttpClient http = new HttpClient(handler))
|
||||
using (HttpClient http = new HttpClient(doRetry ? new HttpClientRetryHandler(handler) : handler))
|
||||
{
|
||||
using (Stream httpStream = await http.GetStreamAsync(url))
|
||||
{
|
||||
@@ -334,7 +335,7 @@ namespace DnsServerCore
|
||||
{
|
||||
try
|
||||
{
|
||||
string storeAppsJsonData = await GetStoreAppsJsonData().WithTimeout(5000);
|
||||
string storeAppsJsonData = await GetStoreAppsJsonData(false).WithTimeout(5000);
|
||||
jsonDocument = JsonDocument.Parse(storeAppsJsonData);
|
||||
jsonStoreAppsArray = jsonDocument.RootElement;
|
||||
}
|
||||
@@ -369,7 +370,7 @@ namespace DnsServerCore
|
||||
if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Apps, session.User, PermissionFlag.View))
|
||||
throw new DnsWebServiceException("Access was denied.");
|
||||
|
||||
string storeAppsJsonData = await GetStoreAppsJsonData();
|
||||
string storeAppsJsonData = await GetStoreAppsJsonData(false).WithTimeout(30000);
|
||||
using JsonDocument jsonDocument = JsonDocument.Parse(storeAppsJsonData);
|
||||
JsonElement jsonStoreAppsArray = jsonDocument.RootElement;
|
||||
|
||||
@@ -508,7 +509,7 @@ namespace DnsServerCore
|
||||
if (!url.StartsWith("https://", StringComparison.OrdinalIgnoreCase))
|
||||
throw new DnsWebServiceException("Parameter 'url' value must start with 'https://'.");
|
||||
|
||||
DnsApplication application = await DownloadAndUpdateAppAsync(name, url);
|
||||
DnsApplication application = await DownloadAndUpdateAppAsync(name, url, false);
|
||||
|
||||
_dnsWebService._log.Write(context.GetRemoteEndPoint(), "[" + session.User.Username + "] DNS application '" + name + "' was updated successfully from: " + url);
|
||||
|
||||
|
||||
@@ -237,19 +237,11 @@ namespace DnsServerCore
|
||||
|
||||
string allowedZones = request.GetQueryOrForm("allowedZones");
|
||||
string[] allowedZonesList = allowedZones.Split(',');
|
||||
bool added = false;
|
||||
|
||||
foreach (string allowedZone in allowedZonesList)
|
||||
{
|
||||
if (_dnsWebService.DnsServer.AllowedZoneManager.AllowZone(allowedZone))
|
||||
added = true;
|
||||
}
|
||||
_dnsWebService.DnsServer.AllowedZoneManager.ImportZones(allowedZonesList);
|
||||
|
||||
if (added)
|
||||
{
|
||||
_dnsWebService._log.Write(context.GetRemoteEndPoint(), "[" + session.User.Username + "] Total " + allowedZonesList.Length + " zones were imported into allowed zone successfully.");
|
||||
_dnsWebService.DnsServer.AllowedZoneManager.SaveZoneFile();
|
||||
}
|
||||
_dnsWebService._log.Write(context.GetRemoteEndPoint(), "[" + session.User.Username + "] Total " + allowedZonesList.Length + " zones were imported into allowed zone successfully.");
|
||||
_dnsWebService.DnsServer.AllowedZoneManager.SaveZoneFile();
|
||||
}
|
||||
|
||||
public async Task ExportAllowedZonesAsync(HttpContext context)
|
||||
@@ -409,19 +401,11 @@ namespace DnsServerCore
|
||||
|
||||
string blockedZones = request.GetQueryOrForm("blockedZones");
|
||||
string[] blockedZonesList = blockedZones.Split(',');
|
||||
bool added = false;
|
||||
|
||||
foreach (string blockedZone in blockedZonesList)
|
||||
{
|
||||
if (_dnsWebService.DnsServer.BlockedZoneManager.BlockZone(blockedZone))
|
||||
added = true;
|
||||
}
|
||||
_dnsWebService.DnsServer.BlockedZoneManager.ImportZones(blockedZonesList);
|
||||
|
||||
if (added)
|
||||
{
|
||||
_dnsWebService._log.Write(context.GetRemoteEndPoint(), "[" + session.User.Username + "] Total " + blockedZonesList.Length + " zones were imported into blocked zone successfully.");
|
||||
_dnsWebService.DnsServer.BlockedZoneManager.SaveZoneFile();
|
||||
}
|
||||
_dnsWebService._log.Write(context.GetRemoteEndPoint(), "[" + session.User.Username + "] Total " + blockedZonesList.Length + " zones were imported into blocked zone successfully.");
|
||||
_dnsWebService.DnsServer.BlockedZoneManager.SaveZoneFile();
|
||||
}
|
||||
|
||||
public async Task ExportBlockedZonesAsync(HttpContext context)
|
||||
|
||||
@@ -169,8 +169,7 @@ namespace DnsServerCore
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_dnsWebService._log.Write("Failed to restart DNS service.");
|
||||
_dnsWebService._log.Write(ex);
|
||||
_dnsWebService._log.Write("Failed to restart DNS service.\r\n" + ex.ToString());
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -192,8 +191,7 @@ namespace DnsServerCore
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_dnsWebService._log.Write("Failed to restart web service.");
|
||||
_dnsWebService._log.Write(ex);
|
||||
_dnsWebService._log.Write("Failed to restart web service.\r\n" + ex.ToString());
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -1188,10 +1186,10 @@ namespace DnsServerCore
|
||||
//blocklist timers
|
||||
if ((_blockListUpdateIntervalHours > 0) && ((_dnsWebService.DnsServer.BlockListZoneManager.AllowListUrls.Count + _dnsWebService.DnsServer.BlockListZoneManager.BlockListUrls.Count) > 0))
|
||||
{
|
||||
if (blockListUrlsUpdated || (_blockListUpdateTimer is null))
|
||||
if (_blockListUpdateTimer is null)
|
||||
StartBlockListUpdateTimer();
|
||||
else if (blockListUrlsUpdated)
|
||||
ForceUpdateBlockLists();
|
||||
|
||||
StartBlockListUpdateTimer();
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -393,12 +393,12 @@
|
||||
<table id="tableZones" class="table table-hover">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>#</th>
|
||||
<th><a href="#" onclick="sortTable('tableZonesBody', 0); return false;">Zone</a></th>
|
||||
<th><a href="#" onclick="sortTable('tableZonesBody', 1); return false;">Type</a></th>
|
||||
<th><a href="#" onclick="sortTable('tableZonesBody', 2); return false;">DNSSEC</a></th>
|
||||
<th><a href="#" onclick="sortTable('tableZonesBody', 3); return false;">Status</a></th>
|
||||
<th><a href="#" onclick="sortTable('tableZonesBody', 4); return false;">Expiry</a></th>
|
||||
<th><a href="#" onclick="sortTable('tableZonesBody', 0); return false;">#</a></th>
|
||||
<th><a href="#" onclick="sortTable('tableZonesBody', 1); return false;">Zone</a></th>
|
||||
<th><a href="#" onclick="sortTable('tableZonesBody', 2); return false;">Type</a></th>
|
||||
<th><a href="#" onclick="sortTable('tableZonesBody', 3); return false;">DNSSEC</a></th>
|
||||
<th><a href="#" onclick="sortTable('tableZonesBody', 4); return false;">Status</a></th>
|
||||
<th><a href="#" onclick="sortTable('tableZonesBody', 5); return false;">Expiry</a></th>
|
||||
<th style="width: 36px;"></th>
|
||||
</tr>
|
||||
</thead>
|
||||
@@ -505,11 +505,11 @@
|
||||
<table id="tableEditZone" class="table table-hover">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>#</th>
|
||||
<th><a href="#" onclick="sortTable('tableEditZoneBody', 0); return false;">Name</a></th>
|
||||
<th><a href="#" onclick="sortTable('tableEditZoneBody', 1); return false;">Type</a></th>
|
||||
<th><a href="#" onclick="sortTable('tableEditZoneBody', 2); return false;">TTL</a></th>
|
||||
<th><a href="#" onclick="sortTable('tableEditZoneBody', 3); return false;">Data</a></th>
|
||||
<th><a href="#" onclick="sortTable('tableEditZoneBody', 0); return false;">#</a></th>
|
||||
<th><a href="#" onclick="sortTable('tableEditZoneBody', 1); return false;">Name</a></th>
|
||||
<th><a href="#" onclick="sortTable('tableEditZoneBody', 2); return false;">Type</a></th>
|
||||
<th><a href="#" onclick="sortTable('tableEditZoneBody', 3); return false;">TTL</a></th>
|
||||
<th><a href="#" onclick="sortTable('tableEditZoneBody', 4); return false;">Data</a></th>
|
||||
<th></th>
|
||||
</tr>
|
||||
</thead>
|
||||
@@ -1274,7 +1274,7 @@
|
||||
<pre>openssl pkcs12 -export -out "example.com.pfx" -inkey "privkey.pem" -in "cert.pem" -certfile "chain.pem"</pre>
|
||||
</div>
|
||||
|
||||
<div style="margin-top: 10px;"><a href="https://blog.technitium.com/2020/07/how-to-host-your-own-dns-over-https-and.html" target="_blank">Help: How To Host Your Own DNS-over-HTTPS And DNS-over-TLS Services</a></div>
|
||||
<div style="margin-top: 10px;"><a href="https://blog.technitium.com/2020/07/how-to-host-your-own-dns-over-https-and.html" target="_blank">Help: How To Host Your Own DNS-over-HTTPS, DNS-over-TLS, And DNS-over-QUIC Services</a></div>
|
||||
<div style="margin-top: 10px;"><a href="https://blog.technitium.com/2023/02/configuring-dns-over-quic-and-https3.html" target="_blank">Help: Configuring DNS-over-QUIC and HTTPS/3 For Technitium DNS Server</a></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
<RootNamespace>DnsServerWindowsService</RootNamespace>
|
||||
<AssemblyName>DnsService</AssemblyName>
|
||||
<ApplicationIcon>logo2.ico</ApplicationIcon>
|
||||
<Version>11.0.2</Version>
|
||||
<Version>11.0.3</Version>
|
||||
<Authors>Shreyas Zare</Authors>
|
||||
<Company>Technitium</Company>
|
||||
<Product>Technitium DNS Server</Product>
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
|
||||
|
||||
#define MyAppName "Technitium DNS Server"
|
||||
#define MyAppVersion "11.0.2"
|
||||
#define MyAppVersion "11.0.3"
|
||||
#define MyAppPublisher "Technitium"
|
||||
#define MyAppURL "https://technitium.com/dns/"
|
||||
#define MyAppExeName "DnsServerSystemTrayApp.exe"
|
||||
|
||||
2
build.md
2
build.md
@@ -36,7 +36,7 @@ $ sudo apt-add-repository https://packages.microsoft.com/debian/11/prod
|
||||
$ sudo apt update
|
||||
```
|
||||
|
||||
3. Install ASP.NET Core 7 runtime and `libmsquic` for DNS-over-QUIC support.
|
||||
3. Install ASP.NET Core 7 SDK and `libmsquic` for DNS-over-QUIC support.
|
||||
```
|
||||
$ sudo apt install dotnet-sdk-7.0 libmsquic -y
|
||||
```
|
||||
|
||||
Reference in New Issue
Block a user