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ցbpkO?r&mDk р?6?(???|? zs ?OΔJ.??7}?&????k?ޚ?X~??=<;?dh?J,?? ?a I?Yx??J?=?ې???إJ5??l
シグネチャ表示してる当たりはまぁ化け化けですね…
ちなみにここで検証の結果が失敗しているのはjprsとかぐーぐるがさぼってるからではなく、ここ*1の注意書きにあるようにこちらがわでいろいろやらねばならぬところをサボってるからと思われます。recvmsg.security_levelをみてみると以下のようになっており、そもそも検証自体が行われていないのでした。残念。
>> recvmsg.security_level
=> UNCHECKED