DNSテスト自動化 in Ruby

DNSのテストといえば相場はdigかnslookupと決まってるわけですが、毎回手で打つのも癪なので自動化しましょ、というお話。
シェルスクリプトが未だ書けないおばかなのでRubyでごにょごにょする方法。

dnsrubyのインストール

rubygemsにはnet-dnsやらpNet-DNSやらいくつかDNS向けっぽいパッケージが転がっていますが、主にDNSSEC対応がある程度出来ているという理由で"dnsruby"を採用。まぎらわしいことに"Dnsruby"とかいうのもあるので注意。

% sudo gem search -r dnsruby

*** REMOTE GEMS ***

dnsruby (1.52)
Dnsruby (1.0)      <= まぎらわしい

% sudo gem install dnsruby

とりあえず書いてみる

  1 require "rubygems"
  2 require "dnsruby"
  3 
  4 TARGETNAME="twitter.com"
  5 NAMESERVER="8.8.8.8"
  6 
  7 resolver = Dnsruby::Resolver.new(:nameserver=>NAMESERVER)
  8 
  9 answers = resolver.query(TARGETNAME).answer
 10 answers.each do |answer|
 11   print "#{answer.type.to_s} : #{answer.to_s}\n"
 12 end
 13                      

これを実行するとこんな出力が得られる

 % ruby test.rb
A : twitter.com.	29	IN	A	199.59.148.10
A : twitter.com.	29	IN	A	199.59.149.198
A : twitter.com.	29	IN	A	199.59.148.82

細かくいろいろ

他にも

  • クエリのタイプを指定したり
  • DNSキャッシュを切ったり
  • DNSSECを有効化したり
  1 require "rubygems"
  2 require "dnsruby"
  3 
  4 TARGETNAME="jprs.co.jp"
  5 NAMESERVER="8.8.8.8"
  6 
  7 resolver = Dnsruby::Resolver.new(:nameserver=>NAMESERVER)
  8 
  9 # キャッシュとかいらないですしおすし
 10 resolver.do_caching = false
 11 
 12 # DNSSEC有効化 ( デフォルトtrue )
 13 resolver.dnssec = true
 14
 15 recvmsg = resolver.query(TARGETNAME, Dnsruby::Types.AAAA) # レコードタイプの指定
 16 
 17 # DNSSECで投げたクエリに対する応答の検証結果
 18 print "verified? : #{recvmsg.verified?}\n"                                                                                                                                                                                                                                  
 19                     
 20 recvmsg.answer.each do |record|
 21   print "#{record.type.to_s} "
 22   if record.type == Dnsruby::Types.AAAA then
 23     print ": #{record.address}\n"
 24   elsif record.type == Dnsruby::Types.RRSIG then
 25     print ": #{record.type_covered.to_s}, #{record.algorithm}, #{record.signature}\n"
 26   end               
 27 end              

これを実行するとこんな感じ

% ruby test.rb
verified? : false
AAAA : 2001:DF0:8:7::80
RRSIG : AAAA, RSASHA256, Z??*??(?{??%??Y?n?1d?m&#1409;bpkO?r&mDk р?6?(???|?
zs

  ?OΔJ.??7}?&????k?&#1946;?X~??=<;?dh?J,?? ?a I?Yx??J?=?&#1744;???&#1573;J5??l

シグネチャ表示してる当たりはまぁ化け化けですね…

ちなみにここで検証の結果が失敗しているのはjprsとかぐーぐるがさぼってるからではなく、ここ*1の注意書きにあるようにこちらがわでいろいろやらねばならぬところをサボってるからと思われます。recvmsg.security_levelをみてみると以下のようになっており、そもそも検証自体が行われていないのでした。残念。

>> recvmsg.security_level
=> UNCHECKED