public static void Add(DnsMessage dnsMessage, HttpContext context) { if (dnsMessage.AnswerRecords.Count <= 0) { return; } var dnsRecordBase = dnsMessage.AnswerRecords.FirstOrDefault(); if (RealIP.TryGetFromDns(dnsMessage, out var ipAddress)) { Add(new CacheItem( $"DNS:{GeoIP.GetGeoStr(ipAddress)}{dnsRecordBase.Name}:{dnsRecordBase.RecordType}", new CacheEntity { List = dnsMessage.AnswerRecords.ToList(), Time = DateTime.Now, ExpiresTime = DateTime.Now.AddSeconds(dnsRecordBase.TimeToLive) }), dnsRecordBase.TimeToLive); } else { Add(new CacheItem($"DNS:{dnsRecordBase.Name}:{dnsRecordBase.RecordType}", new CacheEntity { List = dnsMessage.AnswerRecords.ToList(), Time = DateTime.Now, ExpiresTime = DateTime.Now.AddSeconds(dnsRecordBase.TimeToLive) }), dnsRecordBase.TimeToLive); } }
public static bool Contains(DnsMessage dnsQMsg, HttpContext context = null) { return(context == null ? MemoryCache.Default.Contains( $"DNS:{dnsQMsg.Questions.FirstOrDefault().Name}:{dnsQMsg.Questions.FirstOrDefault().RecordType}") : MemoryCache.Default.Contains( $"DNS:{GeoIP.GetGeoStr(RealIP.GetFromDns(dnsQMsg, context))}{dnsQMsg.Questions.FirstOrDefault().Name}:{dnsQMsg.Questions.FirstOrDefault().RecordType}")); }
public static DnsMessage FromDnsJson(HttpContext context, bool ActiveEcs = true, byte EcsDefaultMask = 24) { var queryDictionary = context.Request.Query; var dnsQuestion = new DnsQuestion(DomainName.Parse(queryDictionary["name"]), RecordType.A, RecordClass.INet); if (queryDictionary.ContainsKey("type")) { if (Enum.TryParse(queryDictionary["type"], true, out RecordType rType)) { dnsQuestion = new DnsQuestion(DomainName.Parse(queryDictionary["name"]), rType, RecordClass.INet); } } var dnsQMsg = new DnsMessage { IsEDnsEnabled = true, IsQuery = true, IsRecursionAllowed = true, IsRecursionDesired = true, TransactionID = Convert.ToUInt16(new Random(DateTime.Now.Millisecond).Next(1, 99)) }; dnsQMsg.Questions.Add(dnsQuestion); if (!Config.EcsEnable || !ActiveEcs || queryDictionary.ContainsKey("no-ecs")) { return(dnsQMsg); } if (queryDictionary.ContainsKey("edns_client_subnet")) { var ipStr = queryDictionary["edns_client_subnet"].ToString(); var ipNetwork = ipStr.Contains("/") ? IPNetwork.Parse(ipStr) : IPNetwork.Parse(ipStr, EcsDefaultMask); dnsQMsg.EDnsOptions.Options.Add(new ClientSubnetOption( Equals(ipNetwork.Network, IPAddress.Any) ? (byte)0 : ipNetwork.Cidr, ipNetwork.Network)); } else { var realIp = RealIP.Get(context); if (!Equals(realIp, IPAddress.Loopback)) { dnsQMsg.EDnsOptions.Options.Add( new ClientSubnetOption(EcsDefaultMask, IPNetwork.Parse(realIp.ToString(), EcsDefaultMask).Network)); } } return(dnsQMsg); }
public static DnsMessage Get(DnsMessage dnsQMessage, HttpContext context = null) { var dCacheMsg = new DnsMessage { IsRecursionAllowed = true, IsRecursionDesired = true, TransactionID = dnsQMessage.TransactionID }; var getName = context != null ? $"DNS:{GeoIP.GetGeoStr(RealIP.GetFromDns(dnsQMessage, context))}{dnsQMessage.Questions.FirstOrDefault().Name}:{dnsQMessage.Questions.FirstOrDefault().RecordType}" : $"DNS:{dnsQMessage.Questions.FirstOrDefault().Name}:{dnsQMessage.Questions.FirstOrDefault().RecordType}"; var cacheEntity = Get(getName); foreach (var item in cacheEntity.List) { if (item is ARecord aRecord) { dCacheMsg.AnswerRecords.Add(new ARecord(aRecord.Name, Convert.ToInt32((cacheEntity.Time.AddSeconds(item.TimeToLive) - DateTime.Now) .TotalSeconds), aRecord.Address)); } else if (item is AaaaRecord aaaaRecord) { dCacheMsg.AnswerRecords.Add(new AaaaRecord(aaaaRecord.Name, Convert.ToInt32((cacheEntity.Time.AddSeconds(item.TimeToLive) - DateTime.Now) .TotalSeconds), aaaaRecord.Address)); } else if (item is CNameRecord cNameRecord) { dCacheMsg.AnswerRecords.Add(new CNameRecord(cNameRecord.Name, Convert.ToInt32((cacheEntity.Time.AddSeconds(item.TimeToLive) - DateTime.Now) .TotalSeconds), cNameRecord.CanonicalName)); } else { dCacheMsg.AnswerRecords.Add(item); } } dCacheMsg.Questions.AddRange(dnsQMessage.Questions); dCacheMsg.AnswerRecords.Add(new TxtRecord(DomainName.Parse("cache.arashi-msg"), 0, cacheEntity.ExpiresTime.ToString("r"))); return(dCacheMsg); }
public static void Add(DnsMessage dnsMessage, HttpContext context) { if (dnsMessage.AnswerRecords.Count <= 0) { return; } var dnsRecordBase = dnsMessage.AnswerRecords.FirstOrDefault(); if (RealIP.TryGetFromDns(dnsMessage, out var ipAddress)) { Add(new CacheItem( $"{GeoIP.GetGeoStr(ipAddress)}:{dnsRecordBase.Name}:{dnsRecordBase.RecordType}", dnsMessage.AnswerRecords.ToList()), dnsRecordBase.TimeToLive); } else { Add(new CacheItem($"{dnsRecordBase.Name}:{dnsRecordBase.RecordType}", dnsMessage.AnswerRecords.ToList()), dnsRecordBase.TimeToLive); } }
public static DnsMessage FromWebBase64(HttpContext context, bool ActiveEcs = true) { var queryDictionary = context.Request.Query; var msg = FromWebBase64(queryDictionary["dns"].ToString()); if (!Config.EcsEnable || !ActiveEcs) { return(msg); } if (IsEcsEnable(msg)) { return(msg); } if (!msg.IsEDnsEnabled) { msg.IsEDnsEnabled = true; } msg.EDnsOptions.Options.Add(new ClientSubnetOption(24, IPNetwork.Parse(RealIP.Get(context).ToString(), 24).Network)); return(msg); }
public static DnsMessage FromWebBase64(HttpContext context, bool ActiveEcs = true, byte EcsDefaultMask = 24) { var msg = FromWebBase64(context.Request.Query["dns"].ToString()); if (!Config.EcsEnable || !ActiveEcs || context.Request.Query.ContainsKey("no-ecs")) { return(msg); } if (IsEcsEnable(msg)) { return(msg); } if (!msg.IsEDnsEnabled) { msg.IsEDnsEnabled = true; } msg.EDnsOptions.Options.Add(new ClientSubnetOption(EcsDefaultMask, IPNetwork.Parse(RealIP.Get(context).ToString(), EcsDefaultMask).Network)); return(msg); }
public static async Task <DnsMessage> FromPostByteAsync(HttpContext context, bool ActiveEcs = true, byte EcsDefaultMask = 24) { var msg = DnsMessage.Parse((await context.Request.BodyReader.ReadAsync()).Buffer.ToArray()); if (!Config.EcsEnable || !ActiveEcs || context.Request.Query.ContainsKey("no-ecs")) { return(msg); } if (IsEcsEnable(msg)) { return(msg); } if (!msg.IsEDnsEnabled) { msg.IsEDnsEnabled = true; } msg.EDnsOptions.Options.Add(new ClientSubnetOption(EcsDefaultMask, IPNetwork.Parse(RealIP.Get(context).ToString(), EcsDefaultMask).Network)); return(msg); }
public static void Add(DnsMessage dnsMessage, HttpContext context) { foreach (var item in new List <DnsRecordBase>(dnsMessage.AnswerRecords).Where(item => (item.Name.IsSubDomainOf(DomainName.Parse("arashi-msg")) || item.Name.IsSubDomainOf(DomainName.Parse("nova-msg"))) && item.RecordType == RecordType.Txt)) { dnsMessage.AnswerRecords.Remove(item); } if (dnsMessage.AnswerRecords.Count <= 0) { return; } var dnsRecordBase = dnsMessage.AnswerRecords.FirstOrDefault(); if (RealIP.TryGetFromDns(dnsMessage, out var ipAddress)) { Add(new CacheItem( $"DNS:{GeoIP.GetGeoStr(ipAddress)}{dnsRecordBase.Name}:{dnsRecordBase.RecordType}", new CacheEntity { List = dnsMessage.AnswerRecords.ToList(), Time = DateTime.Now, ExpiresTime = DateTime.Now.AddSeconds(dnsRecordBase.TimeToLive) }), dnsRecordBase.TimeToLive); } else { Add(new CacheItem($"DNS:{dnsRecordBase.Name}:{dnsRecordBase.RecordType}", new CacheEntity { List = dnsMessage.AnswerRecords.ToList(), Time = DateTime.Now, ExpiresTime = DateTime.Now.AddSeconds(dnsRecordBase.TimeToLive) }), dnsRecordBase.TimeToLive); } }
public static DnsMessage Get(DnsMessage dnsQMessage, HttpContext context = null) { var dCacheMsg = new DnsMessage { IsRecursionAllowed = true, IsRecursionDesired = true, TransactionID = dnsQMessage.TransactionID }; if (context != null) { dCacheMsg.AnswerRecords.AddRange(Get( $"{GeoIP.GetGeoStr(RealIP.GetFromDns(dnsQMessage, context))}{dnsQMessage.Questions.FirstOrDefault().Name}:{dnsQMessage.Questions.FirstOrDefault().RecordType}")); } else { dCacheMsg.AnswerRecords.AddRange(Get( $"{dnsQMessage.Questions.FirstOrDefault().Name}:{dnsQMessage.Questions.FirstOrDefault().RecordType}")); } dCacheMsg.Questions.AddRange(dnsQMessage.Questions); dCacheMsg.AnswerRecords.Add(new TxtRecord(DomainName.Parse("cache.doh.pp.ua"), 0, "ArashiDNS.P Cached")); return(dCacheMsg); }