private async Task <DnsMessageBase> ProcessMessageAsync(DnsMessageBase query, ProtocolType protocolType, IPEndPoint remoteEndpoint)
        {
            QueryReceivedEventArgs eventArgs = new QueryReceivedEventArgs(query, protocolType, remoteEndpoint);
            await QueryReceived.RaiseAsync(this, eventArgs);

            return(eventArgs.Response);
        }
Exemple #2
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;
                }
            }
        }
Exemple #3
0
        private async Task <DnsMessageBase> ProcessMessageAsync(DnsMessageBase query, ProtocolType protocolType, IPEndPoint remoteEndpoint)
        {
            if (query.TSigOptions != null)
            {
                switch (query.TSigOptions.ValidationResult)
                {
                case ReturnCode.BadKey:
                case ReturnCode.BadSig:
                    query.IsQuery             = false;
                    query.ReturnCode          = ReturnCode.NotAuthoritive;
                    query.TSigOptions.Error   = query.TSigOptions.ValidationResult;
                    query.TSigOptions.KeyData = null;

#pragma warning disable 4014
                    InvalidSignedMessageReceived.RaiseAsync(this, new InvalidSignedMessageEventArgs(query, protocolType, remoteEndpoint));
#pragma warning restore 4014

                    return(query);

                case ReturnCode.BadTime:
                    query.IsQuery               = false;
                    query.ReturnCode            = ReturnCode.NotAuthoritive;
                    query.TSigOptions.Error     = query.TSigOptions.ValidationResult;
                    query.TSigOptions.OtherData = new byte[6];
                    int tmp = 0;
                    TSigRecord.EncodeDateTime(query.TSigOptions.OtherData, ref tmp, DateTime.Now);

#pragma warning disable 4014
                    InvalidSignedMessageReceived.RaiseAsync(this, new InvalidSignedMessageEventArgs(query, protocolType, remoteEndpoint));
#pragma warning restore 4014

                    return(query);
                }
            }

            QueryReceivedEventArgs eventArgs = new QueryReceivedEventArgs(query, protocolType, remoteEndpoint);
            await QueryReceived.RaiseAsync(this, eventArgs);

            return(eventArgs.Response);
        }
        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;
                }
            }
        }
		private async Task<DnsMessageBase> ProcessMessageAsync(DnsMessageBase query, ProtocolType protocolType, IPEndPoint remoteEndpoint)
		{
			if (query.TSigOptions != null)
			{
				switch (query.TSigOptions.ValidationResult)
				{
					case ReturnCode.BadKey:
					case ReturnCode.BadSig:
						query.IsQuery = false;
						query.ReturnCode = ReturnCode.NotAuthoritive;
						query.TSigOptions.Error = query.TSigOptions.ValidationResult;
						query.TSigOptions.KeyData = null;

#pragma warning disable 4014
						InvalidSignedMessageReceived.RaiseAsync(this, new InvalidSignedMessageEventArgs(query, protocolType, remoteEndpoint));
#pragma warning restore 4014

						return query;

					case ReturnCode.BadTime:
						query.IsQuery = false;
						query.ReturnCode = ReturnCode.NotAuthoritive;
						query.TSigOptions.Error = query.TSigOptions.ValidationResult;
						query.TSigOptions.OtherData = new byte[6];
						int tmp = 0;
						TSigRecord.EncodeDateTime(query.TSigOptions.OtherData, ref tmp, DateTime.Now);

#pragma warning disable 4014
						InvalidSignedMessageReceived.RaiseAsync(this, new InvalidSignedMessageEventArgs(query, protocolType, remoteEndpoint));
#pragma warning restore 4014

						return query;
				}
			}

			QueryReceivedEventArgs eventArgs = new QueryReceivedEventArgs(query, protocolType, remoteEndpoint);
			await QueryReceived.RaiseAsync(this, eventArgs);
			return eventArgs.Response;
		}
Exemple #6
0
        private static void OnQueryReceived(object sender, QueryReceivedEventArgs e)
        {
            StringBuilder sb = new StringBuilder();

            try
            {
                DnsMessage message = e.Query as DnsMessage;

                message.IsQuery = false;

                if (message == null || message.Questions.Count == 0)
                {
                    e.Response = message;
                    message.ReturnCode = ReturnCode.ServerFailure;
                    e.Response = message;
                    Console.WriteLine(sb);
                    return;
                }

                //Log DNS query
                sb.AppendFormat("* {0}\r\n", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"));
                for (int i = 0; i < message.Questions.Count; i++)
                {
                    sb.AppendFormat("[{0}]\t{1}\t{2}\r\n",
                        i, message.Questions[i].RecordType.ToString(), message.Questions[i].Name);
                }

                if (message.Questions.Count > 1)
                {
                    sb.AppendFormat("Response: (x) ServerFailure -- Multiple questions\r\n");
                    e.Response = message;
                    message.ReturnCode = ReturnCode.ServerFailure;
                    e.Response = message;
                    Console.WriteLine(sb);
                    return;
                }

                DnsQuestion question = message.Questions[0];

                if (!question.Name.Equals(domain, StringComparison.CurrentCultureIgnoreCase)
                    && !question.Name.EndsWith(string.Concat(".", domain), StringComparison.CurrentCultureIgnoreCase))
                {
                    e.Response = message;
                    message.ReturnCode = ReturnCode.ServerFailure;
                    e.Response = message;
                    sb.AppendFormat("Response: (x) ServerFailure -- Domain \"{0}\" is invalid\r\n", question.Name);
                    Console.WriteLine(sb);
                    return;
                }

                if (question.RecordType == RecordType.Txt)
                {
                    //MX
                    message.ReturnCode = ReturnCode.NoError;
                    message.AnswerRecords.Add(new TxtRecord(domain, ttlSeconds, "Hello world"));
                    message.ReturnCode = ReturnCode.NoError;
                    e.Response = message;
                    sb.AppendFormat("Response: OK!\r\n", question.Name);
                    Console.WriteLine(sb);
                    return;
                }
                else if (question.RecordType == RecordType.A)
                {
                    //A

                    string subdomain = question.Name.Substring(0, question.Name.LastIndexOf(domain));
                    if (subdomain.Length > 0)
                        subdomain = subdomain.Substring(0, subdomain.Length - 1); //remove o ponto

                    if (subdomain.Length == 0)
                    {
                        //raiz do domínio
                        var record = new ARecord(question.Name, ttlSeconds, System.Net.IPAddress.Parse("192.168.1.1"));
                        message.AnswerRecords.Add(record);
                        message.ReturnCode = ReturnCode.NoError;
                        e.Response = message;
                        sb.AppendFormat("Response: OK!\r\n", question.Name);
                        return;
                    }
                    else
                    {
                        //subdomínios

                        if (subdomain.Length > 0 && subdomain.StartsWith("local_", StringComparison.CurrentCultureIgnoreCase))
                        {
                            //recebe: local_192-168-10-10.[domain]  e retorna: "192.168.10.10"

                            string ipString = subdomain.Substring("local_".Length);
                            ipString = ipString.Replace("-", ".");

                            System.Net.IPAddress ipAddress;
                            if (System.Net.IPAddress.TryParse(ipString, out ipAddress))
                            {
                                var record = new ARecord(question.Name, ttlSeconds, ipAddress);
                                message.AnswerRecords.Add(record);
                                message.ReturnCode = ReturnCode.NoError;
                                e.Response = message;
                                sb.AppendFormat("Response: OK!\r\n", question.Name);
                                Console.WriteLine(sb);
                                return;
                            }
                            else
                            {
                                sb.AppendFormat("Response: (x) ServerFailure -- Invalid IP \"{0}\" invalid. Example of subdomain valid: \"local_192-168-10-10\"\r\n", ipString);
                                message.ReturnCode = ReturnCode.ServerFailure;
                                e.Response = message;
                                Console.WriteLine(sb);
                                return;
                            }
                        }
                        else
                        {
                            sb.AppendFormat("Response: (x) ServerFailure -- Subdomain \"{0}\" invalid. Example of subdomain valid: \"local_192-168-10-10\"\r\n", subdomain);
                            message.ReturnCode = ReturnCode.ServerFailure;
                            e.Response = message;
                            Console.WriteLine(sb);
                            return;
                        }
                    }
                }

                sb.AppendFormat("Response: (x) ServerFailure --  Record Type \"{0}\" invalid\r\n", question.RecordType.ToString());
                message.ReturnCode = ReturnCode.ServerFailure;
                e.Response = message;
            }
            catch (System.Exception ex)
            {
                sb.AppendFormat("{0} EXCEPTION: {1}\r\n{2}\r\n\r\n",
                        DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"),
                        ex.Message,
                        ex.StackTrace);
            }

            Console.WriteLine(sb.ToString());
        }
Exemple #7
0
        private async Task Server_QueryReceived(object sender, ARSoft.Tools.Net.Dns.QueryReceivedEventArgs e)
        {
            bool foundQuery = false;

            DnsMessage query = e.Query as DnsMessage;

            if (query == null)
            {
                return;
            }

            DnsMessage response = query.CreateResponseInstance();

            try {
                C.WriteLine($"DnsServer: Questions: {query.Questions.Count}", true, "DNS");

                for (int idx = 0; idx < query.Questions.Count; idx++)
                {
                    var question = query.Questions[idx];

                    using (var connection = db.Connection()) {
                        using (var command = new SqliteCommand(
                                   "SELECT * FROM DnsEntries WHERE RecordType = @RecordType AND RecordClass = @RecordClass AND DomainName = @DomainName;", connection)) {
                            command.Parameters.AddWithValue("@RecordType", question.RecordType.ToString());
                            command.Parameters.AddWithValue("@RecordClass", question.RecordClass.ToString());
                            command.Parameters.AddWithValue("@DomainName", question.Name.ToString());

                            using (var reader = command.ExecuteReader()) {
                                C.WriteLine($"  Questions [{idx:000}] RES({reader.HasRows}): Type({question.RecordType}), Class({question.RecordClass}), {question.Name}", true, "DNS");

                                //Every new row will create a new dictionary that holds the columns
                                while (reader.Read())
                                {
                                    try {
                                        var dnStr = reader["DomainName"] as string;
                                        var dn    = DomainName.Parse(dnStr);
                                        if (dn == null)
                                        {
                                            continue;
                                        }

                                        var ttl = (System.Int64)reader["TTL"];
                                        var rt  = (RecordType)Enum.Parse(typeof(RecordType), reader["RecordType"] as string);
                                        var rc  = (RecordClass)Enum.Parse(typeof(RecordClass), reader["RecordClass"] as string);

                                        if (rt == RecordType.A)
                                        {
                                            if (reader["Address"] == null)
                                            {
                                                continue;
                                            }
                                            var addr = reader["Address"] as string;

                                            var aRec = new ARecord(dn, Convert.ToInt32(ttl), IPAddress.Parse(addr));
                                            response.AnswerRecords.Add(aRec);

                                            foundQuery = true;
                                        }
                                    } catch (Exception ex) {
                                        C.WriteLine($"  Questions [{idx:000}]: {C.Red}Exception: {ex.ToString()}", true, "DNS:ERROR");
                                    }
                                }
                            }
                        }
                    }
                }

                // Fallback
                if (dnsFallback != null && !foundQuery)
                {
                    DnsQuestion question = query.Questions[0];
                    var         resolve  = dnsFallback.Resolve(question.Name);

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

                    e.Response = upstreamResponse;
                    return;
                }

                response.ReturnCode = ReturnCode.NoError;
            } catch (Exception ex) {
                response.ReturnCode = ReturnCode.ServerFailure;
                C.WriteLine($"{C.Red}{ex.ToString()}", true, "DNS:ERROR");
            }

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