3

Resolv::DNS が直接サポートされていないレコードをどのように処理するかをよりよく理解したいと思います。これらのレコードは Resolv::DNS::Resource::Generic クラスによって表されますが、このレコードからデータを取得する方法に関するドキュメントは見つかりませんでした。

具体的には、私のゾーンには SSHFP および TLSA レコードが含まれ、そのデータにアクセスする方法が必要です。

4

1 に答える 1

4

リバース エンジニアリングを通じて、私は答えを見つけました。他の人が見られるように、ここに文書化しました。

これには Resolv::DNS モジュールの文書化されていない機能が含まれており、実装は時間の経過とともに変更される可能性があることに注意してください。

Resolv::DNS モジュールが理解しないリソース レコードは、ジェネリック クラスではなく、名前が DNS 応答のタイプとクラスを表すサブクラスを通じて表されます。たとえば、SSHFP レコード (タイプ 44) が表されます。 Resolv::DNS::Resource::Generic::Type44_Class1として

このオブジェクトには、レコードの RDATA へのアクセスをプレーン バイナリ形式で提供する "data" メソッドが含まれます。

したがって、SSHFP レコードにアクセスするには、次のように取得します。

def handle_sshfp(rr) do
   # the RDATA is a string but contains binary data
   data = rr.data.bytes
   algo = data[0].to_s
   fptype = data[1].to_s
   fp = data[2..-1].to_s
   hex = fp.map{|b| b.to_s(16).rr.rjust(2,'0') }.join(':')
   puts "The SSHFP record is: #{fptype} #{algo} #{hex}"
end

Resolv::DNS.open do |dns|
   all_records = dns.getresources('myfqdn.example.com', Resolv::DNS::Resource::IN::ANY ) rescue nil
   all_records.each do |rr|
      if rr.is_a? Resolv::DNS::Resource::Generic then
         classname = rr.class.name.split('::').last
         handle_sshfp(rr) if classname == "Type44_Class1"
      end
   end
end
于 2015-03-11T04:34:49.763 に答える