2016-09-22 44 views
0

如何在Delphi中使用Indy查找DNS记录?例如,SRV记录,SPF记录,TEXT记录等如何在delphi中查找带有indy的dns记录

我知道我们可以直接使用nslookup从Windows,但我想用印,或任何其他Delphi组件来做到这一点。

我试图寻找谷歌,我发现这样的事情:

function ReverseDNSLookup(IPAddress: String; DNSServer: String = 
SDefaultDNS; Timeout: Integer = 30; Retries: Integer = 3) : string; 
var 
    AIdDNSResolver: TIdDNSResolver; 
    RetryCount: Integer; 
begin 
    Result := ''; 
    IPAddress := ReverseIP(IPAddress); 

    AIdDNSResolver := TIdDNSResolver.Create(nil); 
    try 
    AIdDNSResolver.QueryResult.Clear; 
    AIdDNSResolver.WaitingTime := Timeout; 
    AIdDNSResolver.QueryType := [qtPTR]; 
    AIdDNSResolver.Host := DNSServer; 

    RetryCount := Retries; 
    repeat 
     try 
     dec(RetryCount); 

     AIdDNSResolver.Resolve(IPAddress); 

     Break; 
     except 
     on e: Exception do 
     begin 
      if RetryCount <= 0 then 
      begin 
    //   if SameText(e.Message, RSCodeQueryName) then 
    //    Result := FALSE 
    //   else 
        raise Exception.Create(e.Message); 
      Break; 
      end; 
     end; 
     end; 
    until false; 

    if AIdDNSResolver.QueryResult.Count > 0 then 
     Result := AIdDNSResolver.QueryResult.DomainName; 
    finally 
    FreeAndNil(AIdDNSResolver); 
    end; 
end; 

但是,所有它是被查找IP地址。我想要SRVTEXT记录,也许SPF记录。

回答

1

TIdDNSResolver是你在找什么。您展示的示例仅使用TIdDNSResolver支持的一小部分。您只需设置TIdDNSResolver.QueryType属性以指定要查询的记录类型,然后循环访问TIdDNSResolver.QueryResult集合以访问单个记录。 TIdDNSResolver支持SRVTXT记录,例如:

var 
    DNS: TIdDNSResolver; 
    I: Integer; 
    Record: TResultRecord; 
    Txt: TTextRecord; 
    Srv: TSRVRecord; 
begin 
    DNS := TIdDNSResolver.Create(nil); 
    try 
    DNS.WaitingTime := Timeout; 
    DNS.QueryType := [qtTXT, qtService]; 
    DNS.Host := 'some.dns.server'; 

    DNS.Resolve('some.hostname'); 

    for I := 0 to DNS.QueryResult.Count -1 do 
    begin 
     Record := DNS.QueryResult[I]; 
     case Record.RecType of 
     begin 
     qtTXT: begin 
      Txt := TTextRecord(Record); 
      // use Txt.Text as needed... 
     end; 
     qtService: begin 
      Srv := TSRVRecord(Record); 
      // use Srv.OriginalName, Srv.Service, Srv.Protocol, etc as needed... 
     end; 
     else 
     // something else... 
     end; 
    end; 
    finally 
    DNS.Free; 
    end; 
end; 

TIdDNSResolver支持SPF记录类型(码99)在RFC 4408于2006年定义的:

本文档定义了一个新类型为SPF的DNS RR,代码为99.此类型的格式与TXT RR [RFC1035]相同。对于任何一种类型,记录的字符内容都被编码为[US-ASCII]。

人们认识到,目前的做法(使用TXT记录)并不是最优的,但它是必要的,因为有许多常用的DNS服务器和解析器实现无法处理新的RR类型。双记录类型方案为使用为此目的保留的RR类型提供了更好的解决方案的前进途径。

该记录类型后来RFC 7208在2014年废弃:

SPF记录必须发布为DNS TXT(16型)资源记录(RR)[RFC1035]只。记录的字符内容编码为[US-ASCII]。 SPF实验阶段支持使用替代DNS RR类型,但已停用。

在2003年,首次被开发SPF时,新的DNS RR类型的应用的要求是相当严格的多比现在。此外,支持易于部署新的DNS RR类型的DNS服务器和配置系统尚未广泛部署。因此,SPF的开发人员发现使用TXT RR类型为SPF记录更容易和更实用。

SPFbis工作组在审查[RFC4408]时得出结论,认为它的双RR类型转换模型存在根本上的缺陷,因为它没有包含实施者需要检查和检查的常见RR类型。许多替代方案被认为可以解决这个问题,但最终工作组得出结论认为,在可预见的未来,向SPF RR类型的重大迁移是不太可能的,而解决这一互操作性问题的最佳解决方案是从SPF RR类型SPF版本1.请参阅[RFC6686]的附录A获取更多信息。

十年前SPF最初部署的情况是独一无二的。如果开发了未重新使用现有SPF记录的未来SPF更新,则可以使用SPF RR类型。 SPF将TXT RR类型用于结构化数据决不应成为未来协议设计人员的先例。有关使用新的DNS RR类型的设计注意事项的进一步讨论,请参见[RFC5507]。