public static void DNSNAPTRRecordLookup(string host, bool async, ref SIPDNSLookupResult lookupResult) { SIPMonitorLogEvent(new SIPMonitorConsoleEvent(SIPMonitorServerTypesEnum.Unknown, SIPMonitorEventTypesEnum.DNS, "SIP DNS NAPTR record lookup initiated for " + host + ".", null)); // Target is a hostname with no explicit port, DNS lookup for NAPTR records. DNSResponse naptrRecordResponse = DNSManager.Lookup(host, DNSQType.NAPTR, DNS_LOOKUP_TIMEOUT, null, true, async); if (naptrRecordResponse == null && async) { lookupResult.Pending = true; } else if (naptrRecordResponse.Timedout) { lookupResult.NAPTRTimedoutAt = DateTime.Now; } else if (naptrRecordResponse.Error == null && naptrRecordResponse.RecordNAPTR != null && naptrRecordResponse.RecordNAPTR.Length > 0) { foreach (RecordNAPTR naptrRecord in naptrRecordResponse.RecordNAPTR) { SIPDNSServiceResult sipNAPTRResult = new SIPDNSServiceResult(SIPServices.GetService(naptrRecord.Service), naptrRecord.Order, 0, naptrRecord.RR.TTL, naptrRecord.Replacement, 0, DateTime.Now); lookupResult.AddNAPTRResult(sipNAPTRResult); SIPMonitorLogEvent(new SIPMonitorConsoleEvent(SIPMonitorServerTypesEnum.Unknown, SIPMonitorEventTypesEnum.DNS, "SIP DNS NAPTR record found for " + host + ", result " + naptrRecord.Service + " " + naptrRecord.Replacement + ".", null)); } } else { SIPMonitorLogEvent(new SIPMonitorConsoleEvent(SIPMonitorServerTypesEnum.Unknown, SIPMonitorEventTypesEnum.DNS, "SIP DNS no NAPTR records found for " + host + ".", null)); } }
public void LookupAAAARecordMethod() { logger.LogDebug("--> " + System.Reflection.MethodBase.GetCurrentMethod().Name); logger.BeginScope(System.Reflection.MethodBase.GetCurrentMethod().Name); DNSResponse result = DNSManager.Lookup("www.google.com", QType.AAAA, 10, null, false, false); foreach (var aaaaResult in result.RecordsAAAA) { logger.LogDebug($"AAAA Lookup result {aaaaResult.ToString()}."); } // Three's no guarantee that a particular DNS server will return AAAA records. The AppVeyor // macos vm is hooked up to a DNS that does not return AAAA records. // worker - 628 - 002:sipsorcery - jyl3x appveyor$ dig AAAA www.gooogle.com // // ; <<>> DiG 9.10.6 <<>> AAAA www.gooogle.com // ; ; global options: +cmd // ; ; Got answer: // ; ; ->> HEADER << -opcode: QUERY, status: NOERROR, id: 8102 // ; ; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0 // // ; ; QUESTION SECTION: // ; www.gooogle.com.IN AAAA // // ; ; Query time: 24 msec // ; ; SERVER: 10.211.55.1#53(10.211.55.1) // ; ; WHEN: Wed Jun 10 05:56:30 CDT 2020 // ; ; MSG SIZE rcvd: 33 //Assert.NotEmpty(result.RecordsAAAA); //Assert.True(result.RecordsAAAA[0].Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetworkV6); }
public void LookupAnyRecordAsyncCacheTest() { logger.LogDebug("--> " + System.Reflection.MethodBase.GetCurrentMethod().Name); logger.BeginScope(System.Reflection.MethodBase.GetCurrentMethod().Name); //1.queue dns lookup for async resolution DNSResponse result = DNSManager.Lookup("dns.google", QType.ANY, 1, null, false, true); Assert.Null(result); System.Threading.Thread.Sleep(500); //2.check lookup / resolution cache for result result = DNSManager.Lookup("dns.google", QType.ANY, 150, null, true, false); Assert.NotNull(result); Assert.NotEmpty(result.RecordsA); var ipv4Addresses = from a in result.RecordsA select a.Address; Assert.NotEmpty(ipv4Addresses); Assert.Contains(IPSocket.ParseSocketString("8.8.8.8").Address, ipv4Addresses); Assert.Contains(IPSocket.ParseSocketString("8.8.4.4").Address, ipv4Addresses); Assert.NotEmpty(result.RecordsAAAA); var ipv6Addresses = from a in result.RecordsAAAA select a.Address; Assert.NotEmpty(ipv6Addresses); Assert.Contains(IPSocket.ParseSocketString("2001:4860:4860::8888").Address, ipv6Addresses); Assert.Contains(IPSocket.ParseSocketString("2001:4860:4860::8844").Address, ipv6Addresses); }
public void LookupARecordMethod() { logger.LogDebug(System.Reflection.MethodBase.GetCurrentMethod().Name); DNSResponse result = DNSManager.Lookup("www.sipsorcery.com", QType.A, 10, null, false, false); logger.LogDebug($"Lookup result {result.RecordsA[0].Address}."); Assert.AreEqual(result.RecordsA[0].Address.ToString(), "67.222.131.148"); }
public void LookupAAAARecordMethod() { logger.LogDebug(System.Reflection.MethodBase.GetCurrentMethod().Name); DNSResponse result = DNSManager.Lookup("www.google.com", QType.AAAA, 10, null, false, false); foreach (var aaaaResult in result.RecordsAAAA) { logger.LogDebug($"AAAA Lookup result {aaaaResult.ToString()}."); } Assert.IsTrue(result.RecordsAAAA.Length > 0); }
public void LookupSrvRecordMethod() { logger.LogDebug(System.Reflection.MethodBase.GetCurrentMethod().Name); DNSResponse result = DNSManager.Lookup(SIPDNSConstants.SRV_SIP_UDP_QUERY_PREFIX + "sipsorcery.com", QType.SRV, 10, null, false, false); foreach (var srvResult in result.RecordSRV) { logger.LogDebug($"SRV Lookup result {srvResult.ToString()}."); } Assert.AreEqual(result.RecordSRV.Length, 1); Assert.AreEqual(result.RecordSRV.First().TARGET, "sip.sipsorcery.com."); }
public void LookupAAAARecordMethod() { logger.LogDebug("--> " + System.Reflection.MethodBase.GetCurrentMethod().Name); logger.BeginScope(System.Reflection.MethodBase.GetCurrentMethod().Name); DNSResponse result = DNSManager.Lookup("www.google.com", QType.AAAA, 10, null, false, false); foreach (var aaaaResult in result.RecordsAAAA) { logger.LogDebug($"AAAA Lookup result {aaaaResult.ToString()}."); } Assert.NotEmpty(result.RecordsAAAA); Assert.True(result.RecordsAAAA[0].Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetworkV6); }
public static SIPDNSLookupResult DNSAAAARecordLookup(string host, int port, bool async, SIPURI uri, SIPDNSLookupResult lookupResult = null) { SIPMonitorLogEvent(new SIPMonitorConsoleEvent(SIPMonitorServerTypesEnum.Unknown, SIPMonitorEventTypesEnum.DNS, "SIP DNS A record lookup requested for " + host + ".", null)); SIPDNSLookupResult result = lookupResult ?? new SIPDNSLookupResult(uri); result.LookupError = null; DNSResponse aaaaRecordResponse = DNSManager.Lookup(host, QType.AAAA, DNS_A_RECORD_LOOKUP_TIMEOUT, null, true, async); if (aaaaRecordResponse == null) { if (async) { result.Pending = true; } } else if (aaaaRecordResponse.Timedout) { result.ATimedoutAt = DateTime.Now; } else if (!string.IsNullOrWhiteSpace(aaaaRecordResponse.Error)) { result.LookupError = aaaaRecordResponse.Error; } else if (aaaaRecordResponse.RecordsAAAA == null || aaaaRecordResponse.RecordsAAAA.Length == 0) { SIPMonitorLogEvent(new SIPMonitorConsoleEvent(SIPMonitorServerTypesEnum.Unknown, SIPMonitorEventTypesEnum.DNS, "SIP DNS no AAAA records found for " + host + ".", null)); result.LookupError = "No AAAA records found for " + host + "."; } else { SIPURI sipURI = result.URI; foreach (RecordAAAA aRecord in aaaaRecordResponse.RecordsAAAA) { SIPDNSLookupEndPoint sipLookupEndPoint = new SIPDNSLookupEndPoint(new SIPEndPoint(sipURI.Protocol, new IPEndPoint(aRecord.Address, port)), aRecord.RR.TTL); result.AddLookupResult(sipLookupEndPoint); SIPMonitorLogEvent(new SIPMonitorConsoleEvent(SIPMonitorServerTypesEnum.Unknown, SIPMonitorEventTypesEnum.DNS, "SIP DNS AAAA record found for " + host + ", result " + sipLookupEndPoint.LookupEndPoint.ToString() + ".", null)); } } return(result); }
public void LookupAnyRecordTest() { logger.LogDebug("--> " + System.Reflection.MethodBase.GetCurrentMethod().Name); logger.BeginScope(System.Reflection.MethodBase.GetCurrentMethod().Name); DNSResponse result = DNSManager.Lookup("dns.google", QType.ANY, 100, null, false, false); Assert.NotNull(result); Assert.NotEmpty(result.RecordsA); var ipv4Addresses = from a in result.RecordsA select a.Address; Assert.NotEmpty(ipv4Addresses); Assert.Contains(IPSocket.ParseSocketString("8.8.8.8").Address, ipv4Addresses); Assert.Contains(IPSocket.ParseSocketString("8.8.4.4").Address, ipv4Addresses); Assert.NotEmpty(result.RecordsAAAA); var ipv6Addresses = from a in result.RecordsAAAA select a.Address; Assert.NotEmpty(ipv6Addresses); Assert.Contains(IPSocket.ParseSocketString("2001:4860:4860::8888").Address, ipv6Addresses); Assert.Contains(IPSocket.ParseSocketString("2001:4860:4860::8844").Address, ipv6Addresses); }
public static void DNSSRVRecordLookup(SIPSchemesEnum scheme, SIPProtocolsEnum protocol, string host, bool async, ref SIPDNSLookupResult lookupResult) { SIPServicesEnum reqdNAPTRService = SIPServicesEnum.none; if (scheme == SIPSchemesEnum.sip && protocol == SIPProtocolsEnum.udp) { reqdNAPTRService = SIPServicesEnum.sipudp; } else if (scheme == SIPSchemesEnum.sip && protocol == SIPProtocolsEnum.tcp) { reqdNAPTRService = SIPServicesEnum.siptcp; } else if (scheme == SIPSchemesEnum.sips && protocol == SIPProtocolsEnum.tcp) { reqdNAPTRService = SIPServicesEnum.sipstcp; } else if (scheme == SIPSchemesEnum.sip && protocol == SIPProtocolsEnum.tls) { reqdNAPTRService = SIPServicesEnum.siptls; } // If there are NAPTR records available see if there is a matching one for the SIP scheme and protocol required. SIPDNSServiceResult naptrService = null; if (lookupResult.SIPNAPTRResults != null && lookupResult.SIPNAPTRResults.Count > 0) { if (reqdNAPTRService != SIPServicesEnum.none && lookupResult.SIPNAPTRResults.ContainsKey(reqdNAPTRService)) { naptrService = lookupResult.SIPNAPTRResults[reqdNAPTRService]; } } // Construct the SRV target to lookup depending on whether an NAPTR record was available or not. string srvLookup = null; if (naptrService != null) { srvLookup = naptrService.Data; } else { srvLookup = "_" + scheme.ToString() + "._" + protocol.ToString() + "." + host; } SIPMonitorLogEvent(new SIPMonitorConsoleEvent(SIPMonitorServerTypesEnum.Unknown, SIPMonitorEventTypesEnum.DNS, "SIP DNS SRV record lookup requested for " + srvLookup + ".", null)); DNSResponse srvRecordResponse = DNSManager.Lookup(srvLookup, DNSQType.SRV, DNS_LOOKUP_TIMEOUT, null, true, async); if (srvRecordResponse == null && async) { SIPMonitorLogEvent(new SIPMonitorConsoleEvent(SIPMonitorServerTypesEnum.Unknown, SIPMonitorEventTypesEnum.DNS, "SIP DNS SRV record lookup pending for " + srvLookup + ".", null)); lookupResult.Pending = true; } else if (srvRecordResponse.Timedout) { SIPMonitorLogEvent(new SIPMonitorConsoleEvent(SIPMonitorServerTypesEnum.Unknown, SIPMonitorEventTypesEnum.DNS, "SIP DNS SRV record lookup timed out for " + srvLookup + ".", null)); lookupResult.SRVTimedoutAt = DateTime.Now; } else if (srvRecordResponse.Error != null) { SIPMonitorLogEvent(new SIPMonitorConsoleEvent(SIPMonitorServerTypesEnum.Unknown, SIPMonitorEventTypesEnum.DNS, "SIP DNS SRV record lookup for " + srvLookup + " returned error of " + lookupResult.LookupError + ".", null)); } else if (srvRecordResponse.Error == null && srvRecordResponse.RecordSRV != null && srvRecordResponse.RecordSRV.Length > 0) { foreach (RecordSRV srvRecord in srvRecordResponse.RecordSRV) { SIPDNSServiceResult sipSRVResult = new SIPDNSServiceResult(reqdNAPTRService, srvRecord.Priority, srvRecord.Weight, srvRecord.RR.TTL, srvRecord.Target, srvRecord.Port, DateTime.Now); lookupResult.AddSRVResult(sipSRVResult); SIPMonitorLogEvent(new SIPMonitorConsoleEvent(SIPMonitorServerTypesEnum.Unknown, SIPMonitorEventTypesEnum.DNS, "SIP DNS SRV record found for " + srvLookup + ", result " + srvRecord.Target + " " + srvRecord.Port + ".", null)); } } else { SIPMonitorLogEvent(new SIPMonitorConsoleEvent(SIPMonitorServerTypesEnum.Unknown, SIPMonitorEventTypesEnum.DNS, "SIP DNS no SRV records found for " + srvLookup + ".", null)); } }
public static void DNSSRVRecordLookup(SIPSchemesEnum scheme, SIPProtocolsEnum protocol, string host, bool async, ref SIPDNSLookupResult lookupResult) { SIPServicesEnum reqdNAPTRService = SIPServicesEnum.none; if (scheme == SIPSchemesEnum.sip && protocol == SIPProtocolsEnum.udp) { reqdNAPTRService = SIPServicesEnum.sipudp; } else if (scheme == SIPSchemesEnum.sip && protocol == SIPProtocolsEnum.tcp) { reqdNAPTRService = SIPServicesEnum.siptcp; } else if (scheme == SIPSchemesEnum.sips && protocol == SIPProtocolsEnum.tcp) { reqdNAPTRService = SIPServicesEnum.sipstcp; } //rj2 2018-10-17: this looks wrong, but the www says: if sips then protocol is _tcp not _tls else if (scheme == SIPSchemesEnum.sips && protocol == SIPProtocolsEnum.tls) { reqdNAPTRService = SIPServicesEnum.sipstcp; } else if (scheme == SIPSchemesEnum.sip && protocol == SIPProtocolsEnum.tls) { reqdNAPTRService = SIPServicesEnum.siptls; } // If there are NAPTR records available see if there is a matching one for the SIP scheme and protocol required. // this works best (only works) if protocol in sip-uri matches sip-service of NAPTRRecord SIPDNSServiceResult naptrService = null; if (lookupResult.SIPNAPTRResults != null && lookupResult.SIPNAPTRResults.Count > 0) { if (reqdNAPTRService != SIPServicesEnum.none && lookupResult.SIPNAPTRResults.ContainsKey(reqdNAPTRService)) { naptrService = lookupResult.SIPNAPTRResults[reqdNAPTRService]; } } // Construct the SRV target to lookup depending on whether an NAPTR record was available or not. string srvLookup = null; if (naptrService != null) { srvLookup = naptrService.Data; } else { if (scheme == SIPSchemesEnum.sips) { srvLookup = SIPDNSConstants.SRV_SIPS_TCP_QUERY_PREFIX + host; } else { srvLookup = "_" + scheme.ToString() + "._" + protocol.ToString() + "." + host; } } SIPMonitorLogEvent(new SIPMonitorConsoleEvent(SIPMonitorServerTypesEnum.Unknown, SIPMonitorEventTypesEnum.DNS, "SIP DNS SRV record lookup requested for " + srvLookup + ".", null)); DNSResponse srvRecordResponse = DNSManager.Lookup(srvLookup, QType.SRV, DNS_LOOKUP_TIMEOUT, null, true, async); if (srvRecordResponse == null && async) { SIPMonitorLogEvent(new SIPMonitorConsoleEvent(SIPMonitorServerTypesEnum.Unknown, SIPMonitorEventTypesEnum.DNS, "SIP DNS SRV record lookup pending for " + srvLookup + ".", null)); lookupResult.Pending = true; } else if (srvRecordResponse.Timedout) { SIPMonitorLogEvent(new SIPMonitorConsoleEvent(SIPMonitorServerTypesEnum.Unknown, SIPMonitorEventTypesEnum.DNS, "SIP DNS SRV record lookup timed out for " + srvLookup + ".", null)); lookupResult.SRVTimedoutAt = DateTime.Now; } else if (!string.IsNullOrWhiteSpace(srvRecordResponse.Error)) { SIPMonitorLogEvent(new SIPMonitorConsoleEvent(SIPMonitorServerTypesEnum.Unknown, SIPMonitorEventTypesEnum.DNS, "SIP DNS SRV record lookup for " + srvLookup + " returned error of " + lookupResult.LookupError + ".", null)); } else if (string.IsNullOrWhiteSpace(srvRecordResponse.Error) && srvRecordResponse.RecordSRV != null && srvRecordResponse.RecordSRV.Length > 0) { foreach (RecordSRV srvRecord in srvRecordResponse.RecordSRV) { SIPDNSServiceResult sipSRVResult = new SIPDNSServiceResult(reqdNAPTRService, srvRecord.PRIORITY, srvRecord.WEIGHT, srvRecord.RR.TTL, srvRecord.TARGET, srvRecord.PORT, DateTime.Now); lookupResult.AddSRVResult(sipSRVResult); SIPMonitorLogEvent(new SIPMonitorConsoleEvent(SIPMonitorServerTypesEnum.Unknown, SIPMonitorEventTypesEnum.DNS, "SIP DNS SRV record found for " + srvLookup + ", result " + srvRecord.TARGET + " " + srvRecord.PORT + ".", null)); } } else { SIPMonitorLogEvent(new SIPMonitorConsoleEvent(SIPMonitorServerTypesEnum.Unknown, SIPMonitorEventTypesEnum.DNS, "SIP DNS no SRV records found for " + srvLookup + ".", null)); } }
public static SIPDNSLookupResult DNSNameRecordLookup(string host, int port, bool async, SIPURI uri, SIPDNSLookupResult lookupResult = null, bool?preferIPv6 = null, int recursionLevel = 0) { SIPMonitorLogEvent(new SIPMonitorConsoleEvent(SIPMonitorServerTypesEnum.Unknown, SIPMonitorEventTypesEnum.DNS, "SIP DNS Name record lookup requested for " + host + ".", null)); SIPDNSLookupResult result = lookupResult ?? new SIPDNSLookupResult(uri); result.LookupError = null; if (UseANYLookups) { DNSResponse aRecordResponse = DNSManager.Lookup(host, QType.ANY, DNS_A_RECORD_LOOKUP_TIMEOUT, null, true, async); if (aRecordResponse == null && async) { result.Pending = true; } else if (aRecordResponse == null) { } else if (aRecordResponse.Timedout) { result.ATimedoutAt = DateTime.Now; } else if (!string.IsNullOrWhiteSpace(aRecordResponse.Error)) { result.LookupError = aRecordResponse.Error; } else if ((aRecordResponse.RecordsAAAA == null || aRecordResponse.RecordsAAAA.Length == 0) && (aRecordResponse.RecordsA == null || aRecordResponse.RecordsA.Length == 0) && (aRecordResponse.RecordsCNAME == null || aRecordResponse.RecordsCNAME.Length == 0)) { SIPMonitorLogEvent(new SIPMonitorConsoleEvent(SIPMonitorServerTypesEnum.Unknown, SIPMonitorEventTypesEnum.DNS, "SIP DNS no CNAME, A or AAAA records found for " + host + ".", null)); result.LookupError = "No CNAME, A or AAAA records found for " + host + "."; } else { if (preferIPv6 == null) { preferIPv6 = SIPDNSManager.PreferIPv6NameResolution; } foreach (RecordCNAME aRecord in aRecordResponse.RecordsCNAME) { //CNAME could be another CNAME or A/AAAA Record -> max 3 levels recursive name resolution if (recursionLevel < 3) { SIPDNSLookupResult resultCName = DNSNameRecordLookup(aRecord.CNAME, port, async, uri, lookupResult, preferIPv6, recursionLevel + 1); if (resultCName != null) { foreach (SIPDNSLookupEndPoint ep in resultCName.EndPointResults) { result.AddLookupResult(ep); } } } } if (preferIPv6 == true) { SIPURI sipURI = result.URI; foreach (RecordAAAA aRecord in aRecordResponse.RecordsAAAA) { SIPDNSLookupEndPoint sipLookupEndPoint = new SIPDNSLookupEndPoint(new SIPEndPoint(sipURI.Protocol, new IPEndPoint(aRecord.Address, port)), aRecord.RR.TTL); result.AddLookupResult(sipLookupEndPoint); SIPMonitorLogEvent(new SIPMonitorConsoleEvent(SIPMonitorServerTypesEnum.Unknown, SIPMonitorEventTypesEnum.DNS, "SIP DNS AAAA record found for " + host + ", result " + sipLookupEndPoint.LookupEndPoint.ToString() + ".", null)); } foreach (RecordA aRecord in aRecordResponse.RecordsA) { SIPDNSLookupEndPoint sipLookupEndPoint = new SIPDNSLookupEndPoint(new SIPEndPoint(sipURI.Protocol, new IPEndPoint(aRecord.Address, port)), aRecord.RR.TTL); result.AddLookupResult(sipLookupEndPoint); SIPMonitorLogEvent(new SIPMonitorConsoleEvent(SIPMonitorServerTypesEnum.Unknown, SIPMonitorEventTypesEnum.DNS, "SIP DNS A record found for " + host + ", result " + sipLookupEndPoint.LookupEndPoint.ToString() + ".", null)); } } else { SIPURI sipURI = result.URI; foreach (RecordA aRecord in aRecordResponse.RecordsA) { SIPDNSLookupEndPoint sipLookupEndPoint = new SIPDNSLookupEndPoint(new SIPEndPoint(sipURI.Protocol, new IPEndPoint(aRecord.Address, port)), aRecord.RR.TTL); result.AddLookupResult(sipLookupEndPoint); SIPMonitorLogEvent(new SIPMonitorConsoleEvent(SIPMonitorServerTypesEnum.Unknown, SIPMonitorEventTypesEnum.DNS, "SIP DNS A record found for " + host + ", result " + sipLookupEndPoint.LookupEndPoint.ToString() + ".", null)); } foreach (RecordAAAA aRecord in aRecordResponse.RecordsAAAA) { SIPDNSLookupEndPoint sipLookupEndPoint = new SIPDNSLookupEndPoint(new SIPEndPoint(sipURI.Protocol, new IPEndPoint(aRecord.Address, port)), aRecord.RR.TTL); result.AddLookupResult(sipLookupEndPoint); SIPMonitorLogEvent(new SIPMonitorConsoleEvent(SIPMonitorServerTypesEnum.Unknown, SIPMonitorEventTypesEnum.DNS, "SIP DNS AAAA record found for " + host + ", result " + sipLookupEndPoint.LookupEndPoint.ToString() + ".", null)); } } } } if (result.LookupError != null || result.EndPointResults == null || result.EndPointResults.Count == 0) { if (preferIPv6 == true) { result = DNSAAAARecordLookup(host, port, async, uri, lookupResult); } else { result = DNSARecordLookup(host, port, async, uri, lookupResult); } } return(result); }