Ejemplo n.º 1
0
        public override DnsRecordBase Answer(DnsQuestion question)
        {
            if (pattern.IsMatch(question.Name))
                return new CNameRecord(question.Name, 1, this.canonicalName);

            return null;
        }
Ejemplo n.º 2
0
        private List<DnsRecordBase> ForwardQuery(DnsQuestion question)
        {
            List<DnsRecordBase> result = new List<DnsRecordBase>();

            state_.Logger.Debug("Ask the DNS server. Name: {0}, Type: {1}, Class: {2}", question.Name, question.RecordType, question.RecordClass);
            DnsMessage answer = state_.Dns.Resolve(question.Name, question.RecordType, question.RecordClass);
            if(answer == null)
            {
                state_.Logger.Debug("No answer");
                return null;
            }

            foreach(DnsRecordBase record in answer.AnswerRecords)
            {
                state_.Logger.Information("{0}", record);
                result.Add(record);
            }

            foreach(DnsRecordBase record in answer.AdditionalRecords)
            {
                state_.Logger.Information("{0}", record);
                result.Add(record);
            }

            return result;
        }
Ejemplo n.º 3
0
        public override DnsRecordBase Answer(DnsQuestion question)
        {
            if (pattern.IsMatch(question.Name))
                return new ARecord(question.Name, 1, this.ipAddress);

            return null;
        }
Ejemplo n.º 4
0
        private void ProcessQuestion(DnsMessage message, DnsQuestion dnsQuestion)
        {
            var dnsRequest = new DnsRequest() { Name = dnsQuestion.Name, Type = dnsQuestion.RecordType.ToString() };
            var result = dnsResolver.Resolve(dnsRequest);
            if (result.DnsEntry == null)
            {
                message.ReturnCode = ReturnCode.NxDomain;
                return;
            }

            message.AnswerRecords.Add(new ARecord(dnsRequest.Name, 3600, IPAddress.Parse(result.DnsEntry.IpV4)));
        }
        public void ResolveMapOnlyTest()
        {
            var resolver = new DotBitResolver(mockResolveDns, new dotBitNs.Server.DotBitResolver.LookupDomainValueRootHandler(mockLookupDotBit));
            var q = new DnsQuestion("nx.bit", RecordType.Any, RecordClass.Any);
            string expectedA = "178.248.244.15";
            var answer = resolver.GetAnswer(q);

            Assert.IsInstanceOfType(answer.AnswerRecords.First(), typeof(ARecord));

            ARecord a = answer.AnswerRecords.First() as ARecord;
            Assert.AreEqual(expectedA, a.Address.ToString());
        }
Ejemplo n.º 6
0
        /// <summary>
        /// Create a new cache entry.
        /// </summary>
        public CacheEntry(DnsQuestion question, DnsRecordBase[] records, int ttl)
        {
            Since = DateTime.UtcNow;
            Question = question;

            foreach (var record in records)
            {
                // Override the TTL
                record.TimeToLive = ttl > 0 ? ttl : int.MaxValue;
            }

            Records = records;
        }
        public void ResolveRootTest()
        {
            var resolver = new DotBitResolver(mockResolveDns, new dotBitNs.Server.DotBitResolver.LookupDomainValueRootHandler(mockLookupDotBit));

            var qRoot = new DnsQuestion("json1.bit", RecordType.Any, RecordClass.Any);
            var answer = resolver.GetAnswer(qRoot);
            var expectedRootName = "json1.bit";
            var expectedRootAddress = IPAddress.Parse(ip);

            Assert.IsInstanceOfType(answer.AnswerRecords.First(), typeof(ARecord));
            Assert.AreEqual(expectedRootName, answer.AnswerRecords.First().Name);
            Assert.AreEqual(expectedRootAddress, ((ARecord)answer.AnswerRecords.First()).Address);
        }
Ejemplo n.º 8
0
        /// <summary>
        /// Compares source with target to see if it matches.
        /// </summary>
        public static bool IsEqualTo(this DnsQuestion source, DnsQuestion target)
        {
            if (source == target)
            {
                return true;
            }

            if (source == null || target == null)
            {
                return false;
            }

            return source.Name == target.Name && source.RecordClass == target.RecordClass &&
                   source.RecordType == target.RecordType;
        }
        private DnsMessage InternalGetAnswer(DnsQuestion question)
        {
            DnsMessage answer = ResolveDotBitAddress(question);

            if (answer == null)
            {
                // send query to upstream server
                answer = DnsResolve(question.Name, question.RecordType, question.RecordClass);
            }

            return answer;
        }
Ejemplo n.º 10
0
        internal List<DnsRecordBase> ProcessQuery(DnsQuestion question)
        {
            IPAddress ip = null;

            if(state_.Config.Dns.CatchAll)
                ip = CatchAllProcessQuery(question);
            else
            {
                Interception interception = state_.Config.GetInterception(question.Name);
                if(interception == null)
                {
                    state_.Logger.Debug("No interception for '{0}' found", question.Name);
                    return null;
                }

                ip = GetIp(interception);
            }

            if(null == ip)
            {
                state_.Logger.Information("No IP found for '{0}'", question.Name);
                return null;
            }

            List<DnsRecordBase> result = new List<DnsRecordBase>();
            state_.Logger.Information("DNS {1} {0} TTL {2}", ip, question.Name, state_.Config.Dns.AnswerTtl);
            result.Add(new ARecord(question.Name, state_.Config.Dns.AnswerTtl, ip));
            return result;
        }
Ejemplo n.º 11
0
        private List<DnsRecordBase> ProcessQuestion(DnsQuestion question)
        {
            if(!intercept_)
                return null;

            switch(question.RecordType)
            {
                case RecordType.A:
                    return processAQuery_.ProcessQuery(question);

                case RecordType.Aaaa:
                    //records = processAaaaQuery_.ProcessQuery(question);
                    break;

                default:
                    break;
            }

            return null;
        }
Ejemplo n.º 12
0
 public abstract DnsRecordBase Answer(DnsQuestion question);
        private DnsMessage GetDotBitAnswerForName(DnsQuestion question, string name)
        {
            try
            {
                recursionLevel++;

                if (recursionLevel > maxRecursion)
                {
                    ConsoleUtils.WriteWarning("Max recursion reached");
                    return null;
                }

                DomainValue value = GetDomainValue(name);
                if (value == null)
                    return null;

                value.ImportDefaultMap();

                DnsMessage answer = null;

                //TODO: delegate not implemented
                if (!string.IsNullOrWhiteSpace(value.@Delegate))
                    ConsoleUtils.WriteWarning("delegate setting not implemented: {0}", value.Import);

                //TODO: import not implemented
                if (!string.IsNullOrWhiteSpace(value.Import))
                    ConsoleUtils.WriteWarning("import setting not implemented: {0}", value.Import);

                if (value.Alias != null)
                {
                    string newLookup;
                    if (value.Alias.EndsWith(".")) // absolute
                    {
                        newLookup = value.Alias;
                    }
                    else // sub domain
                    {
                        newLookup = value.Alias + '.';
                    }
                    DnsQuestion newQuestion = new DnsQuestion(value.Alias, question.RecordType, question.RecordClass);
                    return InternalGetAnswer(newQuestion);
                }

                answer = new DnsMessage()
                {
                    Questions = new List<DnsQuestion>() { question }
                };

                bool any = question.RecordType == RecordType.Any;

                var nsnames = value.Ns;
                if (nsnames != null && nsnames.Count() > 0) // NS overrides all
                {
                    List<IPAddress> nameservers = GetDotBitNameservers(nsnames);
                    if (nameservers.Count() > 0)
                    {
                        var client = new DnsClient(nameservers, 2000);
                        if (!string.IsNullOrWhiteSpace(value.Translate))
                            name = value.Translate;
                        answer = client.Resolve(name, question.RecordType, question.RecordClass);
                    }
                }
                else
                {
                    if (any || question.RecordType == RecordType.A)
                    {
                        var addresses = value.Ips;
                        if (addresses.Count() > 0)
                            foreach (var address in addresses)
                                answer.AnswerRecords.Add(new ARecord(name, 60, address));
                    }
                    if (any || question.RecordType == RecordType.Aaaa)
                    {
                        var addresses = value.Ip6s;
                        if (addresses.Count() > 0)
                            foreach (var address in addresses)
                                answer.AnswerRecords.Add(new AaaaRecord(name, 60, address));
                    }
                }

                return answer;
            }
            finally
            {
                recursionLevel--;
            }
        }
Ejemplo n.º 14
0
        private IPAddress CatchAllProcessQuery(DnsQuestion question)
        {
            // If there is an interception configured, take it
            Interception interception = state_.Config.GetInterception(question.Name);
            if(interception != null)
                return GetIp(interception);

            return state_.AllocateIP(question.Name);
        }
Ejemplo n.º 15
0
 public InfiniteForwardingException(DnsQuestion question)
 {
     Question = question;
 }
 private List<IPAddress> GetDotBitNameservers(IEnumerable<string> nsnames)
 {
     List<IPAddress> nameservers = new List<IPAddress>();
     foreach (var ns in nsnames)
     {
         IPAddress ip;
         if (IPAddress.TryParse(ns, out ip))
             nameservers.Add(ip);
         else
         {
             var nsQuestion = new DnsQuestion(ns, RecordType.A, RecordClass.Any);
             var nsAnswer = InternalGetAnswer(nsQuestion);
             if (nsAnswer != null && nsAnswer.AnswerRecords.Any(m => m.RecordType == RecordType.A && m is ARecord))
             {
                 IPAddress nsip = nsAnswer.AnswerRecords.Where(m => m.RecordType == RecordType.A).Cast<ARecord>().First().Address;
                 nameservers.Add(nsip);
             }
         }
     }
     return nameservers;
 }
Ejemplo n.º 17
0
        private DnsRecordBase[] ApplyRemaps(DnsQuestion question)
        {
            var records = new List<DnsRecordBase>();

            foreach (var entry in Configuration.Where(c => c.Key.Equals("remap", StringComparison.InvariantCultureIgnoreCase)))
            {
                // FORMAT: <filter> <class> <type> <value>
                string[] parts = entry.Value.Split(new[] {' '}, 4);

                if (parts.Length != 4)
                {
                    // Invalid rule
                    continue;
                }

                string remapFilter = parts[0];
                string remapClass = parts[1];
                string remapType = parts[2];
                string remapValue = parts[3];

                // See if we got a match
                if (Glob.Match(question.Name, remapFilter)
                    && (question.RecordClass == RecordClass.Any || (question.RecordClass.ToString().Equals(remapClass, StringComparison.InvariantCultureIgnoreCase)))
                    && (question.RecordType == RecordType.Any || (question.RecordType.ToString().Equals(remapType, StringComparison.InvariantCultureIgnoreCase))))
                {
                    IPAddress ipaddress = null;

                    switch (remapType.ToUpper())
                    {
                        case "A":
                            if (!IPAddress.TryParse(remapValue, out ipaddress))
                            {
                                // Invalid argument
                                continue;
                            }

                            records.Add(new ARecord(question.Name, Configuration.RemapTtl, ipaddress));
                            break;
                        case "MX":
                            ushort priority = 0;

                            if (remapValue.Contains(" "))
                            {
                                ushort.TryParse(remapValue.Split(' ')[0], out priority);
                            }

                            records.Add(new MxRecord(question.Name, Configuration.RemapTtl, priority, remapValue.Split(' ')[0]));
                            break;
                        case "NS":
                            records.Add(new NsRecord(question.Name, Configuration.RemapTtl, remapValue.Trim()));
                            break;
                    }
                }
            }

            return records.ToArray();
        }
Ejemplo n.º 18
0
        private FilterAction ApplyFilters(DnsQuestion question)
        {
            // Default : Proxy
            FilterAction result = FilterAction.Proxy;

            foreach (var entry in Configuration.Where(c => c.Key.StartsWith("filter-", StringComparison.InvariantCultureIgnoreCase)))
            {
                switch(entry.Key.ToLower())
                {
                    case "filter-proxy":
                        if (Glob.Match(question.Name, entry.Value ))
                        {
                            result = FilterAction.Proxy;
                        }
                        break;

                    case "filter-reject":
                        if (Glob.Match(question.Name, entry.Value))
                        {
                            result = FilterAction.Reject;
                        }
                        break;

                    case "filter-skip-proxy":
                        if (Glob.Match(question.Name, entry.Value))
                        {
                            result = FilterAction.SkipProxy;
                        }
                        break;
                }
            }

            return result;
        }
        public void ResolveSubdomainsTest()
        {
            var resolver = new DotBitResolver(mockResolveDns, new dotBitNs.Server.DotBitResolver.LookupDomainValueRootHandler(mockLookupDotBit));

            var qWww = new DnsQuestion("www.json1.bit", RecordType.Any, RecordClass.Any);
            var answer = resolver.GetAnswer(qWww);
            var expectedWwwName = "json1.com.";
            var expectedWwwAddress = dnsMockRecords[expectedWwwName];

            Assert.IsNotNull(answer);
            Assert.IsInstanceOfType(answer.AnswerRecords.First(), typeof(ARecord));
            Assert.AreEqual(expectedWwwName, answer.AnswerRecords.First().Name);
            Assert.AreEqual(expectedWwwAddress, ((ARecord)answer.AnswerRecords.First()).Address);
        }
 private DnsMessage ResolveDotBitAddress(DnsQuestion question)
 {
     string name = question.Name;
     return GetDotBitAnswerForName(question, name);
 }
Ejemplo n.º 21
0
		private void ParseQuestions(byte[] resultData, ref int currentPosition, int recordCount)
		{
			for (int i = 0; i < recordCount; i++)
			{
				DnsQuestion question = new DnsQuestion { Name = ParseDomainName(resultData, ref currentPosition), RecordType = (RecordType) ParseUShort(resultData, ref currentPosition), RecordClass = (RecordClass) ParseUShort(resultData, ref currentPosition) };

				_questions.Add(question);
			}
		}
 public DnsMessage GetAnswer(DnsQuestion question)
 {
     lock (lockResolver)
         return InternalGetAnswer(question);
 }