2016-09-22 6 views
0

DelphiでIndyでDNSレコードを検索するにはどうすればよいですか?例えば、SRV記録、SPF記録、TEXT記録などデルファイでindyを使用してDNSレコードを検索する方法

私たちは、Windowsから直接nslookupを使用することができます知っているが、私はインディ、または任意の他のDelphiのコンポーネントでこれをやりたいです。

私はGoogleの検索試みたが、私はこのようなものが見つかりました:

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は、2006年にRFC 4408で定義されたないサポートSPFレコード型(コード99)ん:

この文書は、新しいを定義しますこのタイプのフォーマットはTXT RR [RFC1035]と同じです。どちらのタイプでも、レコードの文字内容は[US-ASCII]としてエンコードされます。

TXTレコードを使用する現在の方法は最適ではありませんが、新しいRRタイプを処理できない多くのDNSサーバーとリゾルバの実装が一般的に使用されているため必要です。 2レコード・タイプ・スキームは、この目的のために予約されたRRタイプを使用するより良い解決法への順方向経路を提供する。

レコードタイプは、後2014年に RFC 7208によって廃止されたこと

SPFレコードがDNS TXT(タイプ16)リソースレコード(RR)[RFC1035]としてのみ公開されなければなりません。レコードの文字内容は[US-ASCII]としてエンコードされます。代替DNS RRタイプの使用はSPFの実験段階でサポートされましたが、中止されました。

SPFが最初に開発された2003年に、新しいDNS RRタイプの割り当て要件は、現在よりもはるかに厳しいものでした。さらに、新しいDNS RRタイプの容易な展開のサポートは、DNSサーバーおよびプロビジョニングシステムに広く展開されていませんでした。その結果、SPFの開発者は、SPFレコードにTXT RRタイプを使用する方が簡単で実用的であることがわかりました。

[RFC4408]のレビューでは、SPFbisワーキンググループは、デュアルRRタイプの移行モデルには、実装する必要がありチェックする必要がある共通のRRタイプが含まれていないため根本的に欠陥があると結論付けました。多くの代替案がこの問題を解決すると考えられていましたが、最終的にワーキンググループは、近い将来にSPF RRタイプに移行する可能性は非常に低く、この相互運用性の問題を解決する最善の解決策は、SPF RRタイプのサポートを詳細は、[RFC6686]の付録Aを参照してください。

10年前のSPFの最初の展開を取り巻く状況はユニークです。既存のSPFレコードを再利用しなかったSPFの将来のアップデートが開発された場合、SPF RRタイプを使用できます。構造化されたデータに対するSPFのTXT RRタイプの使用は、決して将来のプロトコル設計者の前例として行われるべきではありません。新しいDNS RRタイプを使用する際の設計上の考慮事項についてのさらなる議論は、[RFC5507]に見出すことができます。

関連する問題