Ejemplo n.º 1
0
        } // End Function ResolveMessage

        static async Task ForwardMessage(DnsMessage query, QueryReceivedEventArgs e, DnsMessage response)
        {
            if ((query.Questions.Count == 1))
            {
                // send query to upstream server
                DnsQuestion question = query.Questions[0];

                DnsMessage upstreamResponse = await s_dnsClient.ResolveAsync(question.Name
                                                                             , question.RecordType, question.RecordClass
                                                                             );

                e.Response = upstreamResponse;
                return;


                // if got an answer, copy it to the message sent to the client
                if (upstreamResponse != null)
                {
                    foreach (DnsRecordBase record in (upstreamResponse.AnswerRecords))
                    {
                        response.AnswerRecords.Add(record);
                    } // Next record

                    foreach (DnsRecordBase record in (upstreamResponse.AdditionalRecords))
                    {
                        response.AdditionalRecords.Add(record);
                    } // Next record

                    response.ReturnCode = ReturnCode.NoError;

                    // set the response
                    e.Response = response;
                } // End if (upstreamResponse != null)
            }     // End if ((message.Questions.Count == 1))
        }         // End Function OnQueryReceived
Ejemplo n.º 2
0
        private static Task DnsServer_QueryReceived(object sender, QueryReceivedEventArgs eventArgs)
        {
            eventArgs.Query.IsQuery = false;
            DnsMessage query = eventArgs.Query as DnsMessage;

            if (query == null || query.Questions.Count <= 0)
            {
                query.ReturnCode = ReturnCode.ServerFailure;
            }
            else
            {
                if (query.Questions[0].RecordType == RecordType.A)
                {
                    foreach (DnsQuestion dnsQuestion in query.Questions)
                    {
                        //string resolvedIp = Resolve(clientAddress.ToString(), dnsQuestion.Name);
                        ARecord aRecord = new ARecord(dnsQuestion.Name, 36000, ipAddress);
                        query.AnswerRecords.Add(aRecord);
                    }
                }
                else
                {
                    return(null);
                }
            }
            eventArgs.Response = eventArgs.Query;
            return(Task.CompletedTask);
        }
Ejemplo n.º 3
0
 /// <summary>
 /// 消息队列处理
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="eventArgs"></param>
 /// <returns></returns>
 private Task DnsServer_QueryReceived(object sender, QueryReceivedEventArgs eventArgs)
 {
     return(Task.Run(() =>
     {
         var message = eventArgs.Query;
         var clientAddress = eventArgs.RemoteEndpoint;
         message.IsQuery = false;
         DnsMessage query = message as DnsMessage;
         if (query == null || query.Questions.Count <= 0)
         {
             message.ReturnCode = ReturnCode.ServerFailure;
         }
         else
         {
             if (query.Questions[0].RecordType == RecordType.A)
             {
                 foreach (DnsQuestion dnsQuestion in query.Questions)
                 {
                     string resolvedIp = Resolve(clientAddress.ToString(), dnsQuestion.Name.ToString());
                     ARecord aRecord = new ARecord(query.Questions[0].Name, 36000, IPAddress.Parse(resolvedIp));
                     query.AnswerRecords.Add(aRecord);
                 }
             }
         }
         eventArgs.Response = message;
     }));
 }
        private async Task OnQueryReceived(object sender, QueryReceivedEventArgs e)
        {
            DnsMessage message = e.Query as DnsMessage;
            DnsMessage query   = e.Query as DnsMessage;

            if (query == null)
            {
                return;
            }

            if (message.Questions.Count != 1)
            {
                return;
            }

            var question = query.Questions[0];

            _logger.LogInformation("dns-req: {0} {1}", question.RecordType, question.Name);

            DnsMessage response = query.CreateResponseInstance();

            var domainsToAnswerDirect = new[] { _cfg.VtunerServerOne, _cfg.VtunerServerTwo }
            .Select(x => ARSoft.Tools.Net.DomainName.Parse(x))
            .ToList();

            if (question.RecordType == RecordType.A
                //&& question.Name.IsSubDomainOf(ARSoft.Tools.Net.DomainName.Parse("vtuner.com"))
                && domainsToAnswerDirect.Any(x => x == question.Name))
            {
                var myIp = _networkInterfaceHelper.GetMyIPv4Address();
                response.AnswerRecords.Add(new ARecord(question.Name, 10, myIp));

                response.ReturnCode = ReturnCode.NoError;

                // set the response
                e.Response = response;
                return;
            }

            // send query to upstream server
            DnsMessage upstreamResponse = await DnsClient.Default.ResolveAsync(question.Name, question.RecordType, question.RecordClass);

            // if got an answer, copy it to the message sent to the client
            if (upstreamResponse != null)
            {
                foreach (DnsRecordBase record in (upstreamResponse.AnswerRecords))
                {
                    response.AnswerRecords.Add(record);
                }
                foreach (DnsRecordBase record in (upstreamResponse.AdditionalRecords))
                {
                    response.AdditionalRecords.Add(record);
                }

                response.ReturnCode = ReturnCode.NoError;

                // set the response
                e.Response = response;
            }
        }
Ejemplo n.º 5
0
        private async Task OnQueryReceived(object sender, QueryReceivedEventArgs e)
        {
            try
            {
                if (e.Query is DnsMessage message &&
                    message.Questions.Count == 1)
                {
                    var upstreamResponse =
                        await DoQuery(message, e.RemoteEndpoint.Address.ToString()).ConfigureAwait(false);

                    if (upstreamResponse != null)
                    {
                        upstreamResponse.ReturnCode = ReturnCode.NoError;
                        e.Response = upstreamResponse;
                    }
                }

                await Task.CompletedTask.ConfigureAwait(false);
            }
            catch (ArgumentNullException ane)
            {
                HandleArgumentNullException(ane);
                await Task.FromException(ane).ConfigureAwait(false);
            }
            catch (ArgumentOutOfRangeException aoore)
            {
                HandleArgumentOutOfRangeException(aoore);
                await Task.FromException(aoore).ConfigureAwait(false);
            }
            catch (Exception exception)
            {
                HandleException(exception);
                await Task.FromException(exception).ConfigureAwait(false);
            }
        }
Ejemplo n.º 6
0
        } // End Function OnClientConnected

        private static async Task OnQueryReceived(object sender, QueryReceivedEventArgs e)
        {
            DnsMessage query = e.Query as DnsMessage;

            if (query == null)
            {
                return;
            }


            // e.RemoteEndpoint.Address

            DnsMessage response = query.CreateResponseInstance();

            // check for valid query
            if ((query.Questions.Count == 1) &&
                (query.Questions[0].RecordType == RecordType.Txt) &&
                (query.Questions[0].Name.Equals(ARSoft.Tools.Net.DomainName.Parse("example.com"))))
            {
                response.ReturnCode = ReturnCode.NoError;
                response.AnswerRecords.Add(new TxtRecord(ARSoft.Tools.Net.DomainName.Parse("example.com"), 3600, "Hello world"));
            }
            else
            {
                response.ReturnCode = ReturnCode.ServerFailure;
            }

            // set the response
            e.Response = response;
        } // End Function OnQueryReceived
Ejemplo n.º 7
0
        private async Task OnQueryReceived(object sender, QueryReceivedEventArgs e)
        {
            var query = e.Query as DnsMessage;

            if (query == null)
            {
                return;
            }

            var response = query.CreateResponseInstance();

            foreach (var question in query.Questions)
            {
                var dnsMessage = await _dnsManager.ResolveAsync(question);

                if ((dnsMessage == null) || ((dnsMessage.ReturnCode != ReturnCode.NoError) && (dnsMessage.ReturnCode != ReturnCode.NxDomain)))
                {
                    response.ReturnCode = ReturnCode.ServerFailure;
                    return;
                }

                foreach (var dnsRecord in dnsMessage.AnswerRecords)
                {
                    response.AnswerRecords.Add(dnsRecord);
                }

                response.AuthorityRecords.AddRange(dnsMessage.AuthorityRecords);
            }
            //var domain = query.Questions[0].Name.ToString();
            //var dnsMessage = DnsClient.Default.Resolve(DomainName.Parse(domain), RecordType.A);

            //response.ReturnCode = ReturnCode.ServerFailure;

            e.Response = response;
        }
Ejemplo n.º 8
0
        private async Task ServerOnQueryReceived(object sender, QueryReceivedEventArgs eventargs)
        {
            if (!(eventargs.Query is DnsMessage dnsMessage))
            {
                return;
            }

            var isBlacklisted = IsBlacklisted(dnsMessage);
            var response      = await _client.SendMessageAsync(dnsMessage);

            if (!isBlacklisted)
            {
                eventargs.Response = response;
            }
            else
            {
                var newMessage = ReplaceARecords(response, dnsMessage);

                eventargs.Response = newMessage;
            }

            if (_isService)
            {
                return;
            }

#pragma warning disable 4014
            LogQuery(dnsMessage, (DnsMessage)eventargs.Response, isBlacklisted);
#pragma warning restore 4014
        }
Ejemplo n.º 9
0
        } // End Function OnClientConnected

        // nslookup somewhere.com some.dns.server
        // nslookup somewhere.com 127.0.0.1
        static async Task OnQueryReceived(object sender, QueryReceivedEventArgs e)
        {
            // if (!IPAddress.IsLoopback(e.RemoteEndpoint.Address))
            DnsMessage query = e.Query as DnsMessage;

            if (query == null)
            {
                return;
            }

            DnsMessage response = query.CreateResponseInstance();

            if ((query.Questions.Count < 1))
            {
                response.ReturnCode = ReturnCode.NoError;
                return;
            } // End if ((query.Questions.Count < 1))

            if (!await ResolveMessage(query, e, response))
            {
                await ForwardMessage(query, e, response);
            }

            // set the response
            // e.Response = response;
        } // End Function OnQueryReceived
Ejemplo n.º 10
0
        private static async Task OnQueryReceived(object sender, QueryReceivedEventArgs e)
        {
            var message = e.Query as DnsMessage;

            var response = message?.CreateResponseInstance();

            if (message?.Questions.Count == 1)
            {
                // send query to upstream _servers
                var question = message.Questions[0];

                var upstreamResponse =
                    await DnsClient.Default.ResolveAsync(question.Name, question.RecordType, question.RecordClass);

                // if got an answer, copy it to the message sent to the client
                if (upstreamResponse != null)
                {
                    foreach (var record in (upstreamResponse.AnswerRecords))
                    {
                        response.AnswerRecords.Add(record);
                    }
                    foreach (var record in (upstreamResponse.AdditionalRecords))
                    {
                        response.AdditionalRecords.Add(record);
                    }

                    response.ReturnCode = ReturnCode.NoError;

                    // set the response
                    e.Response = response;
                }
            }
        }
Ejemplo n.º 11
0
        private Task OnQueryReceived(object sender, QueryReceivedEventArgs e)
        {
            var query = (DnsMessage)e.Query;

            query.IsQuery = false;

            var question       = query.Questions.First();
            var clientEndPoint = e.RemoteEndpoint;
            var accessAllowed  = IsAccessAllowed(clientEndPoint, question);

            if (!accessAllowed)
            {
                return(Task.FromResult(1));
            }

            var answer = ResolveDnsQuery(question);

            if (IsRedicted(question))
            {
                // Resolved with redirection

                SetupReponse(query, question);

                if (_portForwardingManager != null)
                {
                    SetupForwarding(answer);
                }

                e.Response = query;
                return(Task.FromResult(0));
            }

            if (query.Questions.Count == 1 && answer != null)
            {
                foreach (var record in answer.AnswerRecords)
                {
                    query.AnswerRecords.Add(record);
                }
                foreach (var record in answer.AdditionalRecords)
                {
                    query.AnswerRecords.Add(record);
                }

                // Resolved without redirection

                query.ReturnCode = ReturnCode.NoError;

                e.Response = query;
                return(Task.FromResult(0));
            }

            // Failed to resolve ...
            query.ReturnCode = ReturnCode.ServerFailure;
            e.Response       = query;

            return(Task.FromResult(0));
        }
Ejemplo n.º 12
0
        private async Task OnDnsQueryReceived(QueryReceivedEventArgs e, IEnumerable <DomainName> domains)
        {
            DnsMessage message = e.Query as DnsMessage;

            if (message == null || message.Questions.Count != 1)
            {
                return;
            }

            DnsQuestion question = message.Questions[0];
            DnsMessage  response = message.CreateResponseInstance();

            //If domain match return localhost
            if ((Program.Options.Ncsi && question.Name.Equals(_ncsiDomain)) || domains.Any(x => x.Equals(question.Name)))
            {
                if (question.RecordType == RecordType.A)
                {
                    response.ReturnCode = ReturnCode.NoError;
                    response.AnswerRecords.Add(new ARecord(question.Name, 10, IPAddress.Loopback));
                }
                else if (question.RecordType == RecordType.Aaaa)
                {
                    response.ReturnCode = ReturnCode.NoError;
                    response.AnswerRecords.Add(new AaaaRecord(question.Name, 10, IPAddress.IPv6Loopback));
                }
            }
            else if (_upStreamDnsClient != null)
            {
                // send query to upstream server
                DnsMessage upstreamResponse = await _upStreamDnsClient.ResolveAsync(question.Name, question.RecordType, question.RecordClass);

                if (upstreamResponse == null)
                {
                    return;
                }

                // if got an answer, copy it to the message sent to the client
                response.AnswerRecords.AddRange(upstreamResponse.AnswerRecords);
                response.AdditionalRecords.AddRange(upstreamResponse.AdditionalRecords);
                response.ReturnCode = upstreamResponse.ReturnCode;
            }


            // set the response
            e.Response = response;

            if (response.AnswerRecords.Count != 0)
            {
                Logging.WriteVerbose("DNS Response: {0}", response.AnswerRecords.FirstOrDefault());
            }
            else
            {
                Logging.WriteVerbose("DNS Response: Can not find {0} records for {1}", question.RecordType.ToString().ToUpperInvariant(), question.Name);
            }
        }
Ejemplo n.º 13
0
        static async Task OnQueryReceived(object sender, QueryReceivedEventArgs e)
        {
            DnsMessage query = e.Query as DnsMessage;

            if (query == null)
            {
                return;
            }

            DnsMessage response = query.CreateResponseInstance();

            foreach (var question in query.Questions)
            {
                //Console.WriteLine(question.Name.ToString());

                DnsMessage upstreamResponse;
                Boolean    useDefault = true;

                foreach (var domain in domains)
                {
                    if (question.Name.ToString().ToLower().Contains(domain))
                    {
                        useDefault = false;
                    }
                }

                if (useDefault)
                {
                    upstreamResponse = await defaultClient.ResolveAsync(question.Name, question.RecordType, question.RecordClass);
                }
                else
                {
                    upstreamResponse = await netflixClient.ResolveAsync(question.Name, question.RecordType, question.RecordClass);
                }

                if (upstreamResponse != null)
                {
                    foreach (DnsRecordBase record in (upstreamResponse.AnswerRecords))
                    {
                        response.AnswerRecords.Add(record);
                    }
                    foreach (DnsRecordBase record in (upstreamResponse.AdditionalRecords))
                    {
                        response.AdditionalRecords.Add(record);
                    }

                    response.ReturnCode = ReturnCode.NoError;

                    e.Response = response;
                }
            }
        }
Ejemplo n.º 14
0
        private async Task DnsServer_QueryReceived(object sender, QueryReceivedEventArgs eventArgs)
        {
            DnsMessage message = eventArgs.Query as DnsMessage;

            if (message == null)
            {
                return;
            }

            DnsMessage response = message.CreateResponseInstance();

            if ((message.Questions.Count == 1))
            {
                DnsQuestion question = message.Questions[0];

                var fullAddress = string.Join(".", question.Name.Labels);

                if (this.blockedList.Contains(fullAddress))
                {
                    ARecord fakeRecord = new ARecord(question.Name, 10, this.loopbackIpAddress);
                    response.ReturnCode = ReturnCode.NoError;

                    Debug.WriteLine("Blocked: " + fullAddress);

                    eventArgs.Response = response;
                    return;
                }

                // send query to upstream server
                DnsMessage upstreamResponse = await this.dnsClient.ResolveAsync(question.Name, question.RecordType, question.RecordClass);

                var answer = upstreamResponse.AnswerRecords.FirstOrDefault();
                // if got an answer, copy it to the message sent to the client
                if (answer != null)
                {
                    foreach (DnsRecordBase record in (upstreamResponse.AnswerRecords))
                    {
                        response.AnswerRecords.Add(record);
                    }
                    foreach (DnsRecordBase record in (upstreamResponse.AdditionalRecords))
                    {
                        response.AdditionalRecords.Add(record);
                    }

                    response.ReturnCode = ReturnCode.NoError;

                    // set the response
                    eventArgs.Response = response;
                }
            }
        }
Ejemplo n.º 15
0
        async Task OnQueryReceived(object sender, QueryReceivedEventArgs eventArgs)
        {
            DnsMessage query    = eventArgs.Query as DnsMessage;
            DnsMessage response = null;

            if (query == null)
            {
                return;
            }

            response = await umleitung_process_request(query);

            eventArgs.Response = response;
        }
Ejemplo n.º 16
0
 private async Task OnDnsOnQueryReceived(object sender, QueryReceivedEventArgs e)
 {
     try
     {
         if (!(e.Query is DnsMessage query))
         {
             return;
         }
         e.Response = await new DnsClient(TargetIp, 1000).SendMessageAsync(query);
     }
     catch (Exception exception)
     {
         Console.WriteLine(exception);
     }
 }
Ejemplo n.º 17
0
#pragma warning disable CS1998 // 异步方法缺少 "await" 运算符,将以同步方式运行
        static async Task  OnQueryReceived(object sender, QueryReceivedEventArgs e)
#pragma warning restore CS1998 // 异步方法缺少 "await" 运算符,将以同步方式运行
        {
            DnsMessage query = e.Query as DnsMessage;

            if (query == null)
            {
                return;
            }
            DnsMessage response = query.CreateResponseInstance();

            if (query.Questions.Count == 1)
            {
                if (query.Questions[0].RecordType == RecordType.A)
                {
                    string      url = query.Questions[0].Name.ToString();
                    ObjectCache oc  = MemoryCache.Default;
                    string      ips = oc[url] as string;
                    if (ips == null)
                    {
                        CacheItemPolicy cip = new CacheItemPolicy();
                        cip.AbsoluteExpiration = DateTime.Now.AddMinutes(10);
                        HttpClient client         = new HttpClient();
                        var        responseString = client.GetStringAsync("http://119.29.29.29/d?dn=" + url);
                        ips = responseString.Result;
                        oc.Set(url, ips, cip);
                    }
                    if (ips != "")
                    {
                        response.ReturnCode = ReturnCode.NoError;
                        var Allip = ips.Split(';');
                        for (int i = 0; i < Allip.Count(); i++)
                        {
                            response.AnswerRecords.Add(new ARecord(DomainName.Parse(url), 600, IPAddress.Parse(Allip[i])));
                        }
                    }
                    else
                    {
                        response.ReturnCode = ReturnCode.ServerFailure;
                    }
                }
                else
                {
                    response.ReturnCode = ReturnCode.ServerFailure;
                }
            }
            e.Response = response;
        }
Ejemplo n.º 18
0
        static async Task OnQueryReceived(object sender, QueryReceivedEventArgs e)
        {
            DnsMessage query = e.Query as DnsMessage;

            LogToThreadLockedConsole(string.Format("--> DNS query recieved from {0} for {1} (Type: {2})",
                                                   e.RemoteEndpoint,
                                                   query.Questions[0].Name,
                                                   query.Questions[0].RecordType),
                                     ConsoleColor.Green, true);

            if (query == null)
            {
                return;
            }

            DnsMessage  response = query.CreateResponseInstance();
            DnsQuestion question = response.Questions[0];

            if (IsAllowed(question.Name.ToString()))
            {
                DnsClient  client           = new DnsClient(IPAddress.Parse("208.67.222.222"), 5000); // This is the IP for OpenDNS
                DnsMessage upstreamResponse = await client.ResolveAsync(question.Name, question.RecordType, question.RecordClass);

                List <string> recordsRecieved = new List <string>();

                foreach (DnsRecordBase record in upstreamResponse.AnswerRecords)
                {
                    response.AnswerRecords.Add(record);

                    if (!recordsRecieved.Contains(record.Name.ToString() + "|" + record.RecordType.ToString() + "|" + record.RecordType.ToString()))
                    {
                        if (record.RecordType.ToString().ToUpper() != "OPT")
                        {
                            LogToThreadLockedConsole(string.Format("<-- Response from upstream: {0} (Type: {1})", record.Name, record.RecordType), ConsoleColor.Gray, true);
                            recordsRecieved.Add(record.Name.ToString() + "|" + record.RecordType.ToString() + "|" + record.RecordType.ToString());
                        }
                    }
                }
            }

            response.ReturnCode = ReturnCode.NoError;
            e.Response          = response;
        }
Ejemplo n.º 19
0
        private static async Task OnQueryReceived(object sender, QueryReceivedEventArgs e)
        {
            var message = e.Query as DnsMessage;

            var response = message?.CreateResponseInstance();

            if (message?.Questions.Count == 1)
            {
                // send query to upstream _servers
                var question = message.Questions[0];

                DnsClient client = DnsClient.Default;
                if (FORCE_IPV4)
                {
                    Random rand           = new Random();
                    var    ipv4DnsServers = DnsClient.GetLocalConfiguredDnsServers().Where(a => a.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork);
                    var    list           = ipv4DnsServers.OrderBy(a => rand.Next()).ToList();
                    client = new DnsClient(list, DnsClient.Default.QueryTimeout);
                }

                var upstreamResponse =
                    await client.ResolveAsync(question.Name, question.RecordType, question.RecordClass);

                // if got an answer, copy it to the message sent to the client
                if (upstreamResponse != null)
                {
                    foreach (var record in (upstreamResponse.AnswerRecords))
                    {
                        response.AnswerRecords.Add(record);
                    }
                    foreach (var record in (upstreamResponse.AdditionalRecords))
                    {
                        response.AdditionalRecords.Add(record);
                    }

                    response.ReturnCode = ReturnCode.NoError;

                    // set the response
                    e.Response = response;
                }
            }
        }
Ejemplo n.º 20
0
        static async Task handleQuery(object sender, QueryReceivedEventArgs e)
        {
            DnsMessage query    = e.Query as DnsMessage;
            DnsMessage response = query.CreateResponseInstance();

            if (query == null || query.Questions.Count == 0)
            {
                e.Response = response;
                return;
            }

            DnsQuestion[] records = new DnsQuestion[query.Questions.Count];
            query.Questions.CopyTo(records);
            foreach (DnsQuestion record in records)
            {
                String[] Labels = record.Name.Labels;
                if (!Labels[Labels.Length - 1].ToLower().Equals("service"))
                {
                    continue;                                                         // 서비스로 안끝나면 관심없음
                }
                String q = String.Concat(record.Name.Labels);
                response.AnswerRecords.Add(new ARecord(record.Name, 10, ConfigMgr.localIp));
                query.Questions.Remove(record);
            }

            if (query.Questions.Count != 0)
            {
                DnsClient  client = new DnsClient(ConfigMgr.nameservers, 1000);
                DnsMessage q      = await client.SendMessageAsync(query);

                if (q != null)
                {
                    response.AnswerRecords.AddRange(q.AnswerRecords);
                }
            }

            response.ReturnCode         = ReturnCode.NoError;
            response.IsRecursionDesired = false;
            e.Response = response;
        }
Ejemplo n.º 21
0
        } // End Sub Test 


        static async Task OnQueryReceived(object sender, QueryReceivedEventArgs e)
        {
            DnsMessage message = e.Query as DnsMessage;

            if (message == null)
                return;

            DnsMessage response = message.CreateResponseInstance();


            if ((message.Questions.Count == 1))
            {
                // send query to upstream server
                DnsQuestion question = message.Questions[0];
                DnsMessage upstreamResponse = await DnsClient.Default.ResolveAsync(question.Name, question.RecordType, question.RecordClass);

                // if got an answer, copy it to the message sent to the client
                if (upstreamResponse != null)
                {
                    foreach (DnsRecordBase record in (upstreamResponse.AnswerRecords))
                    {
                        response.AnswerRecords.Add(record);
                    } // Next record 

                    foreach (DnsRecordBase record in (upstreamResponse.AdditionalRecords))
                    {
                        response.AdditionalRecords.Add(record);
                    } // Next record 

                    response.ReturnCode = ReturnCode.NoError;

                    // set the response
                    e.Response = response;
                } // End if (upstreamResponse != null) 

            } // End if ((message.Questions.Count == 1)) 

        } // End Function OnQueryReceived 
Ejemplo n.º 22
0
    static async Task OnQueryReceived(object sender, QueryReceivedEventArgs e)
    {
        DnsMessage query = e.Query as DnsMessage;

        if (query == null)
        {
            return;
        }
        DnsMessage  response         = query.CreateResponseInstance();
        DnsQuestion question         = response.Questions[0];
        DnsMessage  upstreamResponse = await DnsClient.Default.ResolveAsync(!question.Name.ToString().Contains("www.google.com")?question.Name : DomainName.Parse("www.yahoo.com"), question.RecordType, question.RecordClass);

        foreach (DnsRecordBase record in upstreamResponse.AnswerRecords)
        {
            response.AnswerRecords.Add(record);
        }
        foreach (DnsRecordBase record in (upstreamResponse.AdditionalRecords))
        {
            response.AdditionalRecords.Add(record);
        }
        response.ReturnCode = ReturnCode.NoError;
        e.Response          = response;
    }
Ejemplo n.º 23
0
        private Task _server_QueryReceived(object sender, QueryReceivedEventArgs e)
        {
            DnsMessage query = e.Query as DnsMessage;

            if (query == null)
            {
                return(Task.FromResult(0));
            }

            DnsMessage response = query.CreateResponseInstance();

            if ((query.Questions.Count == 1))
            {
                // send query to upstream server
                DnsQuestion question = query.Questions[0];
                DnsMessage  answer   = DnsClient.Default.ResolveAsync(question.Name, question.RecordType, question.RecordClass).Result;

                // if got an answer, copy it to the message sent to the client
                if (answer != null)
                {
                    foreach (DnsRecordBase record in (answer.AnswerRecords))
                    {
                        response.AnswerRecords.Add(record);
                    }
                    foreach (DnsRecordBase record in (answer.AdditionalRecords))
                    {
                        response.AdditionalRecords.Add(record);
                    }

                    response.ReturnCode = ReturnCode.NoError;

                    // set the response
                    e.Response = response;
                }
            }
            return(Task.FromResult(0));
        }
Ejemplo n.º 24
0
        private static async Task Server_QueryReceived(object sender, QueryReceivedEventArgs eventArgs)
        {
            DnsMessage query = eventArgs.Query as DnsMessage;

            if (query != null)
            {
                DnsMessage response = query.CreateResponseInstance();
                if ((query.Questions.Count == 1))
                {
                    DnsQuestion question = query.Questions[0];
                    System.Diagnostics.Trace.WriteLine(question.Name.ToString());
                    //DnsMessage upstreamResponse = await DnsClient.Default.ResolveAsync(question.Name, question.RecordType, question.RecordClass);
                    DnsClient  dc = new DnsClient(IPAddress.Parse("192.168.1.254"), 5000);
                    DnsMessage upstreamResponse = await dc.ResolveAsync(question.Name, question.RecordType, question.RecordClass);

                    if (upstreamResponse != null)
                    {
                        foreach (DnsRecordBase record in (upstreamResponse.AnswerRecords))
                        {
                            response.AnswerRecords.Add(record);
                        }
                        foreach (DnsRecordBase record in (upstreamResponse.AdditionalRecords))
                        {
                            response.AdditionalRecords.Add(record);
                        }

                        response.ReturnCode = ReturnCode.NoError;

                        // set the response
                        eventArgs.Response = response;
                    }
                }
            }

            //await Task.Delay(1000);
        }
Ejemplo n.º 25
0
        static async Task OnQueryReceived(object sender, QueryReceivedEventArgs e)
        {
            DnsMessage message = e.Query as DnsMessage;
            DnsMessage query   = e.Query as DnsMessage;

            if (query == null)
            {
                return;
            }

            DnsMessage response = query.CreateResponseInstance();

            if (e.RemoteEndpoint.Address == null)
            {
                return;
            }
            string ipAdr  = e.RemoteEndpoint.Address.ToString();
            Client client = dc.Clients.SingleOrDefault(c => c.Ip == ipAdr);

            if (client == null)
            {
                dc.Clients.Add(new Client()
                {
                    Ip = ipAdr
                });
                dc.SaveChanges();
            }


            if ((message.Questions.Count == 1))
            {
                DnsQuestion question = message.Questions[0];
                if (client.IsBlocked)
                {
                    dc.Logs.Add(new Log()
                    {
                        ClientIp = ipAdr, Request = question.Name.ToString(), Result = Log.ResultType.success
                    });
                    dc.SaveChanges();
                    return;
                }
                DnsClient  dnsClient        = new DnsClient(IPAddress.Parse(mainDns), 5000);
                DnsMessage upstreamResponse = await dnsClient.ResolveAsync(question.Name, question.RecordType, question.RecordClass);

                if (globalBlock == "1")
                {
                    response.AnswerRecords.AddRange(
                        upstreamResponse.AnswerRecords
                        .Where(w => !(w is ARecord))
                        .Concat(
                            upstreamResponse.AnswerRecords
                            .OfType <ARecord>()
                            .Select(a => new ARecord(a.Name, a.TimeToLive, IPAddress.Parse(globalBlockIp)))
                            )
                        );
                    dc.Logs.Add(new Log()
                    {
                        ClientIp = ipAdr, Request = question.Name.ToString(), Result = Log.ResultType.blocked
                    });
                    dc.SaveChanges();
                }
                else
                {
                    string questionUrl    = question.Name.ToString();
                    Domain questionDomain = domainList.SingleOrDefault(d => questionUrl.Contains(d.Url));
                    if (questionDomain == null)
                    {
                        if (upstreamResponse.AnswerRecords[0] != null)
                        {
                            foreach (DnsRecordBase record in (upstreamResponse.AnswerRecords))
                            {
                                response.AnswerRecords.Add(record);
                            }
                            foreach (DnsRecordBase record in (upstreamResponse.AdditionalRecords))
                            {
                                response.AdditionalRecords.Add(record);
                            }

                            response.ReturnCode = ReturnCode.NoError;
                            dc.Logs.Add(new Log()
                            {
                                ClientIp = ipAdr, Request = question.Name.ToString(), Result = Log.ResultType.success
                            });
                            dc.SaveChanges();
                        }
                    }

                    else
                    {
                        if (questionDomain.Type == Data.DType.blocked)
                        {
                            response.AnswerRecords.AddRange(
                                upstreamResponse.AnswerRecords
                                .Where(w => !(w is ARecord))
                                .Concat(
                                    upstreamResponse.AnswerRecords
                                    .OfType <ARecord>()
                                    .Select(a => new ARecord(a.Name, a.TimeToLive, IPAddress.Parse(globalBlockIp)))
                                    )
                                );
                            dc.Logs.Add(new Log()
                            {
                                ClientIp = ipAdr, Request = question.Name.ToString(), Result = Log.ResultType.blocked
                            });
                            dc.SaveChanges();
                        }
                        else
                        {
                            response.AnswerRecords.AddRange(
                                upstreamResponse.AnswerRecords
                                .Where(w => !(w is ARecord))
                                .Concat(
                                    upstreamResponse.AnswerRecords
                                    .OfType <ARecord>()
                                    .Select(a => new ARecord(a.Name, a.TimeToLive, IPAddress.Parse(questionDomain.ForwardIp)))
                                    )
                                );
                            dc.Logs.Add(new Log()
                            {
                                ClientIp = ipAdr, Request = question.Name.ToString(), Result = Log.ResultType.forward
                            });
                            dc.SaveChanges();
                        }
                    }
                }

                e.Response = response;
            }
        }
        private async Task OnQueryReceived(object sender, QueryReceivedEventArgs e)
        {
            if (e.Query is DnsMessage message)
            {
                var response = message.CreateResponseInstance();

                if (message.Questions.Count == 1)
                {
                    DnsClient dnsClient;
                    var       options = new DnsQueryOptions
                    {
                        IsEDnsEnabled      = true,
                        IsRecursionDesired = message.IsRecursionDesired,
                        IsDnsSecOk         = message.IsDnsSecOk,
                        IsCheckingDisabled = message.IsCheckingDisabled
                    };

                    var existEcs = ExistEcs(message.EDnsOptions);
                    if (existEcs)
                    {
                        foreach (var option in message.EDnsOptions.Options)
                        {
                            options.EDnsOptions.Options.Add(option);
                        }
                    }

                    var question = message.Questions[0];
                    Console.WriteLine($@"DNS query: {question.Name}");
                    if (IsLocal(question.Name))
                    {
                        response.ReturnCode = ReturnCode.NxDomain;
                        e.Response          = response;
                        return;
                    }
                    else if (IsOnList(question.Name))
                    {
                        dnsClient = UpStreamDns;
                        if (!existEcs)
                        {
                            if (UpStreamEcs != null)
                            {
                                options.EDnsOptions.Options.Add(UpStreamEcs);
                            }
                            else                             //if (question.RecordType != RecordType.Ptr)
                            {
                                options.EDnsOptions.Options.Add(new ClientSubnetOption(32, e.RemoteEndpoint.Address));
                            }
                        }
                    }
                    else
                    {
                        dnsClient = PureDns;
                        if (!existEcs)
                        {
                            if (PureEcs != null)
                            {
                                options.EDnsOptions.Options.Add(PureEcs);
                            }
                            else                             //if (question.RecordType != RecordType.Ptr)
                            {
                                options.EDnsOptions.Options.Add(new ClientSubnetOption(32, e.RemoteEndpoint.Address));
                            }
                        }
                    }

                    // send query to upstream server
                    var upstreamResponse = await dnsClient.ResolveAsync(question.Name, question.RecordType, question.RecordClass, options);

                    // if got an answer, copy it to the message sent to the client
                    if (upstreamResponse != null)
                    {
                        upstreamResponse.TransactionID = response.TransactionID;
                        if (!existEcs)
                        {
                            upstreamResponse.EDnsOptions = response.EDnsOptions;
                        }
                        response            = upstreamResponse;
                        response.ReturnCode = ReturnCode.NoError;
                        e.Response          = response;
                    }
                }
                else
                {
                    response.ReturnCode = ReturnCode.FormatError;
                    e.Response          = response;
                }
            }
        }
Ejemplo n.º 27
0
        public static async Task ServerOnQueryReceived(object sender, QueryReceivedEventArgs e)
        {
            try
            {
                if (!(e.Query is DnsMessage query))
                {
                    return;
                }

                IPAddress clientAddress = e.RemoteEndpoint.Address;
                if (DnsSettings.EDnsCustomize)
                {
                    clientAddress = Equals(DnsSettings.EDnsIp, IPAddress.Parse("0.0.0.1"))
                        ? IPAddress.Parse(MainWindow.IntIPAddr.ToString().Substring(
                                              0, MainWindow.IntIPAddr.ToString().LastIndexOf(".", StringComparison.Ordinal)) + ".1") : DnsSettings.EDnsIp;
                }
                else if (Equals(clientAddress, IPAddress.Loopback) || IpTools.InSameLaNet(clientAddress, MainWindow.LocIPAddr))
                {
                    clientAddress = MainWindow.IntIPAddr;
                }

                DnsMessage response = query.CreateResponseInstance();

                if (query.Questions.Count <= 0)
                {
                    response.ReturnCode = ReturnCode.ServerFailure;
                }
                else
                {
                    foreach (DnsQuestion dnsQuestion in query.Questions)
                    {
                        response.ReturnCode = ReturnCode.NoError;

                        if (DnsSettings.DebugLog)
                        {
                            BackgroundLog($@"| {DateTime.Now} {e.RemoteEndpoint.Address} : {dnsQuestion.Name} | {dnsQuestion.RecordType.ToString().ToUpper()}");
                        }

                        if (DomainName.Parse(new Uri(DnsSettings.HttpsDnsUrl).DnsSafeHost) == dnsQuestion.Name ||
                            DomainName.Parse(new Uri(DnsSettings.SecondHttpsDnsUrl).DnsSafeHost) == dnsQuestion.Name ||
                            DomainName.Parse(new Uri(UrlSettings.WhatMyIpApi).DnsSafeHost) == dnsQuestion.Name)
                        {
                            if (!DnsSettings.StartupOverDoH)
                            {
                                response.AnswerRecords.AddRange((await new DnsClient(DnsSettings.SecondDnsIp, 5000)
                                                                 .ResolveAsync(dnsQuestion.Name, dnsQuestion.RecordType)).AnswerRecords);
                                if (DnsSettings.DebugLog)
                                {
                                    BackgroundLog($"| -- Startup SecondDns : {DnsSettings.SecondDnsIp}");
                                }
                            }
                            else
                            {
                                response.AnswerRecords.AddRange(ResolveOverHttpsByDnsJson(clientAddress.ToString(),
                                                                                          dnsQuestion.Name.ToString(), "https://1.0.0.1/dns-query", DnsSettings.ProxyEnable,
                                                                                          DnsSettings.WProxy, dnsQuestion.RecordType).list);
                                if (DnsSettings.DebugLog)
                                {
                                    BackgroundLog("| -- Startup DoH : https://1.0.0.1/dns-query");
                                }
                            }
                        }
                        else if (DnsSettings.DnsCacheEnable && DnsCache.Contains(query))
                        {
                            response.AnswerRecords.AddRange(DnsCache.Get(query).AnswerRecords);
                            //response.AnswerRecords.Add(new TxtRecord(DomainName.Parse("cache.auroradns.mili.one"), 0,
                            //    "AuroraDNSC Cached"));
                            if (DnsSettings.DebugLog)
                            {
                                BackgroundLog(
                                    $@"|- CacheContains : {dnsQuestion.Name} | Count : {MemoryCache.Default.Count()}");
                            }
                        }
                        else if (DnsSettings.BlackListEnable && DnsSettings.BlackList.Contains(dnsQuestion.Name))
                        {
                            response.AnswerRecords.Add(new ARecord(dnsQuestion.Name, 10, IPAddress.Any));
                            response.AnswerRecords.Add(new TxtRecord(DomainName.Parse("blacklist.auroradns.mili.one"), 0,
                                                                     "AuroraDNSC Blocked"));

                            if (DnsSettings.DebugLog)
                            {
                                BackgroundLog(@"|- BlackList");
                            }
                        }
                        else if (DnsSettings.WhiteListEnable && DnsSettings.WhiteList.ContainsKey(dnsQuestion.Name))
                        {
                            List <DnsRecordBase> whiteRecords = new List <DnsRecordBase>();
                            if (!IpTools.IsIp(DnsSettings.WhiteList[dnsQuestion.Name]))
                            {
                                whiteRecords.AddRange((await new DnsClient(DnsSettings.SecondDnsIp, 5000)
                                                       .ResolveAsync(dnsQuestion.Name, dnsQuestion.RecordType)).AnswerRecords);
                            }
                            else
                            {
                                whiteRecords.Add(new ARecord(dnsQuestion.Name, 10,
                                                             IPAddress.Parse(DnsSettings.WhiteList[dnsQuestion.Name])));
                            }

                            response.AnswerRecords.AddRange(whiteRecords);
                            response.AnswerRecords.Add(new TxtRecord(DomainName.Parse("whitelist.auroradns.mili.one"), 0,
                                                                     "AuroraDNSC Rewrote"));

                            if (DnsSettings.DebugLog)
                            {
                                BackgroundLog(@"|- WhiteList");
                            }
                        }
                        else if (DnsSettings.ChinaListEnable && DomainNameInChinaList(dnsQuestion.Name))
                        {
                            try
                            {
                                var resolvedDnsList = ResolveOverHttpByDPlus(dnsQuestion.Name.ToString());
                                if (resolvedDnsList != null && resolvedDnsList != new List <DnsRecordBase>())
                                {
                                    resolvedDnsList.Add(new TxtRecord(DomainName.Parse("chinalist.auroradns.mili.one"),
                                                                      0, "AuroraDNSC ChinaList - DNSPod D+"));
                                    foreach (var item in resolvedDnsList)
                                    {
                                        response.AnswerRecords.Add(item);
                                    }

                                    if (DnsSettings.DebugLog)
                                    {
                                        BackgroundLog(@"|- ChinaList - DNSPOD D+");
                                    }

                                    if (DnsSettings.DnsCacheEnable && response.ReturnCode == ReturnCode.NoError)
                                    {
                                        BackgroundWriteCache(response);
                                    }
                                }
                            }
                            catch (Exception exception)
                            {
                                BackgroundLog(exception.ToString());
                            }
                        }
                        else
                        {
                            //Resolve
                            try
                            {
                                (List <DnsRecordBase> resolvedDnsList, ReturnCode statusCode) = DnsSettings.DnsMsgEnable
                                    ? ResolveOverHttpsByDnsMsg(clientAddress.ToString(),
                                                               dnsQuestion.Name.ToString(), DnsSettings.HttpsDnsUrl, DnsSettings.ProxyEnable,
                                                               DnsSettings.WProxy, dnsQuestion.RecordType)
                                    : ResolveOverHttpsByDnsJson(clientAddress.ToString(),
                                                                dnsQuestion.Name.ToString(), DnsSettings.HttpsDnsUrl, DnsSettings.ProxyEnable,
                                                                DnsSettings.WProxy, dnsQuestion.RecordType);

                                if (resolvedDnsList != null && resolvedDnsList.Count != 0 && statusCode == ReturnCode.NoError)
                                {
                                    response.AnswerRecords.AddRange(resolvedDnsList);
                                    if (DnsSettings.DnsCacheEnable)
                                    {
                                        BackgroundWriteCache(response);
                                    }
                                }
                                else if (statusCode == ReturnCode.ServerFailure)
                                {
                                    response.AnswerRecords = (await new DnsClient(DnsSettings.SecondDnsIp, 1000)
                                                              .ResolveAsync(dnsQuestion.Name, dnsQuestion.RecordType)).AnswerRecords;
                                    BackgroundLog($"| -- SecondDns : {DnsSettings.SecondDnsIp}");
                                }
                                else
                                {
                                    response.ReturnCode = statusCode;
                                }
                            }
                            catch (Exception ex)
                            {
                                response.ReturnCode = ReturnCode.ServerFailure;
                                BackgroundLog(@"| " + ex);
                            }
                        }
                    }
                }

                if (DnsSettings.TtlRewrite &&
                    response.AnswerRecords.All(item => item.Name != DomainName.Parse("cache.auroradns.mili.one")))
                {
                    var list = response.AnswerRecords.Where(item =>
                                                            item.TimeToLive < DnsSettings.TtlMinTime - DateTime.Now.Second).ToList();
                    foreach (var item in list)
                    {
                        switch (item)
                        {
                        case ARecord aRecord:
                            response.AnswerRecords.Add(
                                new ARecord(aRecord.Name, DnsSettings.TtlMinTime, aRecord.Address));
                            response.AnswerRecords.Remove(item);
                            break;

                        case AaaaRecord aaaaRecord:
                            response.AnswerRecords.Add(
                                new ARecord(aaaaRecord.Name, DnsSettings.TtlMinTime, aaaaRecord.Address));
                            response.AnswerRecords.Remove(item);
                            break;

                        case CNameRecord cNameRecord:
                            response.AnswerRecords.Add(new CNameRecord(cNameRecord.Name, DnsSettings.TtlMinTime,
                                                                       cNameRecord.CanonicalName));
                            response.AnswerRecords.Remove(item);
                            break;
                        }
                    }

                    if (list.Count > 0)
                    {
                        response.AnswerRecords.Add(new TxtRecord(DomainName.Parse("ttl.auroradns.mili.one"), 600,
                                                                 $"Rewrite TTL to {DnsSettings.TtlMinTime}"));
                    }
                }

                e.Response = response;
            }
            catch (Exception exception)
            {
                Console.WriteLine(exception);
                BackgroundLog(exception.ToString());
            }
        }
Ejemplo n.º 28
0
        } // End Function OnClientConnected

        static async Task OnQueryReceived(object sender, QueryReceivedEventArgs e)
        {
            // process query as you like
        } // End Function OnQueryReceived
Ejemplo n.º 29
0
        private static async Task OnQueryReceived(object sender, QueryReceivedEventArgs e)
        {
            DnsMessage query = e.Query as DnsMessage;

            if (query == null)
            {
                return;
            }

            // https://en.wikipedia.org/wiki/Domain_Name_System_Security_Extensions

            DnsMessage response = query.CreateResponseInstance();

            // https://tools.ietf.org/html/rfc3658
            // https://www.dynu.com/Resources/DNS-Records/DS-Record
            response.AnswerRecords.Add(
                new DsRecord(
                    DomainName.Parse("example.com") // Name: It defines the hostname of a record and whether the hostname will be appended to the label.
                                                    // Fully qualified hostnames terminated by a period will not append the origin.
                    , RecordClass.Any
                    , 60                            // ttl The time-to-live in seconds. It specifies how long a resolver is supposed to cache or remember the DNS query
                         // before the query expires and a new one needs to be done.
                    , 0                             // Key Tag: A short numeric value which can help quickly identify the referenced DNSKEY-record.
                    , DnsSecAlgorithm.RsaSha256     // The algorithm of the referenced DNSKEY-record.
                    , DnsSecDigestType.Sha256       // Digest Type: Cryptographic hash algorithm used to create the Digest value.
                    , new byte[] { 1, 2, 3 } // A cryptographic hash value of the referenced DNSKEY-record.
                    )
                );

            // https://tools.ietf.org/html/rfc4034
            // https://www.dynu.com/Resources/DNS-Records/DNSKEY-Record
            response.AnswerRecords.Add(
                new DnsKeyRecord(
                    DomainName.Parse("example.com") // Name: It defines the hostname of a record and whether the hostname will be appended to the label.
                                                    // Fully qualified hostnames terminated by a period will not append the origin.
                    , RecordClass.Any
                    , 60                            // ttl The time-to-live in seconds. It specifies how long a resolver is supposed to cache or remember the DNS query
                         // before the query expires and a new one needs to be done.
                    , DnsKeyFlags.Zone
                    , 3                         // Fixed value of 3 (for backwards compatibility)
                    , DnsSecAlgorithm.RsaSha256 // The public key's cryptographic algorithm.
                    , new byte[] { 1, 2, 3 } // Public key data.
                    )

                );

            // https://simpledns.plus/help/rrsig-records
            // https://simpledns.plus/help/definition-ttl-time-to-live
            // https://de.wikipedia.org/wiki/RRSIG_Resource_Record
            response.AnswerRecords.Add(
                new RrSigRecord(
                    DomainName.Parse("example.com")   // Name of the digitally signed RRs
                    , RecordClass.Any
                    , 60                              // ttl The time-to-live in seconds. It specifies how long a resolver is supposed to cache or remember the DNS query
                         // before the query expires and a new one needs to be done.
                    , RecordType.A                    // Type Covered: DNS record type that this signature covers.
                    , DnsSecAlgorithm.RsaSha256       // Cryptographic algorithm used to create the signature.
                    , 4                               // Labels: Number of labels in the original RRSIG-record name (used to validate wildcards).
                    , 0                               // Original TTL: TTL value of the covered record set.
                    , DateTime.Now.AddMinutes(1)      // Signature Expiration: When the signature expires.
                    , DateTime.Now                    // Signature Inception: When the signature was created.
                    , 0                               // Key Tag: A short numeric value which can help quickly identify the DNSKEY-record which can be used to validate this signature.
                        // identifiziert den unterzeichnenden DNSKEY, um zwischen mehreren Signaturen zu unterscheiden (engl. key tag)
                    , DomainName.Parse("example.com") // Signer's Name: Name of the DNSKEY-record which can be used to validate this signature.
                    , new byte[] { 1, 2, 3 } // Signature: Cryptographic signature.  (Base64)
                    )
                );


            // check for valid query
            if ((query.Questions.Count == 1) &&
                (query.Questions[0].RecordType == RecordType.Txt) &&
                (query.Questions[0].Name.Equals(DomainName.Parse("example.com"))))
            {
                response.ReturnCode = ReturnCode.NoError;
                response.AnswerRecords.Add(new TxtRecord(DomainName.Parse("example.com"), 3600, "Hello world"));
            }
            else
            {
                response.ReturnCode = ReturnCode.ServerFailure;
            }

            // set the response
            e.Response = response;
        } // End Function OnQueryReceived
Ejemplo n.º 30
0
        public static async Task ServerOnQueryReceived(object sender, QueryReceivedEventArgs e)
        {
            if (!(e.Query is DnsMessage query))
            {
                return;
            }

            IPAddress clientAddress = e.RemoteEndpoint.Address;

            if (DnsSettings.EDnsCustomize)
            {
                clientAddress = Equals(DnsSettings.EDnsIp, IPAddress.Parse("0.0.0.1"))
                    ? IPAddress.Parse(MainWindow.IntIPAddr.ToString().Substring(
                                          0, MainWindow.IntIPAddr.ToString().LastIndexOf(".", StringComparison.Ordinal)) + ".0") : DnsSettings.EDnsIp;
            }
            else if (Equals(clientAddress, IPAddress.Loopback) || IpTools.InSameLaNet(clientAddress, MainWindow.LocIPAddr))
            {
                clientAddress = MainWindow.IntIPAddr;
            }

            DnsMessage response = query.CreateResponseInstance();

            if (query.Questions.Count <= 0)
            {
                response.ReturnCode = ReturnCode.ServerFailure;
            }

            else
            {
                foreach (DnsQuestion dnsQuestion in query.Questions)
                {
                    response.ReturnCode = ReturnCode.NoError;

                    if (DnsSettings.DebugLog)
                    {
                        BgwLog($@"| {DateTime.Now} {e.RemoteEndpoint.Address} : {dnsQuestion.Name} | {dnsQuestion.RecordType.ToString().ToUpper()}");
                    }

                    if (DnsSettings.BlackListEnable && BlackList.Contains(dnsQuestion.Name) && dnsQuestion.RecordType == RecordType.A)
                    {
                        //BlackList
                        ARecord blackRecord = new ARecord(dnsQuestion.Name, 10, IPAddress.Any);
                        response.AnswerRecords.Add(blackRecord);
                        if (DnsSettings.DebugLog)
                        {
                            BgwLog(@"|- BlackList");
                        }
                    }
                    else if (DnsSettings.WhiteListEnable && WhiteList.ContainsKey(dnsQuestion.Name) && dnsQuestion.RecordType == RecordType.A)
                    {
                        //WhiteList
                        ARecord blackRecord = new ARecord(dnsQuestion.Name, 10, WhiteList[dnsQuestion.Name]);
                        response.AnswerRecords.Add(blackRecord);
                        if (DnsSettings.DebugLog)
                        {
                            BgwLog(@"|- WhiteList");
                        }
                    }
                    else
                    {
                        //Resolve
                        try
                        {
                            var(resolvedDnsList, statusCode) = ResolveOverHttps(clientAddress.ToString(),
                                                                                dnsQuestion.Name.ToString(), DnsSettings.ProxyEnable, DnsSettings.WProxy, dnsQuestion.RecordType);
                            if (resolvedDnsList != null && resolvedDnsList != new List <dynamic>() && statusCode == ReturnCode.NoError)
                            {
                                foreach (var item in resolvedDnsList)
                                {
                                    response.AnswerRecords.Add(item);
                                }
                            }
                            else if (statusCode == ReturnCode.ServerFailure)
                            {
                                response.AnswerRecords = new DnsClient(DnsSettings.SecondDnsIp, 1000)
                                                         .Resolve(dnsQuestion.Name, dnsQuestion.RecordType).AnswerRecords;
                                BgwLog($"| -- SecondDns {DnsSettings.SecondDnsIp}");
                            }
                            else
                            {
                                response.ReturnCode = statusCode;
                            }
                        }
                        catch (Exception ex)
                        {
                            response.ReturnCode = ReturnCode.ServerFailure;
                            BgwLog(@"| " + ex);
                        }
                    }
                }
            }

            e.Response = response;
        }