public static bool Request(string extension) { IDnsQueryResponse result; var endpoint = new IPEndPoint(IPAddress.Parse("8.8.8.8"), 53); var client = new LookupClient(endpoint); client.EnableAuditTrail = false; try { result = client.Query(extension, QueryType.NS); } catch (Exception e) { Console.WriteLine("ERROR\tException: " + endpoint.Address.ToString() + "\t" + e); return(false); } foreach (var NsRecord in result.Answers.NsRecords()) { var result2 = client.Query(NsRecord.NSDName, QueryType.A); if (result2.Answers.ARecords().Count() < 1) { return(false); } var ns = NsRecord.NSDName.ToString(); var ip = result2.Answers.ARecords()?.First()?.Address.ToString(); if (CheckSoaServer(extension, ip)) { //Console.WriteLine("Ajout de {0} , {1}", ns, ip); RootZone.Serveur serveur = new RootZone.Serveur { Queries = 0, Fails = 0, Ip = ip, Ns = ns }; RootZone.AddServer(extension, serveur); } //else Console.WriteLine("[DEBUG] Pas de SOA pour {0} sur {1}", extension, ip); } return(RootZone.ServerExists(extension)); }
/* * public static async Task<Data> IsNsRecordedAsync(string domain, int timeout, string dnsserver = null) * { * Data output = new Data(); * * byte[] bufferReceive = new byte[512]; * byte[] finalMessage = new byte[512]; * int currentId = 0; * int port = 0; * int rCode = 0; * ushort answerCount = 0; * ushort nsCount = 0; * bool? aaFlag = null; * int questionBytes = 0; * * DomainParser.Domain extension = DomainParser.DomainParser.Parse(domain); * * var items = domain.Split('.'); * if (extension.Extension == "") extension.Extension = items.Last(); * * currentId = Interlocked.Increment(ref _queryNumber); * if (RootZone.ServerExists(extension.Extension) && dnsserver != null) * { * RootZone.ServeursDns[extension.Extension].First(item => item.Ip == dnsserver).Queries++; * } * if (dnsserver == null) * { * output.log = "dnsserver is null"; * return output; * } * * var header = new byte[] { 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0 }; * var tail = new byte[] { 0, 0, 2, 0, 1 }; * unchecked * { * header[0] = (byte)(currentId >> 8); * header[1] = (byte)currentId; * } * * var tempMessage = header.AsEnumerable(); * * foreach (var item in items) * { * var itemBytes = Encoding.ASCII.GetBytes(item); * var itemLen = new[] { (byte)item.Length }; * tempMessage = tempMessage.Concat(itemLen).Concat(itemBytes); * } * * finalMessage = tempMessage.Concat(tail).ToArray(); * port = 15000 + (currentId % 50535); * * * using (var socket = new UdpClient()) * { * socket.Client.ReceiveTimeout = 500; * socket.ExclusiveAddressUse = true; * socket.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, false); * var selectedBind = _sortie[currentId % _sortie.Length]; * //var ipendpt = new IPEndPoint(selectedBind, port); * var ipendpt = new IPEndPoint(selectedBind, 0); * * var selectedServer = _dnsEndPoints[currentId % _dnsEndPoints.Length]; * if (dnsserver != null) * { * DnsServer.DnsServers = new string[] { dnsserver }; * selectedServer = new IPEndPoint(IPAddress.Parse(dnsserver), 53); * } * socket.Send(finalMessage, finalMessage.Length, selectedServer); * try * { * bufferReceive = socket.Receive(ref ipendpt); * //var tmp = await socket.ReceiveAsync().ConfigureAwait(false); * /* * var result = await Task.Run(() => * { * var task = socket.ReceiveAsync(); * task.Wait(timeout); * if (task.IsCompleted) * { return task.Result; } * throw new TimeoutException(); * }).ConfigureAwait(false); * * bufferReceive = result.Buffer; * * } * catch (Exception e) * { * output.log = "[ERREUR socket receive]\t" + dnsserver + "\t" + port + "\t" + e; * if (dnsserver != null) RootZone.ServeursDns[extension.Extension].First(item => item.Ip == dnsserver).Fails++; * return output; * } * finally * { * socket.Close(); * } * } * * bool areEqual = finalMessage.Take(2).ToArray().SequenceEqual(bufferReceive.Take(2).ToArray()); // true * rCode = bufferReceive[3] & 0xF; * aaFlag = (bufferReceive[2] & (1 << 6 - 1)) != 0; * answerCount = BitConverter.ToUInt16(bufferReceive.Skip(6).Take(2).Reverse().ToArray(), 0); * nsCount = BitConverter.ToUInt16(bufferReceive.Skip(8).Take(2).Reverse().ToArray(), 0); * questionBytes = (items.Count() + domain.Length) + 4; * * // 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0 * bool authorityPointer = bufferReceive.Skip(12 + questionBytes).Take(2).SequenceEqual(new byte[2] { (byte)192, (byte)12 }); * * if (dnsserver != null) * output.log = domain + "\tServer: " + dnsserver + "\taaFlag: " + aaFlag.ToString() + "\trCode: " + rCode + "\tanswerCount: " + Convert.ToString((int)answerCount) + "\tNSCOUNT: " + Convert.ToString((int)nsCount) + "\tPointer: " + authorityPointer.ToString() + "\t" + BitConverter.ToString(new byte[2] { (byte)192, (byte)12 }) + "\tDNS: " + BitConverter.ToString(bufferReceive.Skip(12 + questionBytes).Take(2).ToArray()); * else * output.log = domain + "\tServer: Google\taaFlag: " + aaFlag.ToString() + "\trCode: " + rCode + "\tanswerCount: " + Convert.ToString((int)answerCount) + "\tNSCOUNT: " + Convert.ToString((int)nsCount) + "\tDNS: " + BitConverter.ToString(bufferReceive.Skip(12 + questionBytes).Take(2).ToArray()); * * * // Je comprend pas, ça n'arrive jamais sous windoows, je n'ai ce comportement que sous linux avec mono... ca vient du core, du serveur , de sa config réseau? * if (areEqual == false) * { * output.success = false; * return output; * } * else output.success = true; * * * output.result = ((rCode == 0 && (answerCount > 1 || (nsCount > 1 && dnsserver != null && authorityPointer))) == true); * * return output; * } */ public static bool IsNsRecorded(string domain, string extension, int timeout, out bool result, out string log, string dnsserver = null) { result = false; log = ""; byte[] bufferReceive = new byte[512]; byte[] finalMessage = new byte[512]; int currentId = 0; int port = 0; int rCode = 0; ushort answerCount = 0; ushort nsCount = 0; bool? aaFlag = null; int questionBytes = 0; var items = domain.Split('.'); currentId = Interlocked.Increment(ref _queryNumber); if (RootZone.ServerExists(extension) && dnsserver != null) { RootZone.ServeursDns[extension].First(item => item.Ip == dnsserver).Queries++; } if (dnsserver == null) { return(false); } var header = new byte[] { 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0 }; var tail = new byte[] { 0, 0, 2, 0, 1 }; unchecked { header[0] = (byte)(currentId >> 8); header[1] = (byte)currentId; } var tempMessage = header.AsEnumerable(); foreach (var item in items) { var itemBytes = Encoding.ASCII.GetBytes(item); var itemLen = new[] { (byte)item.Length }; tempMessage = tempMessage.Concat(itemLen).Concat(itemBytes); } finalMessage = tempMessage.Concat(tail).ToArray(); port = 15000 + (currentId % 50535); using (var socket = new UdpClient()) //using (var socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)) { socket.Client.ReceiveTimeout = timeout; //socket.DontFragment = true; socket.ExclusiveAddressUse = true; socket.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, false); //socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, timeout); var selectedBind = _sortie[currentId % _sortie.Length]; //var ipendpt = new IPEndPoint(selectedBind, 45152 + (currentId % 16380)); var ipendpt = new IPEndPoint(selectedBind, port); //var ipendpt = new IPEndPoint(selectedBind, 0); var selectedServer = _dnsEndPoints[currentId % _dnsEndPoints.Length]; //var ipendpt = new IPEndPoint(selectedBind, port); //socket.Bind(ipendpt); //Console.WriteLine(domain + "\t / ip : " + ipendpt.Address + " port : " + ipendpt.Port); if (dnsserver != null) { DnsServer.DnsServers = new string[] { dnsserver }; selectedServer = new IPEndPoint(IPAddress.Parse(dnsserver), 53); } try { socket.Send(finalMessage, finalMessage.Length, selectedServer); //socket.SendTo(finalMessage, finalMessage.Length, SocketFlags.None, selectedServer); } catch (SocketException e) { Console.WriteLine(port + "\t" + e); socket.Close(); return(false); } try { bufferReceive = socket.Receive(ref ipendpt); //bufferReceive = await socket.ReceiveFromAsync(recvargs); //socket.Receive(bufferReceive); } catch (SocketException e) { socket.Close(); log = "[ERROR] Exception\t" + dnsserver + "\t" + e; var server = RootZone.ServeursDns[extension].FirstOrDefault(item => item.Ip == dnsserver); if (dnsserver != null && server != null) { server.Fails++; } return(false); } finally { socket.Close(); } } //Console.WriteLine("[DEBUG] Query {0}\t\t\tusing\t{1} {2} {3}", domain, dnsserver, RootZone.ServeursDns[extension.Extension].First(item => item.Ip == dnsserver).Ip, RootZone.ServeursDns[extension.Extension].First(item => item.Ip == dnsserver).Ns); bool areEqual = finalMessage.Take(2).ToArray().SequenceEqual(bufferReceive.Take(2).ToArray()); // true rCode = bufferReceive[3] & 0xF; aaFlag = (bufferReceive[2] & (1 << 6 - 1)) != 0; answerCount = BitConverter.ToUInt16(bufferReceive.Skip(6).Take(2).Reverse().ToArray(), 0); nsCount = BitConverter.ToUInt16(bufferReceive.Skip(8).Take(2).Reverse().ToArray(), 0); questionBytes = (items.Count() + domain.Length) + 4; // 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0 bool authorityPointer = bufferReceive.Skip(12 + questionBytes).Take(2).SequenceEqual(new byte[2] { (byte)192, (byte)12 }); if (dnsserver != null) { log = domain + "\tServer: " + dnsserver + "\taaFlag: " + aaFlag.ToString() + "\trCode: " + rCode + "\tanswerCount: " + Convert.ToString((int)answerCount) + "\tNSCOUNT: " + Convert.ToString((int)nsCount) + "\tPointer: " + authorityPointer.ToString() + "\t" + BitConverter.ToString(new byte[2] { (byte)192, (byte)12 }) + "\tDNS: " + BitConverter.ToString(bufferReceive.Skip(12 + questionBytes).Take(2).ToArray()); } else { log = domain + "\tServer: Google\taaFlag: " + aaFlag.ToString() + "\trCode: " + rCode + "\tanswerCount: " + Convert.ToString((int)answerCount) + "\tNSCOUNT: " + Convert.ToString((int)nsCount) + "\tDNS: " + BitConverter.ToString(bufferReceive.Skip(12 + questionBytes).Take(2).ToArray()); } /* Je comprend pas, ça n'arrive jamais sous windoows, je n'ai ce comportement que sous linux avec mono... ca vient du core, du serveur , de sa config réseau? */ if (areEqual == false) { WriteLog("[ERROR] Not Equal !", ConsoleColor.Red); //Console.WriteLine(domain + "\tQ:\t" + BitConverter.ToString(finalMessage.ToArray())); //Console.WriteLine(port + "\t" + currentId + "\t" + domain + "\tR:\t" + BitConverter.ToString(bufferReceive.ToArray())); //if (dnsserver != null) RootZone.ServeursDns[extension.Extension].First(item => item.Ip == dnsserver).Fails++; return(false); } result = false; if (rCode == 0 && (answerCount > 1 || (nsCount > 1 && dnsserver != null && authorityPointer))) { result = true; } return(true); }